# Ping Pong: KeyListener in Paint und while



## shadow1992 (15. Dez 2009)

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


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

Paint-Methode

```
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:

```
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.


----------



## Marco13 (15. Dez 2009)

Abgesehen davon, dass das strukturell ziemlich :autsch: ist, und solche Zeilen wie
import grafik_1.*;
bei der Fehlersuche nicht viel bringen, und nicht klar ist, was "Methods" und so ist:

In der paint-Methode sollte NUR gezeichnet werden. Da ein "while(true)" ist ein No-Go. 

Schau dir am besten mal sowas wie Quaxli's Tutorial auf http://www.java-forum.org/buecher-tutorials-links/14545-tutorials-mitgliedern.html#post383565 an.


----------



## shadow1992 (15. Dez 2009)

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.


----------



## shadow1992 (15. Dez 2009)

Hier der komplette Quellcode mit allen Klassen(bis auf JBuilder generierte Fenster erzeugende Klasse):
Hauptklasse:

```
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);
    }
  }


}
```


```
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){

  }
}
```


```
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);
  }

}
}
```


```
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

}
```


```
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 (16. Dez 2009)

shadow1992 hat gesagt.:


> 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 (18. Dez 2009)

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:

```
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:

```
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 (19. Dez 2009)

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


----------



## hdi (19. Dez 2009)

Er ruft auf seinem Frame aber ein  
	
	
	
	





```
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.


----------



## shadow1992 (19. Dez 2009)

Ich hab jetzt den KeyListener initalisiert und alles Klappt.


----------



## mvitz (19. Dez 2009)

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.


----------



## Marco13 (19. Dez 2009)

Ja, in meiner ersten Antwort stand ja als erstes


Marco13 hat gesagt.:


> Abgesehen davon, dass das strukturell ziemlich :autsch: ist, ...


und ein Hinweis auf ein Tutorial... aber _jetzt funktioniert es ja, "dann kann das ja nicht falsch sein"_


----------

