# Pong klon mit Steuerungsprobleme



## Gast (31. Mai 2007)

Ich mache als Projekt einen Pong Klon.
Aber bei mir will einfach die Steuerung nicht Funktionieren. 

```
import java.awt.*;
import java.awt.event.*;
public class Spielfeld extends Frame implements KeyListener{
  private Option setting = new Option("Option");
  public char steu='\0';

  public Spielfeld(){
    super("Auto");
    this.setSize(900,700);
    this.setBackground(Color.BLACK);


    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });

    this.setResizable(false);
    this.setVisible(true);

  }

  public static void main(String[] args){
    new Spielfeld();
  }

  public void paint(Graphics g){
    int sp1 = 410;//Rechteck von Spieler 1
    int sp2 = 410;//Rechteck von Spieler 2
    int richtung = 5;//Richtung vom Ball
    int ballX = 50;//X Koordinaten vom Ball
    int ballY = 460;//Y Koordinaten vom Ball
    int standSp1=0;//Spielstand von Spieler 1
    int standSp2=0;//Spielstand von Spieler 2
    int counter=3;
    String counterStr="";
    g.setColor(Color.WHITE);
    //Spielfeld Makierung
    g.fillRect(20,200,10,490);
    g.fillRect(20,200,860,10);
    g.fillRect(870,200,10,490);
    g.fillRect(20,680,860,10);
    //Anzeige
    g.setFont (new Font("Arial", Font.BOLD, 70));//Einstellen der Schriftgröße
    g.drawString("Spieler1",10,125);
    g.drawString("Spieler2",600,125);
    this.Sp1Stand(g,0);
    g.drawString(":",410,125);
    this.Sp2Stand(g,0);
    //Schleife:
    while(standSp1<10||standSp2<10){
      g.clearRect(30,210,840,470);

      g.setColor(Color.WHITE);
      //Spieler1:
      g.fillRect(40,sp1,10,100);
      //Spieler2:
      g.fillRect(850,sp2,10,100);
      //Ball:
      g.fillArc(ballX,ballY,10,10,0,360);

      this.addKeyListener(this);
      //Steuerung Spieler1:
      if(this.steu=='a') { //Hoch
        sp1--;
      }else if(this.steu=='y'){ //Runter
        sp1++;
      }

      //Steuerung Spieler2:
      if(this.steu=='9'){//Hoch
        sp2--;
      }else if(this.steu=='6'){//Runter
        sp2++;
      }
      //Richtung vom ball
      if(richtung==1){ // <\
        ballX--;
        ballY--;
      }else if(richtung==2){// <-
        ballX--;
      }else if(richtung==3){ // </
        ballX--;
        ballY++;
      }else if(richtung==4){ // \>
        ballX++;
        ballY++;
      }else if(richtung==5){  // ->
        ballX++;
      }else if(richtung==6){   // />
        ballX++;
        ballY--;
      }
      //Ränder oben und unten
      if((ballY+10)>= 680 && richtung==3){
        richtung = 1;
      }else if((ballY+5)>= 680 && richtung==4){
        richtung = 6;
      }else if(ballY <= 210 && richtung==1){
        richtung = 3;
      }else if(ballY <= 210 && richtung==6){
        richtung = 4;
      }
      //Spielziel:
    if(ballX==50 && ballY>=sp1 && ballY<=(sp1+100)){
        //Abbrallen in verschiedene Richtungen
        if(ballY>=sp1 && ballY<=(sp1+39)){
          richtung=6;
        }else if(ballY>=(sp1+40)&& ballY<=(sp1+60)){
          richtung=5;
        }else if(ballY>=(sp1+61)&& ballY<=(sp1+100)){
          richtung=4;
        }
      }else if((ballX+10)==850 && ballY>=sp2 && ballY<=(sp2+100)){
        //Abbrallen in verschiedene Richtungen
        if(ballY >=sp2 && ballY<=(sp2+39)){
          richtung=1;
        }else if(ballY>=(sp2+40)&& ballY<=(sp2+60)){
          richtung=2;
        }else if(ballY>=(sp2+61)&& ballY<=(sp2+100)){
          richtung=3;
        }
      }else{
        if(ballX+10==850){
          standSp1++;
          this.Sp1Stand(g,standSp1);
          counter = 3;
          while(counter>0){
            counterStr=String.valueOf(counter);
            g.drawString(counterStr,500,500);
            try{
              java.lang.Thread.sleep(1000);
            }  catch(InterruptedException e){

            }
            g.clearRect(500,500,50,50);
            counter--;
          }
          ballX=860;
          ballY=460;
          sp1=410;
          sp2=410;
          richtung=2;
        }else if(ballX==50){
          standSp2++;
          this.Sp2Stand(g,standSp2);
          counter= 3;
          while(counter>0){
            counterStr=String.valueOf(counter);
            g.clearRect(500,500,50,50);
            g.drawString(counterStr,500,500);

            try{
              java.lang.Thread.sleep(1000);
            }catch(InterruptedException e){

            }
            counter--;
          }
          ballX=50;
          ballY=460;
          sp1=410;
          sp2=410;
          richtung=5;
        }
      }
      try{
        java.lang.Thread.sleep(3);
      }catch(InterruptedException e){

      }
    }
  }
  
  public void Sp1Stand(Graphics h,int Stand){
    String spielstand =String.valueOf(Stand);
    h.clearRect(340,125,75,75);
    h.setColor(Color.WHITE);
    h.setFont(new Font("Arial",Font.BOLD,70));
    h.drawString(spielstand,350,125);
  }
  
  public void Sp2Stand(Graphics e,int Stand){
    String spielstand =String.valueOf(Stand);
    e.clearRect(340,125,75,75);
    e.setColor(Color.WHITE);
    e.setFont(new Font("Arial",Font.BOLD,70));
    e.drawString(spielstand,450,125);
  }

  public void keyPressed(KeyEvent e){
    this.steu='\0';
    if(e.getKeyCode()==KeyEvent.VK_A){
      this.steu='a';
    }else if(e.getKeyCode()==KeyEvent.VK_Y){
      this.steu='y';
    }else if(e.getKeyCode()==KeyEvent.VK_NUMPAD9){
      this.steu='9';
    }else if(e.getKeyCode()==KeyEvent.VK_NUMPAD6){
      this.steu='6';
    }
  }
  
  public void keyReleased(KeyEvent e){
    this.steu='\0';

  }
  
  public void keyTyped(KeyEvent e){

  }
}
```


----------



## EOB (31. Mai 2007)

eventuell hilft es ja, wenn du sagst, *WAS* nicht funzt? gehts garnicht, falsche richtung etc? hier nur son langen code hinzuhaun kommt nicht so gut.

grüße  :bae:


----------



## Gast (1. Jun 2007)

Die Steuerung will einfach nicht klappen.
Ich schätze er führt zwar die Steuerung aus aber erst nach der Schleife und um die Rechtecke im Spiel zu bewegen muss  der Key listener halt schon in der Schleife das eigetippte umsetzen. Ich hoffe das Genügt als Fehler beschreibung


----------



## Marco13 (1. Jun 2007)

Es lohnt sich kaum, auf die Frage einzugehen, wenn man sieht, dass das ganze Programm praktisch nur aus der paint-Methode besteht, in der ALLES gemacht wird. Das KANN nicht funktionieren. Back to the roots: Lies' mal ein paar Tutorials .... :roll:


----------



## parabool (16. Jun 2007)

Hi, 

mit 
	
	
	
	





```
java.lang.Thread.sleep(1000);
```
 legst Du ja das ganze Pogramm  schlafen. (ist ja an sich schon ein Thread)
Deshalb auch keine Reaktion.

Lösung: im Programm einen 2. Thread erzeugen, wo Animation  abläuft.

So funktionierts:
(Habe aber bis auf kleinigkeiten sonst nichts viel dran verändert. Den Code würde ich mal etwas ordnen, in Funktionen aufteilen, Schläger und Ball als Objekte kapseln (coderedundanz)...
Aber sonst ne gute Idee !  :wink:  )



```
import java.awt.*;
import java.awt.event.*;
public class Spielfeld extends Frame implements KeyListener,Runnable{
 // private Option setting = new Option("Option");
  public char steu='\0';

  public Spielfeld(){
    super("Auto");
    this.setSize(900,700);
    this.setBackground(Color.BLACK);
    this.addKeyListener(this);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });

    this.setResizable(false);
    this.setVisible(true);

  }

  public static void main(String[] args){
    Thread t = new Thread(new Spielfeld()); 
    //new Spielfeld();
    t.start();
  }

  public void paint(Graphics g){
    g.setColor(Color.WHITE);
    //Spielfeld Makierung
    g.fillRect(20,200,10,490);
    g.fillRect(20,200,860,10);
    g.fillRect(870,200,10,490);
    g.fillRect(20,680,860,10);
    //Anzeige
    g.setFont (new Font("Arial", Font.BOLD, 70));//Einstellen der Schriftgröße
    g.drawString("Spieler1",10,125);
    g.drawString("Spieler2",600,125);
    
  }
  public void run() 
  {  
    Graphics g = getGraphics();
     
    int sp1 = 410;//Rechteck von Spieler 1
    int sp2 = 410;//Rechteck von Spieler 2
    int richtung = 5;//Richtung vom Ball
    int ballX = 50;//X Koordinaten vom Ball
    int ballY = 460;//Y Koordinaten vom Ball
    int standSp1=0;//Spielstand von Spieler 1
    int standSp2=0;//Spielstand von Spieler 2
    int counter=3;
    String counterStr="";
  
    this.Sp1Stand(g,0);
    g.drawString(":",410,125);
    this.Sp2Stand(g,0);
    //Schleife:
    while(standSp1<10||standSp2<10){
     try 
      { 
        Thread.sleep(5); 
      } 
      catch ( InterruptedException e ) 
      {       
       
      } 	
      g.clearRect(30,210,840,470);

      g.setColor(Color.WHITE);
      //Spieler1:
      g.fillRect(40,sp1,10,100);
      //Spieler2:
      g.fillRect(850,sp2,10,100);
      //Ball:
      g.fillArc(ballX,ballY,10,10,0,360);

      
      //Steuerung Spieler1:
      if(this.steu=='a') { //Hoch
        sp1--;
      }else if(this.steu=='y'){ //Runter
        sp1++;
      }

      //Steuerung Spieler2:
      if(this.steu=='9'){//Hoch
        sp2--;
      }else if(this.steu=='6'){//Runter
        sp2++;
      }
      //Richtung vom ball
      if(richtung==1){ // <\
        ballX--;
        ballY--;
      }else if(richtung==2){// <-
        ballX--;
      }else if(richtung==3){ // </
        ballX--;
        ballY++;
      }else if(richtung==4){ // \>
        ballX++;
        ballY++;
      }else if(richtung==5){  // ->
        ballX++;
      }else if(richtung==6){   // />
        ballX++;
        ballY--;
      }
      //Ränder oben und unten
      if((ballY+10)>= 680 && richtung==3){
        richtung = 1;
      }else if((ballY+5)>= 680 && richtung==4){
        richtung = 6;
      }else if(ballY <= 210 && richtung==1){
        richtung = 3;
      }else if(ballY <= 210 && richtung==6){
        richtung = 4;
      }
      //Spielziel:
    if(ballX==50 && ballY>=sp1 && ballY<=(sp1+100)){
        //Abbrallen in verschiedene Richtungen
        if(ballY>=sp1 && ballY<=(sp1+39)){
          richtung=6;
        }else if(ballY>=(sp1+40)&& ballY<=(sp1+60)){
          richtung=5;
        }else if(ballY>=(sp1+61)&& ballY<=(sp1+100)){
          richtung=4;
        }
      }else if((ballX+10)==850 && ballY>=sp2 && ballY<=(sp2+100)){
        //Abbrallen in verschiedene Richtungen
        if(ballY >=sp2 && ballY<=(sp2+39)){
          richtung=1;
        }else if(ballY>=(sp2+40)&& ballY<=(sp2+60)){
          richtung=2;
        }else if(ballY>=(sp2+61)&& ballY<=(sp2+100)){
          richtung=3;
        }
      }else{
        if(ballX+10==850){
          standSp1++;
          this.Sp1Stand(g,standSp1);
          counter = 3;
          while(counter>0){
            counterStr=String.valueOf(counter);
            g.drawString(counterStr,500,500);
          
            //g.clearRect(500,500,50,50);
            counter--;
          }
          ballX=860;
          ballY=460;
          sp1=410;
          sp2=410;
          richtung=2;
        }else if(ballX==50){
          standSp2++;
          this.Sp2Stand(g,standSp2);
          counter= 3;
          while(counter>0){
            counterStr=String.valueOf(counter);
          //  g.clearRect(500,500,50,50);
            g.drawString(counterStr,500,500);

            
            counter--;
          }
          ballX=50;
          ballY=460;
          sp1=410;
          sp2=410;
          richtung=5;
        }
      }
     
    }
  }
   
  public void Sp1Stand(Graphics h,int Stand){
    String spielstand =String.valueOf(Stand);
   
    h.clearRect(350,55,70,70);
    h.setColor(Color.WHITE);
    h.setFont(new Font("Arial",Font.BOLD,70));
    h.drawString(spielstand,350,125);
  }
 
  public void Sp2Stand(Graphics e,int Stand){
    String spielstand =String.valueOf(Stand);
   
    e.clearRect(450,55,70,70);
    e.setColor(Color.WHITE);
    e.setFont(new Font("Arial",Font.BOLD,70));
    e.drawString(spielstand,450,125);
  }

  public void keyPressed(KeyEvent e){
    this.steu='\0';
    if(e.getKeyCode()==KeyEvent.VK_A){
      this.steu='a';
    }else if(e.getKeyCode()==KeyEvent.VK_Y){
      this.steu='y';
    }else if(e.getKeyCode()==KeyEvent.VK_NUMPAD9){
      this.steu='9';
    }else if(e.getKeyCode()==KeyEvent.VK_NUMPAD6){
      this.steu='6';
    }
  }
 
  public void keyReleased(KeyEvent e){
    this.steu='\0';

  }
 
  public void keyTyped(KeyEvent e){

  }
}
```


----------



## Marco13 (16. Jun 2007)

*NICHT 'getGraphics' AUFRUFEN!!!*


----------



## Gast (ein anderer) (5. Jul 2007)

was dann? ich brauche das getGraphics für die Doppelpufferung. gibt es da eine alternative? was ist das problem an getGraphics? 

gruß jim


----------



## merlin2 (5. Jul 2007)

Zu der Frage gibt es ein Tutorial.


----------



## Gast (ein anderer) (6. Jul 2007)

da wird es sicher auch mehrere geben.. 
danke für die schnelle hilfe.


----------

