PingPong mit Processing programmieren

Exodes

Ensign
Registriert
Jan. 2010
Beiträge
169
Hallo
Als Abschlussarbeit muss ich PingPong mit Processing programmieren.
Ich hab mir dabei gedacht, dass ich Player1, Player2 und den Ball als Objekt schreibe.
Nun komm ich allerdings nicht mehr weiter. ich kann meinen 2. player nicht bewegen und ich weis nicht so wirklich, wie ich den ball bei berührung abstoße.
Hier mein bisheriger Code
Code:
Player1 p1;
Player2 p2;
Ball    b;


void setup()
  {
    size(400,225);
    frameRate(50);
    smooth();
    p1= new Player1(width/4, height/2, #FFFFFF, 3);
    p2= new Player2(width/1.38, height/2, #FFFFFF, 3);
    b= new Ball(width/2, height/2, #00BFFF, 3);
  }  


void draw()
{
 background(0);
 stroke(255); 
 ellipseMode(CENTER); 
 fill(0); 
 ellipse(width/2,height/2,50,50);  //mittelkreis
 line(width/2,0,width/2,height);   //mittellinie
 rect(0-1,height/4,width/8,height/2);  //linke torlinie
 rect(width*0.88,height/4,width+1,height/2); //rechte torlinie
 
 
 p1.bewegen();
 p2.bewegen();
 b.bewegen();
}  

//----------------------Player1----------------------
class Player1
{
  float pos_x;
  float pos_y;
  float richtung;
  float tempo;
  color farbe;  
  

  Player1(float x, float y, color f, float speed)
  {
     pos_x = x;
     pos_y = y;
     farbe = f;
     tempo = speed;
  }
  
  void bewegen()
  {
    if (keyPressed)
    {
    if (key == 'w' || key == 'W') {richtung = 0; pos_y = pos_y - tempo;}
    if (key == 'd' || key == 'D') {richtung = 1; pos_x = pos_x + tempo;}
    if (key == 's' || key == 'S') {richtung = 2; pos_y = pos_y + tempo;}
    if (key == 'a' || key == 'A') {richtung = 3; pos_x = pos_x - tempo;}
    }
    zeichnen(pos_x,pos_y);
  }
  
  void zeichnen(float x, float y)
  {
    fill(farbe);
    rectMode(CORNER);
    rect(x,y,5,height/6);
    
  } 
  
}

//----------------------Player2----------------------

class Player2 extends Player1
{
  Player2(float x, float y, color f, float speed)
  {
    super(x,y,f,speed);
  }
  void bewegen()
  {
    if (keyPressed)
    {
     if (keyCode == 'i') {richtung = 0; pos_y = pos_y - tempo;}
     if (keyCode == 'l') {richtung = 1; pos_x = pos_x + tempo;}
     if (keyCode == 'k') {richtung = 2; pos_y = pos_y + tempo;}
     if (keyCode == 'j') {richtung = 3; pos_x = pos_x - tempo;}
     }  
   zeichnen(pos_x,pos_y);
  }
}


//----------------------Ball----------------------

class Ball
{
  float pos_x;
  float pos_y;
  color farbe;
  float tempo;
  float richtung;
  
  Ball(float x, float y, color f, float speed)
  {
    pos_x=x;
    pos_y=y;
    farbe=f;
    tempo=speed; 
   }  
   
   void bewegen()
   {
     zeichnen(pos_x, pos_y);
   }    
    
   void zeichnen(float x, float y)
   {
     fill(farbe);
     ellipse(x,y,10,10);
   }
 
}
Ich hoffe ihr könnt mir weiterhelfen :)
 
Zuletzt bearbeitet von einem Moderator:
Informier dich mal über CODE-tags. Dann sag, um welche Sprache es überhaupt geht und warum wir dir
deine Abschlussarbeit anfertigen sollen.
 
Irgendwo müsste eine ganz einfache Kollisionserkennung zwischen Ball und den beiden Balken stattfinden. Im Kollisionsfall ändert sich dann einfach die Flugbahn (Vektor?) des Balls. Eigentlich ganz einfach, oder?
Wie willst du die Flugrichtung mit einem (!) Float-Wert sinnvoll beschreiben? Wann wird der Ball bei dir bewegt?
 
Zuletzt bearbeitet:
Green Mamba schrieb:
Wie willst du die Flugrichtung mit einem (!) Float-Wert sinnvoll beschreiben?
Wahrscheinlich ist das als Winkel gedacht, daher auch die zusätzliche 'tempo'-Variable (Polarkoordinaten sozusagen).
 
Bei der Sprache würde ich mal mit ziemlicher Sicherheit auf Java tippen - das Schlüsselwort "extends" gibt es nicht bei so vielen anderen Sprachen. Irgendwie finde ich deine Klassenhierarchie schon mal schlimm - wieso wird Player2 von Player1 abgeleitet. Für mich müsste es wenn dann eine Klasse Player geben, welche z.B. über den Konstruktor konfiguriert wird (Player1 oder Player2). Außerdem verwendest du unterschiedliche Variablen in bewegen() für Player1 und Player2 und du prüfst nur bei Player1 auch auf Großbuchstaben.

Zum Abprallen des Balls würde ich zunächst einmal einfach beginnen und bei Kollision mit dem Balken die alte Weisheit Einfallswinkel gleich Ausfallwinkel anwenden.
 
Mal abgesehen davon was Simpson474 und asdfman gesagt haben, fehlt dir Collision Detection (was Mamba auch schon gesagt hat). Ausserdem fehlt dir ein gescheites Code management + layout fuer ein Game. Ich seh z.B. keine gescheite Update funktion fuer den gamestate. Ich seh auch keinen einzigen Vektor oder Point2 in deinem Code.

Player2 kannst du nicht bewegen, weil du den von Player1 vererbst. Erstell dir fuer den Player mal eine Virtuelle klasse und dann leite die Spieler davon ab.

Ersetz deine Floats durch Vektoren oder Points. Die kann man einfacher nachverfolgen und die haben integrierte x,y koordinaten und damit ist das Arbeiten auch einfacher.
 
Zuletzt bearbeitet:
@Simpson474
naja, processing ist basierend auf java...
Ich verwende übrigens keine unterschiedlichen variablen in bewegen() für Player1 und Player2, sondern einen falschen Befehl, den ich gerade berichtigt habe. Du hattest nämlich bestimmt an "keyCode" gedacht. da musste einfach nur "key" hin.
Bei Player2 prüfe ich jetzt ebenfalls großbuchstaben.
Mein erster Gedanke war, dass eine person player1 spielt und die zweite person player2, aber ich denke, ich lass lieber beide spieler durch 1 person steuern und damit ich den schwierigkeitsgrad erhöhe, macht player2 genau das gegenteil, wie man eigentlich drückt. D.h. player2 würde nach unten laufen, wenn ich w drücke. Dann könnte ich auch alles in einem konstruktor schreiben.

@GreenMamba
naja float richtung benutze ich nur, um die player zu bewegen. warum float? wenn man float benutzt, kann der wert in der folgenden Variable eine kommazahl sein, welches das programm dann genauer macht. ich habe mir dann einfach angewöhnt immer float zu benutzen.
wie ich jedoch den ball bewegen soll, weiß ich noch nicht..
An eine Kollisionsabfrage hab ich auch schon gedacht, allerdings weis ich nicht, wie ich die einbauen soll.

@FreddyMercury
vectoren habe ich grade mal in der befehlsliste gesucht und habe PVector gefunden, mal schauen, wie ich das anwenden muss....

@all
sooo. nun steuert man player 1+2 mit nur einer person (w,a,s,d).
player2 läuft nun im gegengesetzten von player1. D.h., wenn ich w drücke bewegt sich der player nach unten. Player 1+2 habe ich nun zusammengefasst unter Player.
So sieht der Code momentan aus:

Code:
Player  p;
Ball    b;


void setup()
  {
    size(400,225);
    frameRate(50);
    smooth();
    p= new Player(width/4, height/2, width/1.38, height/2, #FFFFFF, #0000FF, 3);
    b= new Ball(width/2, height/2, #00BFFF, 3);
  }  


void draw()
{
 background(0);
 stroke(255); 
 ellipseMode(CENTER);
 fill(255);
 textAlign(CENTER);
 textSize(20);
 text("PingPong", width/2, 16);
 fill(0); 
 line(0,25,width,25); //obere linie
 line(0,200,width,200); //untere linie
 ellipse(width/2,height/2,50,50);  //mittelkreis
 line(width/2,25,width/2,200);   //mittellinie
 //rect(0-1,height/4,width/8,height/2);  //linke torlinie
 //rect(width*0.88,height/4,width+1,height/2); //rechte torlinie
 
 p.bewegen();
 b.bewegen();
}  

//----------------------Player----------------------
class Player
{
  float pos_x;
  float pos_y;
  float pos_x2;
  float pos_y2;
  float tempo;
  color farbe; 
  color farbe2; 
  

  Player(float x, float y, float x2, float y2, color f, color f2, float speed)
  {
     pos_x = x;
     pos_y = y;
     pos_x2 = x2;
     pos_y2 = y2;
     farbe = f;
     farbe2 = f2;
     tempo = speed;
  }
  
  void bewegen()
  {
    if (keyPressed)
    {
    if (key == 'w' || key == 'W') {  if (pos_y != 44 && pos_y2 != 181){pos_y = pos_y - tempo;  pos_y2 = pos_y2 + tempo;}  }
    if (key == 'd' || key == 'D') {  pos_x = pos_x + tempo;  pos_x2 = pos_x2 - tempo;  }
    if (key == 's' || key == 'S') {  if (pos_y != 181 && pos_y2 != 44){pos_y = pos_y + tempo;  pos_y2 = pos_y2 - tempo;}  }
    if (key == 'a' || key == 'A') {  pos_x = pos_x - tempo;  pos_x2 = pos_x2 + tempo;  }
    }
    zeichnen(pos_x, pos_y, pos_x2, pos_y2);
  }
  
  void zeichnen(float x, float y, float x2, float y2)
  {
    rectMode(CENTER);
    stroke(farbe);
    fill(farbe);
    rect(x,y,5,37.5);
    stroke(farbe2);
    fill(farbe2);
    rect(x2,y2,5,37.5);
    
  } 
  
}

//----------------------Ball----------------------

class Ball
{
  float pos_x;
  float pos_y;
  color farbe;
  float tempo;
  float richtung;
  
  Ball(float x, float y, color f, float speed)
  {
    pos_x=x;
    pos_y=y;
    farbe=f;
    tempo=speed; 
   }  
   
   void bewegen()
   {
     zeichnen(pos_x, pos_y);
   }    
    
   void zeichnen(float x, float y)
   {
     stroke(farbe);
     fill(farbe);
     ellipse(x,y,10,10);
   }
 
}
 
Zuletzt bearbeitet: (CODE-tag)
Pack das doch mal in CODE-Tags :(
Kann ja kein Mensch lesen, so.
 
Klick zum Antworten mal unten auf "Erweitert", anstatt die Schnellantwort-Funktion zu benutzen. Dann erscheint auch die volle Funktionsleise. Ansonsten kannst du auch manuell die CODE-Tags verwenden.
 
Zurück
Oben