# Frage zu Processing



## Polskaplaya123 (1. Jun 2010)

Hey
ich habe ein Problem, ich wollte das spiel Breakout mit dem Programm Processing schreiben aber ich kriege es nicht hin das die kugel an den Kästchen abspringt und die Kästchen dann weg gehen 
Ich hoffe mir kann jemand helfen.




```
float f=0;
float geschwindigkeit_x = 5;
float geschwindigkeit_y = 5;
float a=255;
float b=0;
float pos_x=mouseX;
float pos_y=570;


int[][] level_1 = {  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                     {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                  };






void setup()
{
size(600,577);
frameRate(70);
}

void draw()
{
  background(#000000);
  noStroke();
  fill(255,200,0);
  ellipse(pos_x,pos_y,20,20);
  rectMode(CENTER);
  rect(mouseX,560,120,20);
  rectMode(CORNER);
  fill(a);
  stroke(0);
  level();
  
  // verändern von x
  if (pos_x <= 25) {geschwindigkeit_x = random(6,13);}
  if (pos_x >= 570) {geschwindigkeit_x = random(-6,-13);}
  pos_x = pos_x + geschwindigkeit_x;
  
  // verändern von y
  if (pos_y <= 25) {geschwindigkeit_y = random(6,13);}
  if (pos_y >= 545 && pos_x <= mouseX+50 && pos_x >= mouseX-50) {geschwindigkeit_y = random(-6,-13);}
  pos_y = pos_y + geschwindigkeit_y;
  if (pos_y >=600) {noLoop();}
  
}

int level()
  {
    int anzahl_pillen = 0;
    for (int zeile = 0; zeile < (level_1.length); zeile++)  // Reihe
      {
      for (int spalte = 0; spalte < (level_1[0].length); spalte++)// Spalte
        {
        // Hintergrund zeichnen
        if (level_1[zeile][spalte] == 1)
          {
            fill(#FFFFFF);
            rect (spalte*level_1.length,zeile*level_1.length,width/level_1.length,height/level_1.length);
          }
        if (level_1[zeile][spalte] == 3)
          {
            fill(#7fff00);
            rect (spalte*level_1.length,zeile*level_1.length,width/level_1.length,height/level_1.length);
          }
        
        
        // Pillen zeichnen
        if (level_1[zeile][spalte] == 2)
          {
          fill(#ffa500);
          rect(spalte*level_1.length+level_1.length*0.5,zeile*level_1.length+level_1.length*0.5,5,5);
          anzahl_pillen++;
          }
        }
      }
    return anzahl_pillen;
  }
  
  float abstand(float x1,float y1,float x2,float y2)
  {return sqrt(sq(x2-x1)+sq(y2-y1));}

  int gefangen()
       {
       if (abstand(pos_x, pos_y, pos_x, pos_y) <  width/level_1.length)
         {return 3;}
       else
         {return 0;}
       }

       
       
       
   void mousePressed() {
  pos_x=mouseX;
  pos_y=570;
  loop();}
```


----------



## Marco13 (1. Jun 2010)

Man muss für jede "Zelle" des Levels schauen, ob da ein Stein ist, und ob der Ball den Stein berührt, und wenn ja, dann löscht man den Stein und ändert die Bewegungsrichtung des Balls. 

Ganz billig: 


```
if (!kollision())
        {
            // verändern von y
            if (pos_y <= 25)
            {
                geschwindigkeit_y = random(6, 13);
            }
            if (pos_y >= 545 && pos_x <= mouseX + 50 && pos_x >= mouseX - 50)
            {
                geschwindigkeit_y = random(-6, -13);
            }
            pos_y = pos_y + geschwindigkeit_y;
        }
        
        if (pos_y >= 600)
        {
            noLoop();
        }

    }
        
    boolean kollision()
    {
        for (int zeile = 0; zeile < (level_1.length); zeile++) // Reihe
        {
            for (int spalte = 0; spalte < (level_1[0].length); spalte++)// Spalte
            {
                if (level_1[zeile][spalte] == 3)
                {
                    
                    // Ganz Billig: Berechne Abstand zwischen Ballmittelpunkt
                    // und Rechtecksmittelpunkt
                    float x0 = spalte * level_1.length;
                    float y0 = zeile * level_1.length;
                    float w = width / level_1.length;
                    float h = height / level_1.length;
                    float centerX = x0 + w/2;
                    float centerY = y0 + h/2;
                    if (abstand(pos_x, pos_y, centerX, centerY) < 10)
                    {
                        // Bei einer Kollision, lösche den Stein und 
                        // ändere die Bewegungsrichtung
                        level_1[zeile][spalte] = 0;
                        geschwindigkeit_y = random(-6, -13);
                        return true;
                    }
                }
            }
        }
        return false;
        
    }
```

(da muss man halt ein bißchen mehr Arbeit reinstecken: Ein genauerer Kollisionstest, und eine bessere (passendere) Änderung der Bewegungsrichtung)


----------



## Polskaplaya123 (1. Jun 2010)

Es funktioniert aber trotzdem noch nicht das geht irgendwie nicht
wo muss ich das einfügen kannst du mir vielleicht das ganze programm einmal zeigen?

Ich arbeite noch nciht so lange mit Processing und kann das nciht so gut ;D


----------



## Marco13 (1. Jun 2010)

Das war der Teil zwischen der Zeile
[c]// verändern von y[/c]
und
[c]int level()[/c]

(Ich würde dir ja die Zeilennummern aus deinem Codeschnipsel nennen, aber ... (das, was da oben neben dem 
	

	
	
		
		

		
			





 steht, kann man doch kaum übersehen...?)

Ich arbeite auch noch nicht lange mit Processing. Installiert habe ich es zum ersten mal heute mittag, etwa um 15:00 Uhr. 

Falls du das (konkrete) Problem genauer beschreibst (genauer als "das geht nicht"), werde ich vielleicht versuchen, zu helfen, wenn ich kann, aber jetzt einfach so eine "schöne Abprallfunktion" zu entwickeln passt vermutlich nicht sooo in meinen Zeitplan....


----------



## Polskaplaya123 (2. Jun 2010)

Ich habe das jetzt so und dann kommt die fehlermeldung "unexpected token: boolean"




```
float f=0;
float geschwindigkeit_x = 5;
float geschwindigkeit_y = 5;
float a=255;
float b=0;
float pos_x=mouseX;
float pos_y=570;


int[][] level_1 = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
};






void setup()
{
size(600,577);
frameRate(70);
}

void draw()
{
background(#000000);
noStroke();
fill(255,200,0);
ellipse(pos_x,pos_y,20,20);
rectMode(CENTER);
rect(mouseX,560,120,20);
rectMode(CORNER);
fill(a);
stroke(0);
level();

// verändern von x
if (pos_x <= 25) {geschwindigkeit_x = random(6,13);}
if (pos_x >= 570) {geschwindigkeit_x = random(-6,-13);}
pos_x = pos_x + geschwindigkeit_x;

if (!kollision())
        {
            // verändern von y
            if (pos_y <= 25)
            {
                geschwindigkeit_y = random(6, 13);
            }
            if (pos_y >= 545 && pos_x <= mouseX + 50 && pos_x >= mouseX - 50)
            {
                geschwindigkeit_y = random(-6, -13);
            }
            pos_y = pos_y + geschwindigkeit_y;
        }
        
        if (pos_y >= 600)
        {
            noLoop();
        }
 
    
        
    boolean kollision()
    {
        for (int zeile = 0; zeile < (level_1.length); zeile++) // Reihe
        {
            for (int spalte = 0; spalte < (level_1[0].length); spalte++)// Spalte
            {
                if (level_1[zeile][spalte] == 3)
                {
                    
                    
                    float x0 = spalte * level_1.length;
                    float y0 = zeile * level_1.length;
                    float w = width / level_1.length;
                    float h = height / level_1.length;
                    float centerX = x0 + w/2;
                    float centerY = y0 + h/2;
                    if (abstand(pos_x, pos_y, centerX, centerY) < 10)
                    {
                        // Bei einer Kollision, lösche den Stein und 
                        // ändere die Bewegungsrichtung
                        level_1[zeile][spalte] = 0;
                        geschwindigkeit_y = random(-6, -13);
                        return true;
                    }
                }
            }
        }
        return false;
        
    }

}


int level()
{
int anzahl_pillen = 0;
for (int zeile = 0; zeile < (level_1.length); zeile++) // Reihe
{
for (int spalte = 0; spalte < (level_1[0].length); spalte++)// Spalte
{
// Hintergrund zeichnen
if (level_1[zeile][spalte] == 1)
{
fill(#FFFFFF);
rect (spalte*level_1.length,zeile*level_1.length,width/level_1.length,height/level_1.length);
}
if (level_1[zeile][spalte] == 3)
{
fill(#7fff00);
rect (spalte*level_1.length,zeile*level_1.length,width/level_1.length,height/level_1.length);
}


// Pillen zeichnen
if (level_1[zeile][spalte] == 2)
{
fill(#ffa500);
rect(spalte*level_1.length+level_1.length*0.5,zeile*level_1.length+level_1.length*0.5,5,5);
anzahl_pillen++;
}
}
}
return anzahl_pillen;
}

float abstand(float x1,float y1,float x2,float y2)
{return sqrt(sq(x2-x1)+sq(y2-y1));}

int gefangen()
{
if (abstand(pos_x, pos_y, pos_x, pos_y) < width/level_1.length)
{return 3;}
else
{return 0;}
}




void mousePressed() {
pos_x=mouseX;
pos_y=570;
loop();}
```


----------



## Noctarius (2. Jun 2010)

Gut gemeinter Tipp: Gewöhn dir gleich zu Anfang eine saubere Einrückung an, das macht viele Problemlösungen schon einfacher.


----------



## Marco13 (2. Jun 2010)

... wie auch in diesem Fall.... ich glaube(!) nach

        if (pos_y >= 600)
        {
            noLoop();
        }

fehlt noch eine "}"


----------



## Noctarius (2. Jun 2010)

Marco13 hat gesagt.:


> ... wie auch in diesem Fall.... ich glaube(!) nach
> 
> if (pos_y >= 600)
> {
> ...



Sag ich ja, mit vernünftiger Einrückung würde man sowas schneller sehen *g*


----------



## Polskaplaya123 (2. Jun 2010)

Und dann habe ich noch eine frage wie ich das machen kann das ich den ball lenken kann das er nicht zufällig abspringt sondern das wenn er den paddle auf der linken seite berührt das er dann nach links geht und wenn der ball rechts trifft das er dann nach rechts geht?


----------



## Marco13 (2. Jun 2010)

Du meinst, wie man...


Marco13 hat gesagt.:


> jetzt einfach so eine "schöne Abprallfunktion"


...entwickeln könnte?  Man muss rausfinden, an welcher Stelle das Paddel getroffen wurde, und die Richtung entsprechend ändern. Überleg' dir da erstmal was mit Bleistift und Papier (Computer aus!) und wenn du glaubst, eine Lösung zu haben, kannst du sie ja mal hier "reviewen" lassen (als Pseudocode oder so aufgeschrieben). Aber vielleicht in einem neuen Thread. Vermutlich schauen bei "Softwareentwickung/Processing" etliche Leute NICHT rein (weil sie sich - so wie ich - nicht mit Processing auskennen) die aber zum eigentlichen Problem vielleicht was sinnvolles sagen könnten.


----------

