1

壁にぶつかり始めるとランダムな方向に動くイメージがあります。実行中、画像は常に左上隅から開始または表示されます。私のコードで確認できます。実行中に画像をランダムな位置に表示したいのですが、それが私の問題です。誰かがこれについてアイデアをくれますか? 前もって感謝します。

public class Ball extends JPanel implements Runnable
{

private Image ball;
private Thread animator;
private int x, y;
private final int DELAY = 20;
private int speedX = 1;
private int speedY = 1;
private static final int RIGHT_WALL = 200;
private static final int LEFT_WALL = 1;
private static final int DOWN_WALL = 200;
private static final int UP_WALL = 1;

public Ball()
{
    setBackground(Color.BLACK);
    setDoubleBuffered(true);

    ImageIcon ii = new ImageIcon(this.getClass().getResource("ball.gif"));
    ball = ii.getImage();

    x = y = 10;
}

public void addNotify()
{
    super.addNotify();
    animator = new Thread(this);
    animator.start();
}

public void paint(Graphics g)
{
    super.paint(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(ball, x, y, this);
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

public void move()
{
    x += speedX;
    y += speedY;
    if (x >= RIGHT_WALL)
    {
        x = RIGHT_WALL;
        moveRandomDirection();
    }
    if (y > DOWN_WALL)
    {
        y = DOWN_WALL;
        moveRandomDirection();
    }
    if (x <= LEFT_WALL)
    {
        x = LEFT_WALL;
        moveRandomDirection();
    }
    if (y < UP_WALL)
    {
        y = UP_WALL;
        moveRandomDirection();
    }
}

public void moveRandomDirection()
{
    double direction = Math.random() * 2.0 * Math.PI;
    double speed = 10.0;
    speedX = (int) (speed * Math.cos(direction));
    speedY = (int) (speed * Math.sin(direction));
}

public void run()
{
    long beforeTime, timeDiff, sleep;
    beforeTime = System.currentTimeMillis();
    while (true)
    {
        move();
        repaint();

        timeDiff = System.currentTimeMillis() - beforeTime;
        sleep = DELAY - timeDiff;

        if (sleep > 2)
        {
            sleep = 1;
        }
        try
        {
            Thread.sleep(sleep);
        }
        catch (InterruptedException e)
        {
            System.out.println("interrupted");
        }

        beforeTime = System.currentTimeMillis();
    }
}
}
4

2 に答える 2

1

これはランダムな場所をカバーしています:

ボールが出現できる領域を計算する:

int x = RIGHT_WALL - LEFT_WALL;
int y = DOWN_WALL - UP_WALL;

ボールのサイズを引きます:

x -= ball.getWidth(null);
y -= ball.getHeight(null);

ランダムな場所を選択してください:

Random r = new Random(); // java.util.Random
x = r.nextInt(x);
y = r.nextInt(y);

座標を壁の左上隅の始点に移動します。

x += LEFT_WALL;
y += UP_WALL;

現在xyは、ボールが現れる有効な位置です。

:ここで使用されているxyI はクラス メンバーではないことに注意してください。これらはローカル変数であると想定されています。


ランダムな方向のアルゴリズムを自分で解決したようです。


あなたの方法には間違いがありますmove(): 衝突をチェックするとき、ボールのサイズは気にしません。はif次のようになります。

if (x + ball.getWidth(null) >= RIGHT_WALL)
{
    x = RIGHT_WALL - ball.getWidth(null);
    moveRandomDirection();
}
if (y + ball.getHeight(null) >= DOWN_WALL)
{
    y = DOWN_WALL - ball.getHeight(null);
    moveRandomDirection();
}
if (x <= LEFT_WALL)
{
    x = LEFT_WALL;
    moveRandomDirection();
}
if (y <= UP_WALL)
{
    y = UP_WALL;
    moveRandomDirection();
}
于 2011-11-01T08:31:37.840 に答える
0

コンストラクターでx=y = 10の代わりに、ランダムな値を生成することもできます。これを行うには、 java.util.Randomクラスを使用します。nextIntメソッドを見てください。パラメータを使用して、そこで最大値を設定できます。

于 2011-11-01T08:35:01.750 に答える