2D盒子碰撞,平台游戏,我的玩家"hovers"在方块上

2D Box-Collisions, Platformer, my player "hovers" over blocks

本文关键字:hovers 玩家 方块 我的 盒子 碰撞 平台 游戏 2D      更新时间:2023-10-16

如果我将玩家的"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) 神奇的数字太多了。不确定+2、+1等的确切含义。我想把它们看作常数。此外,我对操作顺序很偏执,所以我会把所有的东西都放在括号里,以防万一:)

2) 不确定你的vars是什么类型。假设浮动,但它们感觉像int。

3) 更大的问题是,您设计的代码无法很好地处理"大"速度。速度超过可冷却区域宽度/高度的物体不会被可靠地检测到。使用这种类型的冲突代码也不容易。这是你已经看到的一个副作用,我猜是捏造因素增加了你对其余部分的贡献

请考虑使用基于矢量的碰撞系统。将长方体的每条边视为线向量。然后,你可以做非常简单的数学运算来确定一个点是否从直线的一侧开始,到另一侧结束(叉积的符号),点的符号将判断该点是否在线段内。此外,它允许碰撞对象为任何形状,甚至可以很容易地将数学扩展到3D。这种系统对并行处理也比较友好。