Java 2D碰撞?

嘿家伙我正在制作一个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)); } } } 

使用此代码,如果您按下一个按钮,但如果按下并离开,例如播放器将以某个随机方向飞行,它可以正常工作。

这是我所拥有的地图类型的图片:

在此处输入图像描述

你的主要问题是假设玩家直接跑到墙上。 考虑有一个墙壁矩形(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(); } 

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