2012-06-06 4 views
1

Идея моей программы заключается в создании изображения и увеличении этого изображения в графическом окне, что и делает метод rollBall(). Метод работает, когда я помещаю метод rollBall() в метод run(). Но проблема заключается в том, что он не может работать, когда я помещаю метод 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(), а также удалить setup_Ball() из rollBall() метода:

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

Примечание: Вы можете использовать метод run(), когда вы хотите, чтобы некоторые анимации появляться при запуске программы, не дожидаясь ключа, чтобы быть нажат. В этом случае вы можете вызвать соответствующие методы в run()

+1

Также см., Что при удалении 'setup_Ball()' из метода 'rollBall()' избыточность возникает с помощью 'rollBall()' и 'game_Loop()'. Вы можете просто реализовать процедуры в одном из них и вызвать этот метод в 'keyPressed()' – Subs

+0

спасибо за помощь – Nicholas

+0

Мне нужно 15 повторений для голосования. – Nicholas

Смежные вопросы