0

プログラミングの課題の一環として、古典的なブレイクアウト ゲームを作成しようとしています。ユーザーのマウスクリックでボールを動かし始める必要があります。だから私はそれを達成するためにマウスリスナーを使用しています。以下のコードは、私がやろうとしていることの、より小さく単純なバージョンです。しかし、それはボールを徐々に動かしません。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: これは私の最初の質問です。私はプログラミングの初心者です。できれば、私に優しくしてください。:)

4

3 に答える 3

0

1 つの概念的な解決策は、すべてのオブジェクトの位置 (少なくともこの場合はボール) にアクセスできるスレッド クラスを追加することです。このスレッドは、GraphicsProgram クラスのキャンバスを更新できる必要があります。このスレッドに 30 Hz のリフレッシュ頻度を与えると、各リフレッシュ後に 33 ミリ秒スリープ状態になります。キャンバスを更新する方法の詳細が必要な場合は、詳細をお知らせください。

whileこのようなソリューションでは、ループに 33 ミリ秒のスリープを入れる必要もあります。

于 2013-12-28T12:12:58.447 に答える