java - 一旦达到某个障碍,如何停止动画?

标签 java animation keylistener

今天困扰我的问题就是这样。我正在创建一个程序,允许用户跳跃并向左或向右移动,问题是每当我尝试跳跃时程序就会卡住...我的代码背后的想法很简单,每当用户按下空格(跳跃)时矩形“跳”起来,如果矩形的 y 位于障碍物上方一定高度内(在本例中,尺寸为 brickx、bricky、brickw 的矩形,brickh 是障碍物),则动画应该停止,并且矩形应该在障碍物顶部等待下一个命令。为此,在 while 循环的每次迭代期间调用stayOnBrick 方法并进行检查;在跳转过程中,如果 y 在所需的范围内,并且如果 y 是则设置 boolean 跳转 = true ,这应该在下一次迭代中打破循环并将 y 设置为所需的值。但是当按下空格时,什么也没有发生,或者我应该说程序卡住了。想法?

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

最佳答案

whenever I try to jump the program freezes

我首先看一下 Concurrency in Swing问题的原因。

我建议看看How to use Swing Timers寻找可能的解决方案。

我还建议您查看 How to Use Key Bindings使用 KeyListener

解决与焦点相关的问题

你可能会发现How to make sprite jump in java?JApplet creates a ball that bounces and gets progressively less high in Java有帮助

关于java - 一旦达到某个障碍,如何停止动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730577/

相关文章:

java - org.postgresql.*;类未找到错误

java - 我创建了一个类来显示对话框并调用 Activity main 中的函数,但它不起作用

javascript - 从左下到右上绘制复选标记CSS动画

java - KeyBindings 和 KeyListeners 之间的区别

java - keyTyped 使 JTextField 为空

java - 如何使用程序将切换按钮的状态从打开更改为关闭...?

java - 下载和存储图像

css - 背景尺寸封面不适用于 CSS 动画

iOS 核心动画 : Show and hide effect

java - 如何将 keyListner 添加到 JOptionPane.showInputDialog()?