簡體   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