Java 2D碰撞?

时间:2011-10-14 05:02:08

标签: java 2d collision-detection

嘿伙计们我正在制作一个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 个答案:

答案 0 :(得分:1)

你的主要问题在于假设玩家直接跑到墙上。考虑有一个墙壁矩形(100,100,32,32)并且玩家位于(80,68,32,32)的情况。玩家向下移动到左边,所以player.xspeed&lt; 0和player.yspeed&gt; 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();
}

显然,其他方面也需要做类似的事情。