0

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

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

问题当然不在于我的速度太高,因为我的最大速度与我的图块大小相同。此外,每次角色跳跃后都不会出现问题。我经常可以跳跃,达到最大速度,并且仍然可以很好地着陆。但有时角色只是失败了。

我的关卡存在层层瓦片。每一层都有它自己的碰撞类型。因此,同一层中的每个图块都遵循相同的碰撞规则。在我当前的设置中,所有图层都使用逐像素碰撞。

这就是我更新播放器坐标的方式 http://pastebin.com/qVc6gv6T

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

在更新中我只是这样做:

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

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

4

1 回答 1

0

你说跳转后出现错误。所以,你的角色落向一块瓷砖(有一些积极的velocity.Y)并击中它。碰撞代码执行该// the player comes FROM ABOVE and collides with the tile块。您运行一个循环,将玩家速度设置为零并将玩家移出碰撞。此循环使用术语tile作为参数调用函数。我假设您循环遍历一组图块,以便与多个正方形发生碰撞。我对吗?

如果我是,那么问题发生在第一次碰撞和更正之后。现在您的玩家的 avelocity.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

现在有时(仅当您的每像素碰撞稍微错位时)您会在错误的方向上进行航向校正。这将产生一个跌倒效应。您可以尝试在块中设置断点// the player comes FROM UNDER and collides with the tile,然后在不应导致player.WorldPositionY += 1;发生的情况下运行程序。如果它在不应该发生的时候发生,那么你就是罪魁祸首。

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

于 2012-11-01T03:53:12.250 回答