[英]Move a ball on mouse click in Java
我正在嘗試創建經典的Breakout游戲,並將其作為編程任務的一部分。 我必須從用戶的鼠標單擊開始移動球。 所以我正在使用鼠標監聽器來實現這一目標。 下面的代碼只是我嘗試做的一個更小,更簡單的版本。 但是,它不會逐步移動球。 在執行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:這是我的第一個問題,我是編程的新手。 如果可以的話,對我放松。 :)
一種概念上的解決方案是添加一個線程類,該類可以訪問所有對象位置(至少在您的情況下是球)。 該線程必須能夠刷新GraphicsProgram類的畫布。 您可以為該線程提供30Hz的刷新頻率,使其在每次刷新后休眠33ms。 如果您需要有關如何刷新畫布的更多詳細信息,則應向我們提供更多詳細信息。
使用這種解決方案,您還需要在while
循環中放置33 ms的睡眠while
。
可能只是您沒有顯示所有代碼,但是應該有一個實現MouseListener的類。 僅使用鼠標單擊方法還不足以讓Java識別出這是您的意圖。 這里有一個更詳細的教程: http : //docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html
使用此代碼:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.