Как сделать случайное направление? - PullRequest
1 голос
/ 01 ноября 2011

У меня есть изображение, которое движется в случайном направлении, когда оно начинает ударяться о стену.Изображение всегда начинается или появляется в левом верхнем углу во время выполнения, вы можете увидеть это в моем коде.Теперь я хочу, чтобы изображение появлялось в произвольном положении во время выполнения, и это моя проблема, может кто-нибудь дать мне представление об этом?Заранее спасибо.

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

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Это охватывает случайное местоположение :

Вычислить область, в которой разрешено появляться мячом:

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;

Теперь x и y - допустимые позиции для появления мяча.

Примечание : Помните, что x и y, которые я здесь использовал, НЕ ваших учеников. Предполагается, что это локальные переменные.


Похоже, вы сами решили алгоритм для случайного направления.


В вашем методе move() есть ошибка: вам не важен размер шара при проверке на столкновение. if s должно выглядеть так:

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();
}
0 голосов
/ 01 ноября 2011

Вместо x = y = 10 в вашем конструкторе вы также можете генерировать случайные значения.Я бы использовал java.util.Random класс, чтобы сделать это.Посмотрите на следующий метод.Вы можете установить максимальное значение там, используя параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...