Die heutige Frage rasselt mir in den Sinn. Ich erstelle ein Programm, das dem Benutzer erlaubt, nach links oder rechts zu springen und zu springen. Das Problem ist, dass jedes Mal, wenn ich versuche zu springen, das Programm einfriert ... Die Idee hinter meinem Code ist einfach, wann immer der Benutzer das Leerzeichen drückt (springt) Das Rechteck "springt" nach oben und wenn sich das y des Rechtecks innerhalb einer bestimmten Höhe über dem Hindernis befindet (in diesem Fall ist ein Rechteck mit den Dimensionen brickx, bricky, brickh und brickh das Hindernis), soll die Animation stoppen und das Rechteck soll auf den nächsten Befehl warten, während er oben auf dem Hindernis steht. Dazu wird stayOnBrick während jeder Iteration der while-Schleife aufgerufen und überprüft; während des Sprungs, wenn y innerhalb des benötigten Bereichs ist, und wenn y es ist, dann setzt der boolesche Sprung = true, was die Schleife bei der nächsten Iteration unterbrechen und y auf den benötigten Wert setzen sollte. Aber wenn der Raum gedrückt wird, passiert nichts, oder sollte ich sagen, das Programm friert ein. Gedanken?Wie kann ich eine Animation anhalten, nachdem eine bestimmte Barriere erreicht wurde?
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyTest extends Core implements KeyListener{
Window w;
public int x,y;
boolean jump = true;
public int brickx, bricky, brickw, brickh;
public static void main(String args[]){
new KeyTest().run();
}
private String mess = "";
//init also called init from superclass
public void init(){
super.init();
Window w = s.getFullScreenWindow();
w.setFocusTraversalKeysEnabled(false);
w.addKeyListener(this);
y = s.getHeight()-15;
mess = "Press esc to exit";
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
e.consume();
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_ESCAPE){
stop();
}else if(keyCode == KeyEvent.VK_SPACE){
mess = "Pressed: " + KeyEvent.getKeyText(keyCode);
while(y>s.getHeight()-200){
stayOnBrick();
if(jump==false){break;}
else{ try{
y-=20;
w.repaint();
Thread.sleep(40);
}catch(Exception jumpError){
System.out.println("Error in Jumping");
}
}
while(y<s.getHeight()-15){
stayOnBrick();
if(jump==false){
w.repaint();
break;}
else{
try{
y+=20;
Thread.sleep(40);
w.repaint();
}catch(Exception jumpError){
System.out.println("Error in Jumping");
}
}
}
}
}
else if(keyCode == e.VK_RIGHT){
if(x>=s.getWidth()-30){x=s.getWidth()-30;}
x+=20;
w.repaint();
}
else if(keyCode == e.VK_LEFT){
if(x<=0){x=0;}
x-=20;
w.repaint();
}
e.consume();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int keyCode = e.getKeyCode();
mess = "Released: " + KeyEvent.getKeyText(keyCode);
jump = true;
e.consume();
}
@Override
public synchronized void draw(Graphics2D g){
brickx=0; bricky=s.getHeight()-100; brickw=300; brickh=20;
Window w = s.getFullScreenWindow();
g.setColor(w.getBackground());
g.fillRect(0, 0, s.getWidth(), s.getHeight());
g.setColor(w.getForeground());
g.fillRect(x, y, 30, 15);
g.drawString(mess, 30, 30);
g.setColor(Color.BLUE);
g.fillRect(brickx, bricky, brickw, brickh);
}
public void stayOnBrick(){
if(y<bricky && y>bricky-30){
y=bricky-15;
jump = false;
}
else{jump = true;}
}
}