2012-06-06 35 views
1

我計劃的想法是創建一個圖片,並具有畫面在圖形窗口移動起來,這也正是rollBall()方法做什麼。當我在run()方法中使用rollBall()方法時,該方法起作用。但問題在於,當我將rollBall()方法放在keyPressed()方法中時,它無法運行。創建一個移動的物體時,用戶按下一個鍵(JAVA)

我用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; 
} 
+0

從未聽說過'acm'庫中的相應方法,但我一直在使用,在所有這些年來從無到有我自己的包。您是否閱讀手冊,是否需要在使用pic.move(ballVelocityX,ballVelocityY);' – Subs

+0

'移動後刷新任何容器,這是不需要的。 – Nicholas

回答

1

我只是閱讀手冊,這是我的理解是,你所呼叫的錯誤的方法:

而不是調用run()方法,定義init()方法。

另外,setup_Ball()應該是內部init(),而不是內部rollBall() - 你只需要初始化球的時候程序啓動而不是每一個鍵按下時。

所以不是run()定義init(),也從rollBall()方法去除setup_Ball()

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

注意:您可以使用run()方法,當你想一些動畫出現在程序啓動時無需等待關鍵是按下。在這種情況下,你可以調用run()

+1

也可以看到,當你從'rollBall()'方法中移除'setup_Ball()'時,''rollBall()'和'game_Loop()'會發生冗餘。你可以在其中的一個方法中實現方法例程,並在'keyPressed()' – Subs

+0

中調用該方法感謝您的幫助 – Nicholas

+0

我需要15個代表進行投票。 – Nicholas

相關問題