Java 2D Collision? - PullRequest
       1

Java 2D Collision?

0 голосов
/ 14 октября 2011

Эй, ребята, я делаю 2D-Java-игру и пытаюсь понять, как создать хороший код столкновения.В настоящее время я использую следующий код:

    public void checkCollision() {
    Rectangle player_rectangle = new Rectangle(player.getX(),player.getY(),32,32);

    for(Wall wall : walls) {

        Rectangle wall_rectangle = new Rectangle(wall.getX(), wall.getY(), 32,32);

        if (player_rectangle.intersects(wall_rectangle)) {
            Rectangle intersection = (Rectangle) player_rectangle.createIntersection(wall_rectangle);

            if (player.xspeed > 0) {
                player.x -= intersection.getWidth();
            }

            if (player.yspeed > 0) {
                player.y -= intersection.getHeight();
            }

            if (player.xspeed < 0) {
                player.x += intersection.getWidth();
            }

            if (player.yspeed < 0) {
                player.y += intersection.getHeight(); 
            }

            Print(Integer.toString(intersection.width) + ", " + Integer.toString(intersection.height));

        }

    }

}

С этим кодом все работает нормально, если вы нажмете одну кнопку, но если, например, нажать вниз и влево, игрок улетит в каком-то случайном направлении.

Вот изображение типов карт, которые у меня есть:

enter image description here

1 Ответ

1 голос
/ 14 октября 2011

Ваша основная проблема заключается в предположении, что игрок бежит прямо в стену.Рассмотрим случай, когда есть прямоугольник стены (100,100,32,32), а игрок находится на (80,68,32,32).Игрок движется вниз и влево, поэтому player.xspeed <0 и player.yspeed> 0;скажем, следующая позиция для игрока (79,69,32,32).Пересечение тогда (100,100,11,1).

Обратите внимание, что хотя игрок движется влево (и вниз), стена фактически находится справа от игрока.Эта строка:

if (player.xspeed < 0) {
    player.x += intersection.getWidth();
}

... заставляет player.x быть внезапно установленным на 90.

Одна вещь, которую вы можете сделать, это проверить, что левая сторона игрока быласодержится в пересечении, т. е.

if (player.xspeed < 0 && player.x >= intersection.x) {
    player.x += intersection.getWidth();
}

Очевидно, что аналогичное действие необходимо выполнить и для других направлений.

...