簡體   English   中英

一旦達到特定的障礙,如何停止動畫?

[英]How do I stop an animation once a certain barrier has been reached?

今天困擾我的問題就是這樣。 我正在創建一個允許用戶向左或向右移動的程序,問題是,每當我嘗試跳轉時,程序都會凍結...代碼的想法很簡單,每當用戶按下空格鍵時,矩形“跳”起來,如果矩形的y在障礙物上方一定高度之內(在這種情況下,尺寸為brickx,bricky,brickw和brickh的矩形是障礙物),則動畫應該停止並且該矩形應該在障礙物上方時等待下一個命令。 為此,在while循環的每次迭代期間都會調用stayOnBrick方法並進行檢查; 在跳轉期間,如果y在所需范圍內,並且如果y為y,則將其設置為布爾跳轉= 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;}
    }
}  

每當我嘗試跳轉時程序凍結

由於問題的原因,我首先來看看Swing中的Concurrency

我建議看看如何使用Swing計時器作為可能的解決方案。

我還建議您看看如何使用鍵綁定來解決與KeyListener相關的焦點問題

您可能會發現如何在Java中使Sprite跳轉? JApplet創建了一個反彈的球,並逐漸降低了Java的高度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM