Столкновение системы для объекта? - PullRequest
1 голос
/ 23 апреля 2011

Я делаю небольшую игру, 2D, и у меня есть игрок.

EDIT:

Это то, что у меня сейчас есть:

        int oldX = player.x;
    int oldY = player.y;

    int newX = oldX - player.getSpeedX();
    int newY = oldY - player.getSpeedY();

    if(player.getBounds().intersects(brush1.getBounds())){
        player.x = newX;
        player.y = newY;
    }else{
        player.x = oldX;
        player.y = oldY;
    }

Но он действует очень странно, он меняет скорость, когда я вхожу с одной стороны и т. Д.

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

Для формулы и кода, который проверяет пересечение отрезка и окружности, взгляните на этот SO ответ .

Остальная часть кода должна быть достаточно ясной, прежде чем сделать ход, проверьте, не произошло ли столкновение, если это произойдет.

В зависимости от предпочитаемого вами поведения, вы также можете подойти как можно ближе к стене, а затем двигаться параллельно ей, чтобы круг «скользил» вдоль стены. Это можно сделать, спроецировав вектор движения на линию в том же направлении, что и стена.

РЕДАКТИРОВАТЬ: Некоторые комментарии о том, как использовать код из ответа для проверки на столкновения:

В коде используется функция Dot, которая вычисляет точечное произведение из двух векторов. Вы можете создать класс Vector (хорошее упражнение, которое полезно для таких проектов) или вычислить только точечный продукт, используя формулы здесь .

Векторный класс облегчит чтение некоторого кода, но вы также можете напрямую работать с плавающей точкой. Например, давайте посмотрим на вычисление d (Вектор направления луча) и f (Вектор от центральной сферы к началу луча), как описано в начале ответа. С векторным классом это будет так же просто, как и используемыми здесь формулами:

// L, E, C, d and f are of some vector type
d = L - E;
f = E - C;

Без векторного класса вы будете иметь отдельные координаты x / y для всех переменных, немного раздувая код, но делая то же самое:

// Twice as much variables, but all of them are usual floats.
dx = Lx - Ex;
dy = Ly - Ey;
fx = Ex - Cx;
fy = Ey - Cy;
0 голосов
/ 25 апреля 2011

Я думаю, что в вашем фрагменте кода есть несколько ошибок. Предлагаемые исправления:

int oldX = player.x;
int oldY = player.y;

// *add* speed to old pos to get new pos
int newX = oldX + player.getSpeedX();
int newY = oldY + player.getSpeedY();

if(player.getBounds().intersects(brush1.getBounds())){
    // Collision!  Keep old position.
    // Reverse speed (just a suggestion).
    player.setSpeedX(-player.getSpeedX());
    player.setSpeedY(-player.getSpeedY());
}else{
    // No collision.  Set position to *new* pos, not old pos.
    player.x = newX;
    player.y = newY;
}
...