2010-11-20 43 views
1

我有一个简单的矩形瓷砖碰撞方案设置,它的作品非常漂亮。防止隧道与此设置?

唯一的问题是当你开始从壁架脱落。你的速度达到了每帧的Y/X变化足够大的程度,你可以将它们剪切成固体物体并产生干扰。

基本上我的设置如下:

首先,玩家的地位它的速度增加,所以玩家现在在的地方,他会是下一个框架,如果没有冲突发生。 下面的列表只是一个函数,checkIntersectTiles(Vector2 maskPos);

  1. 计算字符周围的瓷砖进行检查。
  2. 循环切片,包括边界切片内的切片。
  3. 检查玩家的碰撞矩形对每个这些瓷砖。
  4. 如果有交点,将最大的违规轴移出瓷砖,然后将该轴速度设置为0.
  5. 继续检查。

当你陷入地面时,你会在里面抖动,因为我的算法试图将你移动到最接近你的地方。

我的解决方案:检查从玩家位置到玩家pos +速度的每个位置。 我被困在那一点。

任何人都可以帮我一把吗?

回答

3

我假设你的代码将玩家移出碰撞拼图,只需一步。因此,如果玩家与瓦片发生碰撞,您确定Y方向的穿透深度为5,则立即将玩家Y的位置调整为-5。

正如您所建议的,请检查玩家在每一步的位置。所以如果Y的速度是5,那么你可以将玩家Y的位置调整1,检查碰撞,然后重复4次。处理时间步长的计算请参见后面的内容。以下是一些基本的伪代码,只是在Y方向。

player.Y += vel; 
if (player.CheckCollisions()) 
{ 
    // handle collision 
} 

变为

for (int i = 0; i < vel; ++i) 
{ 
    player.Y += 1; 
    if (player.CheckCollisions()) 
    { 
    // handle collision 
    break; 
    } 
} 

这是简单的版本,如果你不调整ellaped时间。如果你是,那么你最好进行较小的时间步长

所以

player.Y += vel * elapsedTime; 
if (player.CheckCollisions()) 
{ 
    // handle collision 
} 

变为

float currentTimeStep = 0; 
Position startY = player.Y; 
while (currentTimeStep < elapsedTime) 
{ 
    currentTimeStep = Math.Min(currentTimeStep + stepDelta, elapsedTime); // You need to tune the stepDelta 
    player.Y = startY + vel * currentTimeStep; 
    if (player.CheckCollisions()) 
    { 
    // handle collision 
    break; 
    }  
} 

在上面,你将需要调整时间步长增量,以确保您与平衡性能准确性。您可能会考虑每帧动态计算增量,以确保调整接近1个像素。

+0

试图实现这一点,会回来给你。谢谢! – 2010-11-20 23:19:38

+0

它似乎工作:3 – 2010-11-21 00:23:41