问题: Problem http://img684.imageshack.us/img684/5486/prob1b.png Problem http://img810.imageshack.us/img810/3157/prob3.png 绿色块是播放器,灰色块是静态块
当对着瓷砖跳起时,当玩家站在碰撞瓷砖的边缘附近时,向左/右推动玩家。这可能是因为跳跃速度大于x移动(甚至可能是0),因此玩家在x轴上得到纠正......
伪代码如下:
{
//下面是一些其他伪代码,不应该成为问题的一部分:
}
一些代码:
foreach (Stone stone in collidingStones)
{
#region Collision Response
if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
{
//warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
if (Math.Abs(correction.X) > Math.Abs(correction.Y))
{
Location += new Vector2(correction.X, 0);
}
else
{
Location += new Vector2(0, correction.Y);
}
答案 0 :(得分:0)
有趣的问题,几年前我在Delphi开发游戏,遇到了同样的问题。几点:
最后,我制作了一个引擎,其中每个磁贴都有位图(实际可见图形)和我称为 freemap 的东西,它是一个黑色和白色位图,表示图块内的可用空间的映射。然后我编写了碰撞函数,它首先在图块空间中操作(以确定与玩家碰撞的图块)然后在图块的位图中。
移动播放器时,您可以根据播放器的速度计算下一个点,然后沿着当前位置和计算的下一个位置之间的线测试每个点。如果在那条线上遇到障碍物,那么你就会在那一点停止玩家。