Java BounceBall Ball Move

1

У меня есть вопрос. Я не могу заставить шары уйти от указателя мыши. Все шары идут в левый угол, когда указатель мыши входит в экран. Что я делаю не так? Какие-нибудь советы??

Мой полный код: событие мыши Java BounceBall

Или

http://ideone.com/vTGzb7

Метод с проблемой:

public void move(Ball ball, Point mouse) {

    try {
        Point p = ball.getLocation();
        Point speed = ball.getSpeed();
        Dimension size = ball.getSize();

        int vx = speed.x;
        int vy = speed.y;

        int x = p.x;
        int y = p.y;

        // ----------------------
        if (mouse != null) {

            int xDistance = Math.abs(x + size.width - mouse.x);
            int yDistance = Math.abs(y + size.height - mouse.y);

            if (xDistance < yDistance) {
                if (x + size.width < mouse.x) {
                    if (vx > 0) {
                        vx *= -1;
                    }
                } else {
                    if (vx > 0) {
                        vx *= -1;
                    }
                }
            } else {
                if (y + size.height < mouse.y) {
                    if (vy > 0) {
                        vy *= -1;
                    }
                } else {
                    if (vy > 0) {
                        vy *= -1;
                    }
                }
            }

        }
        // ----------------------

        if (x + vx < 0 || x + size.width + vx > getParent().getWidth()) {
            vx *= -1;
        }
        if (y + vy < 0
                || y + size.height + vy > getParent().getHeight()) {
            vy *= -1;
        }
        x += vx;
        y += vy;

        ball.setSpeed(new Point(vx, vy));
        ball.setLocation(new Point(x, y));

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Для некоторых шаров он отлично работает. Они попали в указатель мыши и изменили ваше направление. Но большинство идет в угол экрана.

Спасибо.

  • 1
    Для более быстрой помощи, опубликуйте MCVE (Minial Complete Verifiable Example).
  • 0
    Я запустил программу, и движения кажутся достаточно случайными. Хорошая работа, кстати.
Показать ещё 6 комментариев
Теги:
swing

1 ответ

1
Лучший ответ

Задача решена...

Проблема: пузырьки были заблокированы в верхнем углу экрана. И не нажимайте указатель мыши.

Решение. Я вычислил расстояние от положения X и Y относительно диаметра пузырька и указателя мыши. Для столкновения.

int xDistance = Math.abs((x + (diameter / 2)) - mouse.x);
int yDistance = Math.abs((y + (diameter / 2)) - mouse.y);

Затем вычисляли радиус X и Y пузырьков.

int radiusX = (size.width / 2);
int radiusY = (size.height / 2);

Наконец, я изменил IF, чтобы проверить соотношение между расстоянием радиуса пузырька. Изменение направления.

if (xDistance <= radiusX && yDistance <= radiusY) {
    if (xDistance < yDistance) {
        vx *= -1;
    } else {
        vy *= -1;
    }

    System.out.println("Hit!");
}

Новый метод перемещения:

public void move(Ball ball, Point mouse) {

    try {
        Point p = ball.getLocation();
        Point speed = ball.getSpeed();
        Dimension size = ball.getSize();

        int diameter = ball.dimeter;

        int vx = speed.x;
        int vy = speed.y;

        int x = p.x;
        int y = p.y;

        int radiusX = (size.width / 2);
        int radiusY = (size.height / 2);

        // ----------------------

        if (mouse != null) {
            int xDistance = Math.abs((x + (diameter / 2)) - mouse.x);
            int yDistance = Math.abs((y + (diameter / 2)) - mouse.y);

            System.out.printf("b(%d, %d) m(%d, %d) dx(%d, %d)\n", x, y,
                    mouse.x, mouse.y, (x + vx) - mouse.x, (y + vy)
                            - mouse.y);

            if (xDistance <= radiusX && yDistance <= radiusY) {

                if (xDistance < yDistance) {
                    vx *= -1;
                } else {
                    vy *= -1;
                }

                System.out.println("Hit");
            }
        }

        if (x + vx < 0 || x + size.width + vx > getParent().getWidth()) {
            vx *= -1;
        }
        if (y + vy < 0
                || y + size.height + vy > getParent().getHeight()) {
            vy *= -1;
        }

        x += vx;
        y += vy;

        ball.setSpeed(new Point(vx, vy));
        ball.setLocation(new Point(x, y));

    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 0
    В чем была проблема и каково было решение?
  • 0
    @ErwinBolwidt Отредактировано. Более подробный ответ ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню