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

标签 c++ 2d

如果我将播放器的“hspeed”变量(水平速度)设置为足够慢的速度, 然后当他越过 16x16 block 的间隙时,他将按计划跌倒。 但是,如果我将“hspeed”变量设置得足够高,他会走得太快以至于他会悬停在它上面。 虽然当我将它设置为低速时它可以正常工作,但它太慢了

举个例子: http://img199.imageshack.us/img199/2685/demondj.png

这是我的碰撞代码(循环遍历方 block 列表):

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;
        }
    }

}

我的碰撞代码有问题吗? 另一个问题是当我碰到一个 block 的底部时,它有点小故障。 他本应立即弹起,他确实做到了,但如果他在移动并且撞到了街区底部,他就会紧张。

最佳答案

好的,这里有一些事情:

1) 魔数(Magic Number)太多。不确定 +2、+1 等的确切含义。我希望将这些视为常量。另外,我对操作顺序很偏执,所以我会用括号括起所有内容,以防万一:)

2) 不确定你的变量是什么类型。假设是 float ,但感觉它们像整数。

3) 更大的问题是,您设计的代码无法很好地处理“大”速度。无法可靠地检测到行进速度超过可碰撞区域宽度/高度的物体。你也不能轻易地使用这种类型的碰撞代码。这是您已经看到的一个副作用,我猜是软糖因素增加了您对其余部分的贡献。

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

关于c++ - 2D Box-Collisions, Platformer, my player "hovers"over blocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6119735/

相关文章:

c++ - for循环的增量语句中的奇数位运算符

c++ - 为什么这些 lambda 捕获的值有不同的类型?

java - 用于二维噪声生成的参数随机函数

c# - 无法找出如何发出步行声音…(2d)

c++ - 在 OpengL 中多次重复图像

java - Java 中的 2D 图形渲染

c++ - 这个可变参数模板代码有什么作用?

c++ - 元结构与元功能

c++ - 如何将 CRTP 与可变参数模板一起使用?

android - 在 Android 2D 游戏中使对象(位图)在 Canvas 上滚动