XNA跳跃后穿过瓷砖

时间:2012-10-30 23:06:21

标签: xna tile

我发布了很多新信息,因为我发布了这个问题所以我完全重写了它:

在我的基于磁贴的游戏中实现重力和跳跃时,我遇到了一些问题。 有时当我的角色在跳跃之后落在瓷砖之间时,角色会穿过它们。

问题当然不是我的速度太高,因为我的最大速度与我的瓷砖尺寸相同。此外,每次角色跳跃后都不会出现问题。我经常可以跳跃,达到最大速度,并且仍能很好地降落。但有时这个角色会失败。

我的等级是瓷砖层。每一层都有自己的碰撞类型。因此,同一层中的每个图块都遵循相同的碰撞规则。 在我目前的设置中,所有图层都使用每像素碰撞。

这是我更新玩家坐标的方式 http://pastebin.com/qVc6gv6T

这是我计算我的碰撞的班级。 http://pastebin.com/7GqrFih6

在更新中我只是这样做:

    controls.Update(player); 
    physicsEngine.HandleCollissions(levelManager, player);

我想这个问题可能是因为玩家在碰撞后被移动到另一个牌。与其他瓷砖碰撞。但这不算数,因为已经检查了另一块瓷砖是否有碰撞? 或者可能是因为我使用foreach而不是for-loops?

1 个答案:

答案 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;发生的方案中运行该程序。如果它不应该发生,那么你就有罪魁祸首。

我在这里做了很多猜测。我认为您应该发布更多代码,以便我们可以确定。但也许糊盒是适合它的地方。