Java Гладкий 2D прямоугольник столкновения? - PullRequest
1 голос
/ 13 октября 2011

Привет, ребята, я играю в лабиринт и пытаюсь понять, как сделать 2D-столкновение плавным.В настоящее время у меня есть какой-то очень плохой код столкновения, который я придумал, так как я еще не выполнил эту часть, и он глючит и иногда выходит за стену, тогда вы не можете выйти.

Мой код:

    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)) {
            if(player.xspeed == 1) {
                player.xspeed = 0;
                player.x -= 1.2;
            } else {

                if(player.xspeed == -1) {
                    player.xspeed = 0;
                    player.x += 1.2;
                }
                else
                    if(player.yspeed == 1) {
                        player.yspeed = 0;
                        player.y -= 1;
                    } else {
                        if(player.yspeed == -1) {
                            player.yspeed = 0;
                            player.y += 1;
                        }
                    }

            }
        }

    }

}

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

enter image description here

РЕДАКТИРОВАТЬ:

Новый код столкновения:

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

        }

Код движения:

    public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();

    if(key == KeyEvent.VK_LEFT) {

        xspeed = -1;

    } else {
        if(key == KeyEvent.VK_RIGHT) {

                xspeed = 1;

        } else {
            if(key == KeyEvent.VK_UP) {
                yspeed = -1;
            } else {
                if(key == KeyEvent.VK_DOWN) {
                    yspeed = 1;
                }
            }
        }
    }
}

Спасибо за любую помощь, которую вы можете мне оказать.

1 Ответ

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

Вы можете использовать Rectangle.createIntersection(Rectangle).

Если игрок движется в положительном направлении, просто вычтите ширину и высоту полученного Rectangle из своей позиции, если он перемещается в отрицательное, добавьте их.

Не устанавливайте скорость на ноль, это может привести к зависанию проигрывателя.

РЕДАКТИРОВАТЬ

if (playerRectangle.intersects(wallRectangle) {
    Rectangle intersection = (Rectangle) playerRectangle.createIntersection(wallRectangle);

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

РЕДАКТИРОВАТЬ2

Насколько я знаю, keyPressed срабатывает только при нажатии клавиши, а не при ее отпускании.Попробуйте это так:

private boolean up, down, left, right;

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KEyEvent.VK_UP) {
        up = true;
    }

    ...
}

public void keyReleased(KeyEvent e) {
    if (e.getKeyCode() == KEyEvent.VK_UP) {
        up = false;
    }

    ...
}


// Call this in the mainthread
public void updateMovement() {
    if (up) {
        player.xspeed = 1;
    }

    ...
}

Таким образом, в каждом кадре вы обновляете движение, перемещаете игрока и затем проверяете столкновение.

...