微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

碰撞代码中出现口吃当代码有效时,播放器对象在碰撞前会停止一秒钟单人游戏

如何解决碰撞代码中出现口吃当代码有效时,播放器对象在碰撞前会停止一秒钟单人游戏

这是我的碰撞代码。问题在于代码使对象轻松进入墙壁,而不是在墙壁前停止。

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?