我正在尝试创建经典的Breakout游戏,作为我编程任务的一部分。我必须从用户点击鼠标开始移动球。所以我正在使用mouselistener来实现这一目标。下面的代码只是我正在尝试做的一个更小,更简单的版本。但它并没有逐步移动球。它只是在while循环执行完毕后将球显示在它的最终位置。
import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class BallMoveTest extends GraphicsProgram {
public void run() {
ball = new GOval(20,20);
ball.setFilled(true);
add(ball, 100, 100);
addMouseListeners();
}
public void mouseClicked(MouseEvent e) {
while (counter < 100) {
moveBall();
counter++;
pause(20);
}
}
public void moveBall(){
ball.move(2, 2);
}
// Private instance variables
private GOval ball;
private int counter = 1;
}
然而,这个备用代码效果非常好,但不允许用户点击开始移动球。
import acm.program.*;
import acm.graphics.*;
public class TestGOval extends GraphicsProgram {
public void run() {
int counter = 1;
GOval ball = new GOval(20,20);
ball.setFilled(true);
add(ball,100,100);
while (counter < 100) {
ball.move(2, 2);
counter++;
pause(20);
}
}
}
有人可以指出我在这里做错了什么,更重要的是,为什么第一个代码块无法正常工作?
PS:这是我的第一个问题,我是编程的新手。如果可以,请轻松告诉我。 :)
答案 0 :(得分:0)
一个概念性的解决方案可能是添加一个可以访问所有对象位置的线程类(至少在你的情况下是球)。该线程必须能够刷新GraphicsProgram类的画布。您可以为此线程提供30Hz的刷新频率,使其在每次刷新后休眠33ms。 如果您需要有关如何刷新画布的更多详细信息,请向我们提供更多详细信息。
使用此类解决方案,您还需要将33 ms的睡眠时间放入while
循环中。
答案 1 :(得分:0)
可能只是您没有显示所有代码,但是您应该有一个实现MouseListener的类。仅仅使用鼠标单击方法是不足以让java认识到这是你的意图;这里有一个更详细的教程:http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html
答案 2 :(得分:0)
使用此代码:
import acm.graphics.*;
import acm.program.*;
import acm.util.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class BallMoveTest extends GraphicsProgram {
public void run() {
ball = new GOval(20,20);
ball.setFilled(true);
add(ball, 100, 100);
addMouseListeners();
waitForClick();
animation();
}
public void animation() {
while(counter<100){
moveBall();
pause(DELAY);
}
}
public void moveBall(){
ball.move(2, 2);
}
// Private instance variables
private GOval ball;
private int counter = 1;
private int DELAY=20;
}