如何解决碰撞代码中出现口吃当代码有效时,播放器对象在碰撞前会停止一秒钟单人游戏
这是我的碰撞代码。问题在于代码使对象轻松进入墙壁,而不是在墙壁前停止。
https://imgur.com/a/Mk0XfTY 问题视频。
private void CheckCollisionsAndMove(Map map)
{
collided = Rectangle.Empty;
///Walls
tPos = position;
//Check X
position.X += move.X;
for (int i = 0; i<map.walls.Count; i++)
{
collided = map.CheckCollision(BoundingBox);
}
position = tPos;
if (collided != Rectangle.Empty)
{
while (collided == Rectangle.Empty)
{
position.X += (move.X / System.Math.Abs(move.X));
for (int i = 0; i < map.walls.Count; i++)
{
collided = map.CheckCollision(BoundingBox);
}
}
//position.X -= (move.X / System.Math.Abs(move.X));
move.X = 0;
decide.X = 0;
}
//Position
position.X += move.X;
//Check Y
collided = Rectangle.Empty;
position.Y += move.Y;
for (int i = 0; i < map.walls.Count; i++)
{
collided = map.CheckCollision(BoundingBox);
}
position.Y = tPos.Y;
if (collided != Rectangle.Empty)
{
while (collided == Rectangle.Empty)
{
position.Y += (move.Y / System.Math.Abs(move.Y));
for (int i = 0; i < map.walls.Count; i++)
{
collided = map.CheckCollision(BoundingBox);
}
}
//position.Y -= (move.Y / System.Math.Abs(move.Y));
move.Y = 0;
decide.Y = 0;
}
//Position
position.Y += move.Y;
}
在此先感谢我让我盯着这个看一个小时。
解决方法
我不是 100% 确定到底发生了什么,因为我没有看到您实际如何处理例如速度,但我能看到的是您的 if 语句内部有问题。 while (collided == Rectangle.Empty)
中的语句永远不会被调用,因为 if 条件仅在 collided != Rectangle.Empty
时计算为真。这意味着在 if、collided 内部永远不会是 Rectangle.Empty,所以整个 while 循环永远不会被利用并且 position.y 不会改变。这也意味着,如果在某一时刻检测到碰撞,您的实体的 move.Y 将始终为 0,并且不会移动。考虑到您的实体仍然在移动这一事实,我会假设速度在其他地方重置,并且下一次迭代未检测到碰撞(可能是因为速度降低,因此碰撞距离不同?)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。