我发布了很多新信息,因为我发布了这个问题所以我完全重写了它:
在我的基于磁贴的游戏中实现重力和跳跃时,我遇到了一些问题。 有时当我的角色在跳跃之后落在瓷砖之间时,角色会穿过它们。
问题当然不是我的速度太高,因为我的最大速度与我的瓷砖尺寸相同。此外,每次角色跳跃后都不会出现问题。我经常可以跳跃,达到最大速度,并且仍能很好地降落。但有时这个角色会失败。
我的等级是瓷砖层。每一层都有自己的碰撞类型。因此,同一层中的每个图块都遵循相同的碰撞规则。 在我目前的设置中,所有图层都使用每像素碰撞。
这是我更新玩家坐标的方式 http://pastebin.com/qVc6gv6T
这是我计算我的碰撞的班级。 http://pastebin.com/7GqrFih6
在更新中我只是这样做:
controls.Update(player);
physicsEngine.HandleCollissions(levelManager, player);
我想这个问题可能是因为玩家在碰撞后被移动到另一个牌。与其他瓷砖碰撞。但这不算数,因为已经检查了另一块瓷砖是否有碰撞? 或者可能是因为我使用foreach而不是for-loops?
答案 0 :(得分:0)
你说跳跃后会发生错误。所以,你的角色落在一块瓷砖上(有一些正面velocity.Y
)并击中它。冲突代码执行// the player comes FROM ABOVE and collides with the tile
块。你运行一个循环,将玩家速度设置为零,并使玩家远离碰撞。此循环使用术语tile
作为参数调用函数。我假设你循环通过一组瓷砖,以便与多个方块碰撞。我是对的吗?
如果我,那么问题发生在第一次碰撞和纠正之后。现在你的玩家的velocity.Y
为0,但是他们正在与新牌发生碰撞。因此,尽管您对其他区块的含义发表了评论,但您可能会发生更多的位置变化:
if (player.Velocity.Y > 0)
else // if (moveVector.Y < 0) // what you commented
else // if (moveVector.Y <= 0) // what your else really means
现在有时候(只有当你的每像素碰撞略微错误排列时),你才会在错误的方向上进行路线修正。这会产生一种影响。您可以尝试在// the player comes FROM UNDER and collides with the tile
块中设置断点,然后在不应导致player.WorldPositionY += 1;
发生的方案中运行该程序。如果它不应该发生,那么你就有罪魁祸首。
我在这里做了很多猜测。我认为您应该发布更多代码,以便我们可以确定。但也许糊盒是适合它的地方。