在 Java 中单击鼠标时移动球



我正在尝试创建经典的突破游戏作为编程任务的一部分。我必须在用户的鼠标单击上开始移动球。所以我正在使用鼠标侦听器来实现这一点。下面的代码只是我正在尝试做的一个更小、更简单的版本。但它不会逐步移动球。它只是在 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:这是我的第一个问题,我是编程新手。如果可以的话,对我放轻松。:)

可能只是你没有显示所有代码,但你应该有一个实现 MouseListener 的类。仅仅使用鼠标单击方法不足以让 java 认识到这是您的意图;这里有一个教程提供了更多详细信息:http://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html

一个概念性的解决方案可能是添加一个线程类,该线程类可以访问所有对象位置(至少在您的情况下是球)。此线程必须能够刷新 GraphicsProgram 类的画布。您可以为此线程提供 30Hz 的刷新频率,使其在每次刷新后休眠 33 毫秒。如果您需要有关如何刷新画布的更多详细信息,则应向我们提供更多详细信息。

使用此类解决方案,您还需要在while循环中休眠 33 毫秒。

使用以下代码:

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;
}

相关内容

  • 没有找到相关文章

最新更新