【问题标题】:How do I stop an animation once a certain barrier has been reached?达到某个障碍后如何停止动画?
【发布时间】:2016-08-12 08:25:51
【问题描述】:

今天困扰我的问题就是这样。我正在创建一个允许用户向左或向右跳转和移动的程序,问题是每当我尝试跳转时,程序就会冻结......我的代码背后的想法很简单,只要用户按下空格(跳转)矩形“跳”起来,如果矩形的 y 在障碍物上方的某个高度内(在这种情况下,矩形的尺寸为brickx,bricky,brickw,brickw 是障碍物),那么动画应该停止并且矩形应该在障碍物顶部等待下一个命令。为此,在 while 循环的每次迭代中都会调用一个方法 stayOnBrick 并进行检查;在跳转期间,如果 y 在所需范围内,并且如果 y 在所需范围内,则设置 boolean jump = 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;}
    }
}  

【问题讨论】:

    标签: java animation keylistener


    【解决方案1】:

    每当我尝试跳转时,程序就会冻结

    我会先查看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 很有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多