Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 冲突代码中的口吃。当代码运行时,播放器对象在碰撞前仅停止一秒钟。单一游戏_C#_Game Engine_Game Physics_Collision_Monogame - Fatal编程技术网

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,并且不会移动。考虑到您的实体仍在移动的事实,我假设在其他地方重置了速度,并且在下一次迭代中未检测到碰撞(可能是因为速度降低,因此碰撞距离不同?)