Ping Pong: KeyListener in Paint und while

shadow1992

Mitglied
Ich arbeite momentan an einem Ping Pong Spiel und habe nun das Problem, dass der Computer die Tasaureingaben nicht wahrnimmt.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import grafik_1.*;

Paint-Methode
Java:
public void paint(Graphics g)
  {
    super.paint(g);
    //g.translate(400, 400);

    boolean run=true;
    boolean ComputerStatus=true;

    //Zeichnen der Hauptkomponenten
    Methods.PaintBall(Settings.diametre,Color.red,g);
    Methods.drawPaddleP1(g);
    Methods.drawPaddleP2(g);

    //Bewegung Starten
    Methods.RBallMove(Settings.diametre,Settings.Break,g,Settings.BColor);

    while(run){
      Methods.MoveBall(Variablen.mover,Variablen.movel,Variablen.moveu,Variablen.moved,Settings.diametre,Settings.Break,g,Settings.BColor);
      Methods.Apprallen(g,Settings.diametre);
      Methods.Goal(g,Settings.diametre,Settings.BColor);

      //Spieler2 bewegung
      if(KeyInput.A_c){
        if(ComputerStatus){
          ComputerStatus=false;
        }
        else{
          ComputerStatus=true;
        }
      }
      if(ComputerStatus){
        Methods.ComputerPlayer(g);
      }
      if(!ComputerStatus){
        if(KeyInput.A_w){
          Methods.movePaddleP2(true,false,g);
        }
        if(KeyInput.A_s){
          Methods.movePaddleP2(false,true,g);
        }

      }

      //Spieler 1 Bewegung
      if(KeyInput.A_up){
        Methods.movePaddleP1(true,false,g);
      }
      if(KeyInput.A_down){
        Methods.movePaddleP1(false,true,g);
      }
      //Spielende?
      if(Variablen.player1score>=Settings.maxscore||Variablen.player2score>=Settings.maxscore){
        run=false;
      }
    }
    g.setColor(Color.white);
    g.drawString(Variablen.player1score+":"+Variablen.player2score,Settings.framesizex/2,Settings.framesizey/2);
  }

Zur Abfrage benutze ich einen in einer Seperaten Klasse befindlichen KeyAdapter:
Java:
package grafik_1;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;

public class KeyInput extends KeyAdapter {
  public static boolean A_up;
  public static boolean A_down;
  public static boolean A_w;
  public static boolean A_s;
  public static boolean A_c;

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C gedrückt");
    }
  }

  public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C losgelassen");
    }

  }

  public void keyTyped(KeyEvent e){

  }
}

Könnte mir jemand sagen, wieso der Adapter nicht richtig implimentiert ist?

Ich benutze JBuilder 9.
 

shadow1992

Mitglied
Methods ist die Methodenklasse. Alle enthaltenen Methoden habe ich bereits erfolgreich auf ihre Funktionalität überprüft.
Die Klasse Settings enthält Variablen, in denen Bestimmte Spieleigenschaften festgelegt sind.
Das Package grafik_1 enthält sowohl die Klasse Methods als auch die Klasse KeyInput und die Klasse Settings.

Das Problem ist aber immer noch wie im laufenden Spiel die Tastureingaben wahrgenommen werden. Falls ich den Paint und den Umdefinierungsteil der Komponenten separiere ist, dann immer noch die Frage, wie nach jeder Umdefinierung der Position der Komponenten, diese neu gezeichnet werden.
Das Problem scheint mir auch zu sein, dass in while-Schleifen grundsätzlich keine Key-Adapter eingebunden werden.
 
Zuletzt bearbeitet:

shadow1992

Mitglied
Hier der komplette Quellcode mit allen Klassen(bis auf JBuilder generierte Fenster erzeugende Klasse):
Hauptklasse:
Java:
package grafik_1;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import grafik_1.*;

//Haupt-Klasse
public class Frame1 extends JFrame {
  JPanel contentPane;
  BorderLayout borderLayout1 = new BorderLayout();


  public void paint(Graphics g)
  {
    super.paint(g);
    //g.translate(400, 400);

    boolean run=true;
    boolean ComputerStatus=true;

    //Zeichnen der Hauptkomponenten
    Methods.PaintBall(Settings.diametre,Color.red,g);
    Methods.drawPaddleP1(g);
    Methods.drawPaddleP2(g);

    //Bewegung Starten
    Methods.RBallMove(Settings.diametre,Settings.Break,g,Settings.BColor);

    while(run){
      Methods.MoveBall(Variablen.mover,Variablen.movel,Variablen.moveu,Variablen.moved,Settings.diametre,Settings.Break,g,Settings.BColor);
      Methods.Apprallen(g,Settings.diametre);
      Methods.Goal(g,Settings.diametre,Settings.BColor);

      //Spieler2 bewegung
      if(KeyInput.A_c){
        if(ComputerStatus){
          ComputerStatus=false;
        }
        else{
          ComputerStatus=true;
        }
      }
      if(ComputerStatus){
        Methods.ComputerPlayer(g);
      }
      if(!ComputerStatus){
        if(KeyInput.A_w){
          Methods.movePaddleP2(true,false,g);
        }
        if(KeyInput.A_s){
          Methods.movePaddleP2(false,true,g);
        }

      }

      //Spieler 1 Bewegung
      if(KeyInput.A_up){
        Methods.movePaddleP1(true,false,g);
      }
      if(KeyInput.A_down){
        Methods.movePaddleP1(false,true,g);
      }
      //Spielende?
      if(Variablen.player1score>=Settings.maxscore||Variablen.player2score>=Settings.maxscore){
        run=false;
      }
    }
    g.setColor(Color.white);
    g.drawString(Variablen.player1score+":"+Variablen.player2score,Settings.framesizex/2,Settings.framesizey/2);
  }
  //Den Frame konstruieren
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  //Initialisierung der Komponenten
  private void jbInit() throws Exception  {
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(borderLayout1);
    this.getContentPane().setBackground(Color.black);
    this.setSize(new Dimension(Settings.framesizex,Settings.framesizey));
    this.setTitle("Pong");
  }

  //Überschrieben, so dass eine Beendigung beim Schließen des Fensters möglich ist.
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }


}

Java:
package grafik_1;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;

public class KeyInput extends KeyAdapter {
  public static boolean A_up;
  public static boolean A_down;
  public static boolean A_w;
  public static boolean A_s;
  public static boolean A_c;

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C gedrückt");
    }
  }

  public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C losgelassen");
    }

  }

  public void keyTyped(KeyEvent e){

  }
}

Java:
package grafik_1;
import java.awt.Graphics;
import java.awt.Color;
import grafik_1.Variablen;

//Methoden-Klasse
public class Methods {

//Abfrage trifft Ball Fensterrand
public static boolean borderhit(int diametre,boolean updown,boolean rightleft){
  boolean hit=false;
  int xborder=Settings.framesizex-diametre;
  int yborder=Settings.framesizey-diametre;
  System.out.println("Grenzen: "+Settings.framesizex+"|"+Settings.framesizey);
  if (updown){
    if(Variablen.Bally<=diametre || Variablen.Bally>=yborder){
      hit=true;
      System.out.println("Vertikale grenze getroffen");
    }
  }
  if (rightleft){
    if(Variablen.Ballx<=0 || Variablen.Ballx>=xborder){
      hit=true;
      System.out.println("Horizontale grenze getroffen");
    }
  }
  return hit;
}

//Abfrage trifft Ball Schläger
public static boolean paddlehit(boolean player1,boolean player2,int diametre){
  boolean hit=false;
  if (player1){
    int y=Variablen.Bally+diametre/2;
    if(y<=Variablen.player1ymax && y>=Variablen.player1ymin){
      if(Variablen.Ballx==Variablen.player1x){
        hit=true;
      }
    }
    y=Variablen.Bally+diametre/2;
    if(y<=Variablen.player1ymax && y>=Variablen.player1ymin){
      if(Variablen.Ballx==Variablen.player1x){
        hit=true;
      }
    }
    if(Variablen.Bally<=Variablen.player1ymax && Variablen.Bally>=Variablen.player1ymin){
      if(Variablen.Ballx==Variablen.player1x){
        hit=true;
      }
    }
  }
  if (player2){
    int y=Variablen.Bally+diametre/2;
    int x=Variablen.Ballx+Settings.diametre;
    if(y<=Variablen.player2ymax && y>=Variablen.player2ymin){
      if(x==Variablen.player2x){
        hit=true;
      }
    }
    y=Variablen.Bally+Settings.diametre/2;
    if(y<=Variablen.player2ymax && y>=Variablen.player2ymin){
      if(x==Variablen.player2x){
        hit=true;
      }
    }
    if(Variablen.Bally<=Variablen.player2ymax && Variablen.Bally>=Variablen.player2ymin){
      if(Variablen.Ballx==Variablen.player2x){
        hit=true;
      }
    }
  }

  return hit;
}


public static void onlymovebs(){  //Deaktiviert nicht bewegungsrelevante Bewegungsvariablen
  if(Variablen.mover&&Variablen.movel){
    Variablen.mover=false;
    Variablen.movel=false;
  }
  if(Variablen.moveu&&Variablen.moved){
    Variablen.moveu=false;
    Variablen.moved=false;
  }
}

//methoden Schläger von Spieler1
//zeichnet Schläger von Spieler1
public static void drawPaddleP1(Graphics g){
 g.setColor(Color.blue);
 System.out.println("Schläger 1");
 int x=Variablen.player1x+1;
 for(int a =0;a<6;a++){
   x=x-1;
   g.drawLine(x,Variablen.player1ymin,x,Variablen.player1ymax);
   System.out.println("Linie"+a+"("+x+"|"+Variablen.player1ymin+";"+Variablen.player1ymax+")");
 }
 System.out.println("Schläger1 gemalt   Koordinaten:"+Variablen.player1x+"|"+Variablen.player1ymin+";"+Variablen.player1ymax);
}

//entfernt Schläger von Spieler1
public static void removePaddleP1(Graphics g){
 g.setColor(Color.black);
 System.out.println("Schläger 1");
 int x=Variablen.player1x+1;
 for(int a =0;a<6;a++){//a entspricht der dicke des Schlägers
   x=x-1;
   g.drawLine(x,Variablen.player1ymin,x,Variablen.player1ymax);
   System.out.println("Linie"+a+"("+x+"|"+Variablen.player1ymin+";"+Variablen.player1ymax+")");
 }
 System.out.println("Schläger1 entfernt   Koordinaten:"+Variablen.player1x+"|"+Variablen.player1ymin+";"+Variablen.player1ymax);
}

//bewegt Schläger1
public static void movePaddleP1(boolean moveup,boolean movedown,Graphics g){
 if(Variablen.player1ymin!=Settings.framesizey && Variablen.player1ymax!=0){
   removePaddleP1(g);
   if (moveup) {
     Variablen.player1ymax = Variablen.player1ymax - 1;
     Variablen.player1ymin = Variablen.player1ymin - 1;
   }
   if (movedown) {
     Variablen.player1ymax = Variablen.player1ymax + 1;
     Variablen.player1ymin = Variablen.player1ymin + 1;
   }
   drawPaddleP1(g);
 }
}

//Methoden Schläger von Spieler 2
//wie Schläger1 nur andere Variablen
public static void movePaddleP2(boolean moveup,boolean movedown,Graphics g){
if(Variablen.player2ymin!=Settings.framesizey && Variablen.player2ymax!=0){
  removePaddleP2(g);
  if (moveup) {
    Variablen.player2ymax = Variablen.player2ymax - 1;
    Variablen.player2ymin = Variablen.player2ymin - 1;
  }
  if (movedown) {
    Variablen.player2ymax = Variablen.player2ymax + 1;
    Variablen.player2ymin = Variablen.player2ymin + 1;
  }
  drawPaddleP2(g);
}
}

public static  void drawPaddleP2(Graphics g){
  g.setColor(Color.YELLOW);
  System.out.println("Schläger 2");
  int x=Variablen.player2x-1;
  for(int a =0;a<6;a++){
    x=x+1;
    g.drawLine(x,Variablen.player2ymin,x,Variablen.player2ymax);
    System.out.println("Linie"+a+"("+x+"|"+Variablen.player2ymin+";"+Variablen.player2ymax+")");
  }
  System.out.println("Schläger2 gemalt   Koordinaten:"+Variablen.player2x+"|"+Variablen.player2ymin+";"+Variablen.player2ymax);
}
public static  void removePaddleP2(Graphics g){
  g.setColor(Color.black);
  System.out.println("Schläger 2");
  int x=Variablen.player2x-1;
  for(int a =0;a<6;a++){
    x=x+1;
    g.drawLine(x,Variablen.player2ymin,x,Variablen.player2ymax);
    System.out.println("Linie"+a+"("+x+"|"+Variablen.player2ymin+";"+Variablen.player2ymax+")");
  }
  System.out.println("Schläger2 entfernt   Koordinaten:"+Variablen.player2x+"|"+Variablen.player2ymin+";"+Variablen.player2ymax);
}

//Tor
public static void Goal(Graphics g,int diametre,Color color){
  if (borderhit(diametre,false,true)){
    if(Variablen.Ballx==0){
      Variablen.player2score++;
    }
    if(Variablen.Ballx==Settings.framesizex-diametre){
      Variablen.player1score++;
    }
    RemoveBall(diametre,g);
   Variablen.Ballx=Settings.framesizex/2;
    Variablen.Bally=Settings.framesizey/2;
    PaintBall(diametre,color,g);
    RBallMove(diametre,10,g,color);
  }
}

//Generiert Koordinatengitter
public static void Koordinatensystem(int genauigkeit,Graphics g){
  g.setColor(Color.white);
  if (genauigkeit ==0){
    int b = 0 - Settings.framesizey;
    g.drawLine(0,Settings.framesizey,0,b);
    int c = 0 - Settings.framesizex;
    g.drawLine(Settings.framesizex,0,c,0);
  }
  else{
    for (int b = 0; b < Settings.framesizex; b = b + genauigkeit) {
      int c = 0 - b;
      int d = 0 - Settings.framesizey;
      g.drawLine(b, d, b, Settings.framesizey);
      g.drawLine(c, d, c, Settings.framesizey);
    }
    for (int b = 0; b < Settings.framesizey; b = b + genauigkeit) {
      int c = 0 - b;
      int d = 0 - Settings.framesizey;
      g.drawLine(d, b, Settings.framesizex, b);
      g.drawLine(d, c, Settings.framesizex, c);
    }
  }
}

//Malt Ball
public static void PaintBall(int diametre,Color color,Graphics g){
  g.setColor(color);
  g.fillOval(Variablen.Ballx, Variablen.Bally, diametre, diametre);
  System.out.println("Ball gemalt");
}
//Entfernt Ball
public static void RemoveBall(int diametre,Graphics g){
  g.setColor(Color.black);
  g.fillOval(Variablen.Ballx, Variablen.Bally, diametre, diametre);
  System.out.println("Ball weg");
}

//Bewegt Ball von Fensterrand/Schläger um 1pxl, damit die Weiter Bewegung möglich ist
public static void MoveBallfromObstacle(Graphics g,int diametre,Color color){
  RemoveBall(diametre,g);
  int xborder=Settings.framesizex-Settings.diametre;
  int yborder=Settings.framesizey-Settings.diametre;
  System.out.println("Borders: "+xborder+"|"+yborder);
  if(Variablen.Ballx<=0){
    Variablen.Ballx=1;
  }
  if(Variablen.Ballx>=xborder){
    Variablen.Ballx=xborder-1;
  }
  if (Variablen.Bally<=diametre/2){
    Variablen.Bally=diametre/2+1;
  }
  if (Variablen.Bally>=yborder){
    Variablen.Bally=yborder-1;
  }
  if(paddlehit(true,true,diametre)){
    if (Variablen.Ballx == Variablen.player1x) {
      Variablen.Ballx = Variablen.Ballx + 1;
    }
    if (Variablen.Ballx == Variablen.player2x - diametre) {
      Variablen.Ballx = Variablen.Ballx - 1;
    }
  }
  PaintBall(diametre,color,g);
}

//Bewegt Ball
public static void MoveBall (boolean moveright,boolean moveleft, boolean moveup, boolean movedown,int diametre,int movingbreak ,Graphics g,Color color){
  boolean move =true;
  MoveBallfromObstacle(g,diametre,color);
  RemoveBall(diametre,g);
  if (moveright) {
    System.out.println("rechts");
  }
  if (moveleft) {
    System.out.println("links");
  }
  if (moveup) {
    System.out.println("hoch");
  }
  if (movedown) {
    System.out.println("runter");
  }
  while (move) {   //Ändere Lokationskoordinaten des bALLS
  RemoveBall(diametre,g);
    if (moveright) {
      Variablen.Ballx = Variablen.Ballx + 1;
    }
    if (moveleft) {
      Variablen.Ballx = Variablen.Ballx - 1;
    }
    if (moveup) {
      Variablen.Bally = Variablen.Bally - 1;
    }
    if (movedown) {
      Variablen.Bally = Variablen.Bally + 1;
    }
    PaintBall(diametre,color,g);
    //Koordinatensystem(150,g);
    System.out.println(Variablen.Ballx+"|"+Variablen.Bally);
    try {
      Thread.sleep(movingbreak);
    }
    catch (InterruptedException e) {}
    move=false;
    if (borderhit(diametre,true,true)||paddlehit(true,true,diametre)){
      move=false;
      System.out.println("Stopp");
    }
  }
}


public static void RandomBallMove(int diametre,int movingbreak,Graphics g,Color color){
  Variablen.mover =false;
  Variablen.movel =false;
  Variablen.moveu =false;
  Variablen.moved =false;
  int RLMovement = (int)Math.floor((double)2 * Math.random());
  int UDMovement = (int)Math.floor((double)2 * Math.random());
  if (RLMovement ==1){
    Variablen.mover =true;
    System.out.println("rechts");
  }
  if (RLMovement==2){
    Variablen.movel=true;
    System.out.println("links");
  }
  if (UDMovement ==1){
    Variablen.moveu=true;
    System.out.println("hoch");
  }
  if(UDMovement==2){
    Variablen.moved=true;
  System.out.println("runter");
  }
  onlymovebs();
  MoveBall(Variablen.mover,Variablen.movel,Variablen.moveu,Variablen.moved,diametre,movingbreak,g,color);
  System.out.println("Stopp Zufall");
}

public static void RBallMove(int diametre,int movingbreak,Graphics g,Color color){
  RandomBallMove(diametre,movingbreak,g,color);
  onlymovebs();
  while(!Variablen.movel&&!Variablen.mover){
   RandomBallMove(diametre,movingbreak,g,color);
 }
}
public static  void Apprallen(Graphics g,int diametre){
  if (borderhit(diametre,true,false)||paddlehit(true,true,diametre)){
    System.out.println("Abprallen:");
    if (Variablen.moveu){
      Variablen.moveu=false;
      System.out.println("nicht Hoch");
    }
    else {
      Variablen.moveu=true;
      System.out.println("Hoch");
    }
    if (Variablen.moved){
      Variablen.moved=false;
      System.out.println("nicht Runter");
    }
    else {
      Variablen.moved=true;
      System.out.println("Runter");
    }
    if (Variablen.mover){
      Variablen.mover=false;
      System.out.println("nicht Rechts");
    }
    else {
      Variablen.mover=true;
      System.out.println("Rechts");
    }
    if (Variablen.movel){
      Variablen.movel=false;
      System.out.println("nicht Links");
    }
    else {
      Variablen.movel=true;
      System.out.println("Links");
    }
    onlymovebs();
    if(borderhit(diametre,true,false)){
      if(Variablen.mover||Variablen.movel){
        System.out.println("oben getroffen");
        if (Variablen.mover && !Variablen.movel) {
          System.out.println("rechts mit links getauscht");
          Variablen.mover = false;
          Variablen.movel = true;
        }
        else {
          System.out.println("links mit rechts getauscht");
          Variablen.mover = true;
          Variablen.movel = false;
        }
      }
    }
    if(paddlehit(true,true,diametre)){
      if(Variablen.moveu||Variablen.moved){
        System.out.println("Schläger getroffen");
        if (Variablen.moveu && !Variablen.moved) {
          System.out.println("oben mit unten getauscht");
          Variablen.moveu = false;
          Variablen.moved = true;
        }
        else {
          System.out.println("oben mit unten getauscht");
          Variablen.moveu = true;
          Variablen.moved = false;
        }
      }
    }
    System.out.println("abgeprallt");
  }
}

//COMPUTERSpieler 2 bewegt Schläger automatisch in richtung Ball
public static void ComputerPlayer(Graphics g){
  if(Variablen.Bally<Variablen.player2ymin){
    movePaddleP2(true,false,g);
  }
  if(Variablen.Bally>Variablen.player2ymax){
    movePaddleP2(false,true,g);
  }

}
}

Java:
package grafik_1;
import java.awt.Color;

//Einstellung-Klasse
public class Settings {

//Definition der Fenstergröße
  public static int framesizex=900;
  public static int framesizey=700;

  //Spieleinstellungen
  public static int maxscore=10;//Maximale Tore pro Spieler
  public static int diametre=20;//Durchmesser des Balls
  public static int Break =10;//Pause in ms
  public static Color BColor = Color.RED;//Ballfarbe

}

Java:
package grafik_1;
import grafik_1.Settings;

//Variablen-Klasse
public class Variablen {
  //Initalisierung der Bewegungsvariablen
  public static boolean moveu;
  public static boolean moved;
  public static boolean mover;
  public static boolean movel;

//Initalisierung der Schlägerortsvariablen
  public static int player1ymax=375;
  public static int player1ymin=325;
  public static int player1x=50;
  public static int player2ymax=375;
  public static int player2ymin=325;
  public static int player2x=Settings.framesizex-50;

//Initialisierung der Punktestandsvariablen
  public static int player1score=0;
  public static int player2score=0;

//Initialisierung der Ortsvariablen des Balls
  public static int Ballx=Settings.framesizex/2;
  public static int Bally=Settings.framesizey/2;
}
 

Marco13

Top Contributor
Das Problem ist aber immer noch wie im laufenden Spiel die Tastureingaben wahrgenommen werden. Falls ich den Paint und den Umdefinierungsteil der Komponenten separiere ist, dann immer noch die Frage, wie nach jeder Umdefinierung der Position der Komponenten, diese neu gezeichnet werden.
Das Problem scheint mir auch zu sein, dass in while-Schleifen grundsätzlich keine Key-Adapter implimentiert werden.

Ein Problem scheint mir auch zu sein, dass solche frei erfundenen oder sinnarm durcheinandergewürfelten Stichworte wie "Umdefinierungsteil" oder "implementieren eines Key-Adapters in einer while-Schleife" keinen sinn machen.

Es läuft ein Thread. Der "Event-Dispatch-Thread". Der ist im wesentlichen für genau ZWEI Dinge verantwortlich:
1. Neuzeichnen von Components (paint/paintComponent ausführen)
2. Benutzereingaben verarbeiten (Events weiterreichen)

Wenn dieser Thread einmal deine paint-Methode betreten hat, kommt er da nicht mehr raus, solange er in der while-Schleife hängt. Deswegen werden dann auch keine Eingaben mehr verarbeitet.

Schau' dir das Tutorial an. Ist wirklich "leicht verdaulich" geschrieben.
 

shadow1992

Mitglied
Ich habe nun einen eigenen Thread für die Umdefinierung der Objektvariablen erstellt, aber es werden weder KeyEvents im Tread noch in der Hauptklasse und auch kein aus einer anderen Klasse eingefügter KeyAdapter beachtet. Ich hab den verdacht, dass in einer while-schleife keine Tastatureingaben beachtet werden.

Quellcode:
Java:
package grafik_1;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import grafik_1.*;

//Haupt-Klasse
public class Frame1 extends JFrame /*implements KeyListener*/{
  JPanel contentPane;
  BorderLayout borderLayout1 = new BorderLayout();
  GameLoop Loop = new GameLoop();

  boolean Run=true;
  boolean ComputerStatus=true;
  boolean start =true;

  boolean A_up;
  boolean A_down;
  boolean A_c;
  boolean A_w;
  boolean A_s;


  public void paint(Graphics g)
  {
    super.paint(g);
    //g.translate(400, 400);
    //Zeichnen der Hauptkomponenten zu beginn
    if(start){
      Methods.PaintBall(Settings.diametre, Settings.BColor, g);
      Methods.drawPaddleP1(g);
      Methods.drawPaddleP2(g);
    }
    //Entfernen der Komponenten im Spielverlauf
    if(Run&&!start){
      Methods.RemoveBall(Settings.diametre,g);
      Methods.removePaddleP1(g);
      Methods.removePaddleP2(g);
    }
    //Endstand anzeigen
    if(!Run){
      g.setColor(Color.white);
      g.drawString(Variablen.player1score + ":" + Variablen.player2score,
                   Settings.framesizex / 2, Settings.framesizey / 2);
    }
  }

  class GameLoop extends Thread implements KeyListener {
    public void run() {
      //Bewegung Starten
      Methods.RBallMove(Settings.diametre, Settings.Break);

      while (Run) {
        start=true;
        repaint();
        try {
          Thread.sleep(Settings.Break);
        }
        catch (InterruptedException e) {}

        Methods.MoveBall(Variablen.mover, Variablen.movel, Variablen.moveu,
                         Variablen.moved, Settings.diametre, Settings.Break);
        Methods.Apprallen(Settings.diametre);
        Methods.Goal(Settings.diametre);


        //Spieler2 bewegung
        if (A_c) {
          if (ComputerStatus) {
            ComputerStatus = false;
          }
          else {
            ComputerStatus = true;
          }
        }
        if (ComputerStatus) {
          Methods.ComputerPlayer();
        }
        if (!ComputerStatus) {
          if (A_w) {
            Methods.movePaddleP2(true, false);
          }
          if (A_s) {
            Methods.movePaddleP2(false, true);
          }

        }

        //Spieler 1 Bewegung
        if (A_up) {
          Methods.movePaddleP1(true, false);
        }
        if (A_down) {
          Methods.movePaddleP1(false, true);
        }
        this.CheckGameEnd();
        start=false;
        repaint();
      }
    }

    public void CheckGameEnd(){
      //Spielende?
      if (Variablen.player1score >= Settings.maxscore ||
          Variablen.player2score >= Settings.maxscore) {
        Run = false;
      }
    }
    public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C gedrückt");
    }
  }

  public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = false;
      System.out.println("Hoch losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = false;
      System.out.println("Runter losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = false;
      System.out.println("W losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = false;
      System.out.println("S losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = false;
      System.out.println("C losgelassen");
    }

  }

  public void keyTyped(KeyEvent e){

  }
  }
  //Den Frame konstruieren
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  //Initialisierung der Komponenten
  private void jbInit() throws Exception  {
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(borderLayout1);
    this.getContentPane().setBackground(Color.black);
    this.setSize(new Dimension(Settings.framesizex,Settings.framesizey));
    this.setTitle("Pong");
    Loop.start();
  }

  //Überschrieben, so dass eine Beendigung beim Schließen des Fensters möglich ist.
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }
  /*public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C gedrückt");
    }
  }

  public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = false;
      System.out.println("Hoch losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = false;
      System.out.println("Runter losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = false;
      System.out.println("W losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = false;
      System.out.println("S losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = false;
      System.out.println("C losgelassen");
    }

  }

  public void keyTyped(KeyEvent e){

  }*/
}

Key Adapter:
Java:
package grafik_1;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;

public class KeyInput extends KeyAdapter {
  public static boolean A_up;
  public static boolean A_down;
  public static boolean A_w;
  public static boolean A_s;
  public static boolean A_c;

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = true;
      System.out.println("Hoch gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = true;
      System.out.println("Runter gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = true;
      System.out.println("W gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = true;
      System.out.println("S gedrückt");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = true;
      System.out.println("C gedrückt");
    }
  }

  public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
      A_up = false;
      System.out.println("Hoch losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_DOWN) {
      A_down = false;
      System.out.println("Runter losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_W) {
      A_w = false;
      System.out.println("W losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_S) {
      A_s = false;
      System.out.println("S losgelassen");
    }
    if (e.getKeyCode() == KeyEvent.VK_C){
      A_s = false;
      System.out.println("C losgelassen");
    }

  }

  public void keyTyped(KeyEvent e){

  }
}

An den anderen Klassen habe ich nichts verändert.
 

Marco13

Top Contributor
Habe jetzt uhrzeitbedingt nicht alles nachvollzogen, aber mal nach "addKey..." gesucht, und scheinbar kommt dort nirgendwo sowas wie
someComponent.addKeyListener(someKeyListener);
vor...
 

hdi

Top Contributor
Er ruft auf seinem Frame aber ein
Code:
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
auf. Ich weiss jetzt wiederum nicht so genau was das soll, versteh auch die API nicht so ganz. Also ich würde auch sagen es fehlt das registrieren des KeyListeners, aber ich bin halt etwas verwirrt von o.g. Befehl.
 

mvitz

Top Contributor
Du solltest dir aber evtl. nochmal die Java Grundlagen anschauen. Eine Klasse für alle deine Methoden (und diese dann statisch) und eine Klasse für alle Variablen (auch hier statisch) ist äußerst unschön.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Ping Pong Spiele- und Multimedia-Programmierung 4
M Einfaches Ping-Pong Spiel Spiele- und Multimedia-Programmierung 3
1 Ping Pong langsam Spiele- und Multimedia-Programmierung 13
J ping pong ball abprallen lassen Spiele- und Multimedia-Programmierung 12
L Java Ping Pong Spiele- und Multimedia-Programmierung 1
G Ping Pong Frage Spiele- und Multimedia-Programmierung 17
B Ping Pong Spiele- und Multimedia-Programmierung 11
R Ping Pong Spiel Fehlermeldung Spiele- und Multimedia-Programmierung 12
R Ping Pong Spiel Spiele- und Multimedia-Programmierung 28
J Probleme bei Pong Spiele- und Multimedia-Programmierung 9
J Pong Programm Spiele- und Multimedia-Programmierung 1
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
S Pong java.lang.StackOverflowError Spiele- und Multimedia-Programmierung 3
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
T Torquemada´s erstes Game (Pong) Spiele- und Multimedia-Programmierung 5
A Pong Grafikgestaltung Spiele- und Multimedia-Programmierung 10
R Pong -Reruns möglich machen Spiele- und Multimedia-Programmierung 2
Y Pong Spiel Score Zähler! -.- Spiele- und Multimedia-Programmierung 18
U Pong Spiele- und Multimedia-Programmierung 7
BattleMaster246 Pong - JOGL Spiele- und Multimedia-Programmierung 2
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
D Java Pong Probleme Spiele- und Multimedia-Programmierung 7
W Hilfe bei Pong mit Bluej Spiele- und Multimedia-Programmierung 4
M Fragen zu meinem Pong-Clone Spiele- und Multimedia-Programmierung 6
L Probleme Bei Pong Programmierung Spiele- und Multimedia-Programmierung 2
G Pong klon mit Steuerungsprobleme Spiele- und Multimedia-Programmierung 8
B Pong-Klon. Denkfehler bei kollisionstest Spiele- und Multimedia-Programmierung 3
N Pong - noch 2 kleinere Probleme Spiele- und Multimedia-Programmierung 16
G Pong-Klon (Applet!) Spiele- und Multimedia-Programmierung 4
H Performance check Pong Spiele- und Multimedia-Programmierung 19
B KeyListener Bug Spiele- und Multimedia-Programmierung 2
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
B Den KeyListener in einer JavaFXML Application benutzen Spiele- und Multimedia-Programmierung 2
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
M KeyListener Spiele- und Multimedia-Programmierung 8
T Problem mit JnR-Steuerung / KeyListener Spiele- und Multimedia-Programmierung 6
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
F Problem mit KeyListener in Applet Spiele- und Multimedia-Programmierung 4
StrikeTom KeyListener Funktioniert nicht Spiele- und Multimedia-Programmierung 3
D Space Invaders(KeyListener Problem) Spiele- und Multimedia-Programmierung 3
Developer_X Java "Multi"KeyListener Spiele- und Multimedia-Programmierung 15
C Anfängerfrage: Plazierung Panel im JFrame und KeyLIstener Spiele- und Multimedia-Programmierung 4
A Mit KeyListener zwei Tasten gleichzeitig abfragen Spiele- und Multimedia-Programmierung 2
T Doppel KeyListener Spiele- und Multimedia-Programmierung 16
S Probleme mit dem Licht und dem KeyListener Spiele- und Multimedia-Programmierung 2
K Jump n Run Keylistener und Schleifen Spiele- und Multimedia-Programmierung 8
M Jpanel mit Keylistener Spiele- und Multimedia-Programmierung 6
D Pfeiltasten beim KeyListener Spiele- und Multimedia-Programmierung 1
R KeyListener hält nicht mit Spiele- und Multimedia-Programmierung 14

Ähnliche Java Themen

Neue Themen


Oben