用户按下键时创建移动对象(Java)

时间:2012-06-06 01:24:43

标签: java animation acm-java-libraries

我的程序的想法是创建一个图片并让图片在图形窗口中向上移动,这正是rollBall()方法的作用。当我将rollBall()方法放在run()方法中时,该方法有效。但问题在于,当我将rollBall()方法放在keyPressed()方法中时,它无法运行。

我正在使用acm.jar库,因为它是一个非常容易创建Java图形程序的有用工具。

有人可以指出我正确的方向。

这是我的代码......

import java.awt.Color;
import java.awt.event.KeyEvent;

import acm.graphics.GImage;
import acm.graphics.GOval;
import acm.program.GraphicsProgram;
import acm.util.RandomGenerator;

public class BallDrop extends GraphicsProgram {

    /** width and height of application window in pixels */
    public static final int APPLICATION_WIDTH = 900;
    public static final int APPLICATION_HEIGHT = 768;

    private static final double GRAVITY = 1;

    /** Radius of the ball in pixels */
    private static final int BALL_RADIUS = 50;
    private static final int WIDTH = APPLICATION_WIDTH;

    public void run() {         
        setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
        addKeyListeners();
    }

    public void keyPressed(KeyEvent e){ 
        char linkMoveRightKey = e.getKeyChar();
        if(linkMoveRightKey == 'z'){
            rollBall();
        }   
     }

     private void rollBall(){
         setup_Ball();          
         game_Loop();
     }

    private void setup_Ball(){
         pic = new GImage("link.png");
         add(pic,gameBallInitialLocationX, gameBallInitialLocationY);
    }

    private void game_Loop(){
         while(pic.getX() > 0 ){            
              move_Ball();
              pause(DELAY);
         }
    }

    private void move_Ball() {
         ballVelocityX = 0;
         ballVelocityY -= GRAVITY;
         pic.move(ballVelocityX, ballVelocityY);
    }

    private RandomGenerator rgen = RandomGenerator.getInstance();
    private GImage pic;
    private int gameBallInitialLocationX = 500;
    private int gameBallInitialLocationY = 500;
    private int ballVelocityX = (int) rgen.nextDouble(3.0, 5.0);
    private int ballVelocityY =10;
    private static final int DELAY = 50;
 }

1 个答案:

答案 0 :(得分:1)

我刚刚阅读了手册,我的理解是你说错了方法:

不要调用run()方法,而是定义init()方法。

此外setup_Ball()应位于init()内,而不是rollBall()内 - 您只想在程序启动时初始化球,而不是每次按下键时初始化球。

而不是run()定义init()而是从setup_Ball()方法移除rollBall()

public void init() {
    setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
    setup_Ball();
    addKeyListeners();
}

注意:如果希望在程序启动时显示某些动画而不等待按下按键,则可以使用run()方法。在这种情况下,您可以在run()

中调用相应的方法