2D Box-Collisions,Platformer,我的玩家“徘徊”在积木上

时间:2011-05-25 04:57:16

标签: c++ 2d

如果我将播放器的“hspeed”变量(水平速度)设置为足够慢的速度, 然后,当他超过16x16区块的差距时,他将按计划跌倒。 但是,如果我将“hspeed”变量设置得足够高,他就会走得太快,以至于他将它悬停在它上面。 虽然它在我将它设置为慢速时有效,但它太慢

这是一个例子: http://img199.imageshack.us/img199/2685/demondj.png

这是我的碰撞代码(遍历块列表):

for(unsigned int i = 0; i<blocks.size(); i++){
Block &b = blocks.at(i);
if(!b.passable){
    //Check if we are on the sides
    if(y + height + vspeed >= b.worldY+2 && y + vspeed <= b.worldY+b.height)
    {
        //Right side
        if(x + hspeed <= b.worldX+b.width+1  && x + hspeed > b.worldX+b.width + hspeed-1)
        {
         x = b.worldX + b.width; hspeed = 0;
        }
        //Left side    
        if(x + width + hspeed >= b.worldX +1 && x + width + hspeed <= b.worldX + hspeed + 1)
        {
         x = b.worldX - width; hspeed = 0;
        }
    }

    //Check if we are on the top or the bottom
    if(x + width + hspeed >= b.worldX+1 && x + hspeed <= b.worldX+b.width-1)
    {
        if(y + height + vspeed >= b.worldY && y + height + vspeed <= b.worldY + vspeed + 1 && jumpstate=="falling")
            {
            y = b.worldY - height; jumpstate.assign("ground"); vspeed = 0;
            }

        if(y + vspeed <= b.worldY + b.height && y + vspeed >= b.worldY + b.height + vspeed + 1 && jumpstate=="jumping")
        {
        y = b.worldY + b.height; jumpstate.assign("falling"); vspeed = 0;
        }
    }

}

}

我的碰撞代码有问题吗? 另一个问题是,当我触及一个块的底部时,它有点毛病。 他应该立即反弹,但他确实如此,但是如果他正在移动并且他击中了一个区块的底部,他会感到紧张。

1 个答案:

答案 0 :(得分:2)

好的,这里有很多东西:

1)魔法数太多了。不确定+2,+ 1等究竟是什么意思。我想把它们视为常数。另外,我对操作的顺序很偏执,所以我会用括号括起来,以防万一:)

2)不确定你的vars是什么类型。假设漂浮,但他们感觉像是整理。

3)更大的问题是,你设计的代码不能很好地正确处理“大”速度。行进速度比可碰撞区域的宽度/高度快的东西将无法被可靠地检测到。你也不能轻易使用这种类型的碰撞代码。这是你已经看到的一个副作用,我的猜测是你为其余部分做出贡献的软糖因素。

考虑使用基于矢量的碰撞系统。将框的每个边缘视为线矢量。然后,您可以进行非常简单的数学运算,以确定一个点是从一条线的一侧开始到另一条点结束(十字产品的符号),并且点的符号将告诉该点是否在线段内。此外,它允许您的碰撞对象成为任何形状,甚至使数学可以很容易地扩展到3D。这种系统也是更友好的并行处理。