C# 冲突代码中的口吃。当代码运行时,播放器对象在碰撞前仅停止一秒钟。单一游戏
这是我的冲突代码。问题在于代码使对象容易进入墙,而不是在墙前停止 该问题的视频C# 冲突代码中的口吃。当代码运行时,播放器对象在碰撞前仅停止一秒钟。单一游戏,c#,game-engine,game-physics,collision,monogame,C#,Game Engine,Game Physics,Collision,Monogame,这是我的冲突代码。问题在于代码使对象容易进入墙,而不是在墙前停止 该问题的视频 private void CheckCollisionsAndMove(Map map) { collided = Rectangle.Empty; ///Walls tPos = position; //Check X position.X += move.X;
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;
}
private void CheckCollisionsAndMove(地图)
{
碰撞=矩形。为空;
///墙
tPos=位置;
//支票X
位置.X+=移动.X;
对于(int i=0;i我不能100%确定到底发生了什么,因为我看不到您实际上是如何处理例如速度的,但我可以看到的是,if语句内部有错误。while中的语句(collide==Rectangle.Empty)
将永远不会被调用,因为只有当碰撞!=Rectangle.Empty
时,if条件才会计算为true。这意味着在if内部,碰撞将永远不会是Rectangle.Empty,因此整个while循环永远不会被使用,位置.y也不会更改。这还意味着,如果在某个点检测到碰撞,您的实体将被删除始终有一个move.Y值为0,并且不会移动。考虑到您的实体仍在移动的事实,我假设在其他地方重置了速度,并且在下一次迭代中未检测到碰撞(可能是因为速度降低,因此碰撞距离不同?)