检测到碰撞,现在怎么办?

时间:2020-10-14 14:04:13

标签: c++ game-physics collision

我正在检查播放器与其他所有对象之间的碰撞,它是否起作用,但是我现在该怎么办。 这就是我现在要做的,但是当玩家从下方击中某物时,它会在被击中物体的顶部传送。

我要说的是:如果掉落在物体上,则在顶部传送,当从下方撞击时将最大y速度设置为0,将侧面的最大x速度设置为?

是这样做吗?

但是这不适用于圆对撞机,那么如何使我的物体在撞击时正常停止?

for (GameObject &g : gameObjects) 
{ 

        if (BoxCollision(player, &g))
        {
            player->velocity.y = 0;

            // set player feet location to the top of hit object
            player->transform.pos.y = g.transform.pos.y - player->sprite.height * player->transform.size.y;

            player->canJump = true;
        }
}

冲突检查:

bool BoxCollision(GameObject* g1, GameObject* g2)
{
    if (g1 != g2)
    {
        bool left = 0, right = 0, top = 0, bottom = 0;
        left = g1->transform.pos.x < g2->transform.pos.x + g2->sprite.width * g2->transform.size.x ? true : false;
        right = g1->transform.pos.x + g1->sprite.width * g1->transform.size.x >= g2->transform.pos.x ? true : false;
        bottom = g1->transform.pos.y + g1->sprite.height * g1->transform.size.y > g2->transform.pos.y ? true : false;
        top = g1->transform.pos.y < g2->transform.pos.y + g2->sprite.height * g2->transform.size.y ? true : false;

        return left && right && bottom && top ? true : false;

    }
    else return false;
}

1 个答案:

答案 0 :(得分:1)

当您检测到碰撞时,这是因为在引擎经过一定时间后,两个对象O1和O2的边界体积相交。换句话说,您的对象O1在上一个时间步中的位置x处开始,现在在x + v * dt处两个对象相交。 (其中v = velocity和dt是您的时间步长)

首要工作是在对象O1和O2 接触的地方找到dt'(

  • 您可以将碰撞后的v = 0设置为使对象O1停止死亡;
  • 您可以将v反转(沿边界框反射后)以使O1弹开
  • 您可以将一些速度传递给O2并计算其余时间步长的运动
  • 您可以摧毁O2,并使O1沿其路径继续前进。