XNA跳跃后从瓷砖中跌落

XNA跳跃后从瓷砖中跌落,xna,tile,Xna,Tile,自从我发布这个问题以来,我发现了很多新信息,所以我完全重写了它: 我在基于瓷砖的游戏中实现重力和跳跃时遇到了一些问题。 有时,当我的角色在跳跃后落在瓦片之间时,角色会从瓦片中跌落 问题当然不是我的速度太高,因为我的最大速度与我的瓷砖大小相同。此外,在角色每次跳跃之后,问题也不会发生。我经常可以跳跃,达到最大速度,但仍然能很好地落地。但有时这个角色只是失败了 我的级别存在一层一层的瓷砖。每个层都有自己的碰撞类型。因此,同一层中的每个平铺都遵循相同的碰撞规则。 在我当前的设置中,所有层都使用每像素碰

自从我发布这个问题以来,我发现了很多新信息,所以我完全重写了它:

我在基于瓷砖的游戏中实现重力和跳跃时遇到了一些问题。 有时,当我的角色在跳跃后落在瓦片之间时,角色会从瓦片中跌落

问题当然不是我的速度太高,因为我的最大速度与我的瓷砖大小相同。此外,在角色每次跳跃之后,问题也不会发生。我经常可以跳跃,达到最大速度,但仍然能很好地落地。但有时这个角色只是失败了

我的级别存在一层一层的瓷砖。每个层都有自己的碰撞类型。因此,同一层中的每个平铺都遵循相同的碰撞规则。 在我当前的设置中,所有层都使用每像素碰撞

这就是我更新玩家坐标的方式

这是我计算碰撞的课程。

在更新中,我只需执行以下操作:

    controls.Update(player); 
    physicsEngine.HandleCollissions(levelManager, player);
我想问题可能是因为球员在碰撞后被移动到了另一块瓷砖上。与其他瓷砖碰撞。但这不算,因为另一个磁贴已经检查过碰撞?
或者可能是因为我使用foreach而不是for循环?

您说错误发生在跳转之后。因此,您的角色朝着一个平铺(具有一些正的
velocity.Y
)落下并击中它。碰撞代码执行<代码>//玩家从上面过来,与磁贴块碰撞。运行一个循环,将玩家速度设置为零,并将玩家移出碰撞。这个循环使用术语
tile
作为参数来调用函数。我假设你在一组瓷砖中循环,以便与多个正方形碰撞。我说得对吗

如果我是,那么问题发生在第一次碰撞和修正之后。现在您的播放器的
velocity.Y
值为0,但它们与新的磁贴发生碰撞。因此,尽管您对else块的含义有评论,但您可能会有更多的位置变化:

if (player.Velocity.Y > 0) 
else // if (moveVector.Y < 0) // what you commented

else // if (moveVector.Y <= 0) // what your else really means
if(player.Velocity.Y>0)
else//if(movevevector.Y<0)//您的评论是什么

否则//如果(moveVector.Y我还没有看过你的代码,但我假设这可能是问题所在。请看接受的答案。移动对象的速度必须太高,碰撞检测无法按预期进行处理,因此你要么更改最大速度,要么扩展碰撞检测规则。你也可以将步长减半,更新速率加倍,但这是非常困难的资源成本高,不是推荐的解决方案。感谢您的回复。我现在很忙,但今晚我一定会查看platformer示例并让您不断更新。我不认为我的对象速度可能太高,因为我将Y速度限制为10,而tilesize为16;我只是降低了最大下降speed和它似乎有帮助。毕竟是物体的速度。我的问题似乎与你的问题非常相似,确实是Cyral。今晚我将进一步研究它。所以我在我的游戏中多玩了一点,我发现当使用最大Y速度9时,这个错误仍然存在。这实际上并不让我感到惊讶。没有理由为什么最多9或10(甚至16)当我的tilesize为16时会导致问题。经过更多的实验后,我发现该错误仅在对角移动时才会发生。因此,问题显然存在于我的碰撞检测中。是否有人可以直接告诉我问题的原因,以及我应该如何修复它?我知道在我的测试中,movevector可能等于零else语句,但我在HandleCollision类的这部分代码中没有排除这种情况吗?:if(player.Velocity.X!=0){}if(player.Velocity.Y!=0){}我将我的整个控件和冲突类发布在一个粘贴箱中,你能再看一眼吗?我考虑过,但这就是为什么我猜测你正在循环多个磁贴。如果是,那么只有当第一个磁贴上的
Velocity.Y
为零时,你才会排除错误。如果在f上它变为零第一个磁贴,然后第二个磁贴可能会出现错误。啊,我终于明白你的意思了!我非常专注于每像素碰撞区域中的代码,以至于完全忽略了它周围的整个循环。我现在使用布尔来检查碰撞是否发生。如果发生了碰撞,我会在碰撞后将player.VelocityY设置为0整个循环。这似乎已经解决了问题,因为我从那以后就没有遇到过错误。但我想知道,你是否知道一种更优雅的方法来实现这一点,而不是使用bool?无论如何,非常感谢!没有神奇的答案;碰撞很难。但是有很多阅读材料:)