Pong klon mit Steuerungsprobleme

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Ich mache als Projekt einen Pong Klon.
Aber bei mir will einfach die Steuerung nicht Funktionieren.
Code:
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

Top Contributor
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:
 
G

Gast

Gast
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

Top Contributor
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

Bekanntes Mitglied
Hi,

mit
Code:
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: )


Code:
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){

  }
}
 
G

Gast (ein anderer)

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

gruß jim
 
G

Gast (ein anderer)

Gast
da wird es sicher auch mehrere geben..
danke für die schnelle hilfe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Pong-Klon. Denkfehler bei kollisionstest Spiele- und Multimedia-Programmierung 3
G Pong-Klon (Applet!) Spiele- und Multimedia-Programmierung 4
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
Y Ping Pong Spiele- und Multimedia-Programmierung 4
M Einfaches Ping-Pong Spiel Spiele- und Multimedia-Programmierung 3
U Pong Spiele- und Multimedia-Programmierung 7
1 Ping Pong langsam Spiele- und Multimedia-Programmierung 13
BattleMaster246 Pong - JOGL Spiele- und Multimedia-Programmierung 2
J ping pong ball abprallen lassen Spiele- und Multimedia-Programmierung 12
L Java Ping Pong Spiele- und Multimedia-Programmierung 1
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
D Java Pong Probleme Spiele- und Multimedia-Programmierung 7
S Ping Pong: KeyListener in Paint und while Spiele- und Multimedia-Programmierung 10
W Hilfe bei Pong mit Bluej Spiele- und Multimedia-Programmierung 4
M Fragen zu meinem Pong-Clone Spiele- und Multimedia-Programmierung 6
G Ping Pong Frage Spiele- und Multimedia-Programmierung 17
L Probleme Bei Pong Programmierung Spiele- und Multimedia-Programmierung 2
N Pong - noch 2 kleinere Probleme Spiele- und Multimedia-Programmierung 16
B Ping Pong Spiele- und Multimedia-Programmierung 11
R Ping Pong Spiel Fehlermeldung Spiele- und Multimedia-Programmierung 12
H Performance check Pong Spiele- und Multimedia-Programmierung 19
R Ping Pong Spiel Spiele- und Multimedia-Programmierung 28
B noch ein snake klon Spiele- und Multimedia-Programmierung 2
J Moorhuhn-Klon - Nur das 1. Huhn ist "treffbar" Spiele- und Multimedia-Programmierung 8
S Minesweeper Klon Spiele- und Multimedia-Programmierung 10
G Kollisionsabfrage (Mario klon) Spiele- und Multimedia-Programmierung 6
$ problem bei pon klon Spiele- und Multimedia-Programmierung 2
G Breakout-Klon (Applet!) Spiele- und Multimedia-Programmierung 18

Ähnliche Java Themen

Neue Themen


Oben