2D游戏平铺碰撞检测
本文关键字:碰撞检测 游戏 2D | 更新日期: 2023-09-27 18:11:57
我有这样的东西:
// checking on which tile are players corners
// ignore this big mess below, please. It can be put in smaller
// equations, but for now it does its job
left_downX = ((int)Position.X) / 32 * 32 / 32 - map.mapOffsetX / 32 * 32 / 32;
left_downY = ((int)Position.Y + height) / 32 * 32 / 32 - map.mapOffsetY / 32 * 32 / 32;
right_downX = ((int)Position.X + width) / 32 * 32 / 32 - map.mapOffsetX / 32 * 32 / 32;
right_downY = ((int)Position.Y + height) / 32 * 32 / 32 - map.mapOffsetY / 32 * 32 / 32;
left_upX = ((int)Position.X) / 32 * 32 / 32 - map.mapOffsetX / 32 * 32 / 32;
left_upY = ((int)Position.Y) / 32 * 32 / 32 - map.mapOffsetY / 32 * 32 / 32;
right_upX = ((int)Position.X + width) / 32 * 32 / 32 - map.mapOffsetX / 32 * 32 / 32;
right_upY = ((int)Position.Y) / 32 * 32 / 32 - map.mapOffsetY / 32 * 32 / 32;
// checking if there is collision and responding to it
if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air &&
map.mapData[left_upX, left_upY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.A))
{
Speed.X = playerSpeed;
Direction.X = MOVE_LEFT;
}
}
if (map.mapData[right_downX, right_downY] == (int)Map.Tiles.air &&
map.mapData[right_upX, right_upY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.D))
{
Speed.X = playerSpeed;
Direction.X = MOVE_RIGHT;
}
}
if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air &&
map.mapData[right_downX, right_downY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.S))
{
Speed.Y = playerSpeed;
Direction.Y = MOVE_DOWN;
}
}
if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air &&
map.mapData[right_downX, right_downY] == (int)Map.Tiles.air)
{
if (keyboardState.IsKeyDown(Keys.W))
{
Speed.Y = playerSpeed;
Direction.Y = MOVE_UP;
}
}
当它看起来正常工作时,它没有。例如,当玩家与地面碰撞时,它会停留在地面上,不能移动到任何方向。这与只与侧面的瓷砖碰撞时类似,但在那里,你可以移动到不同的一侧。
我做错了什么?也许有更好的方法来检查碰撞而不用遍历所有贴图?
你的代码的前8行应该被替换为一个矩形对象,它应该与你的Sprite的大小/位置相同。
然后你可以调用矩形。