繁体   English   中英

在Java中通过单击鼠标移动球

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM