在Y轴上反转一个角度,X有效

时间:2015-05-21 09:07:11

标签: c++ game-physics

我已经在GameDev上问过这个问题,但到目前为止还没有回复,不幸的是这个问题有点时间敏感。

我很确定这只是我在做一些愚蠢或不理解我应该做的事情,但我无法弄清楚这里有什么问题。

我有一个问题是从精灵弹出一个弹丸,我们被要求使用动作方程式移动弹丸,这使得事情变得更加困难但是我可以看到我的内容应该工作。

我试图做的是根据碰撞方向来改变碰撞弹丸的角度。

这是一段视频,希望你看到发生的事情并不会太迟,

Link

当射弹与精灵的左手侧或右手侧碰撞时,一切都按预期工作,它只是切换X方向。

当它击中精灵的顶部或底部但它没有变化时,它只是沿着顶部滚动并且射击关闭。

以下是移动代码:

float nX = get_x() + cos(nGetAngle() * 3.14 / 180) * getU() * getT();
float nY = get_y() - sin(nGetAngle() * 3.14 / 180) * getU() * getT() + 0.5 * 9.8 * getT() * getT();
set_world_position(nX, nY);

其中U是初始速度,T是时间,nGetAngle()是以度为单位的角度(无论何时设置角度,都设置为弧度)。

这是我对玩家顶部的碰撞:

//如果射弹以任何方式与玩家精灵相撞

if (projectiles[currProj]->get_y() < player->get_y()) // top of player
{
    float vx = cos(projectiles[currProj]->nGetAngle());
    float vy = sin(projectiles[currProj]->nGetAngle());

    float newAngle = atan2(-vy, vx) * 180 / 3.14;

    projectiles[currProj]->nSetAngle(newAngle);
    projectiles[currProj]->set_world_position_y(player->get_y() - projectiles[currProj]->get_height() - 1);
}

这是我对玩家左边的碰撞:

else if (projectiles[currProj]->get_x() < player->get_x()) // left of player
{
    projectiles[currProj]->set_world_position_x(player->get_x() - projectiles[currProj]->get_width());

    float vx = cos(projectiles[currProj]->nGetAngle());
    float vy = sin(projectiles[currProj]->nGetAngle());

    float newAngle = atan2(vy, -vx) * 180 / 3.14;

    projectiles[currProj]->nSetAngle(newAngle);
}

左侧碰撞有效,顶部没有,我不知道为什么。

如果有必要,我可以将整个项目发布到某个地方。

玩家的完整碰撞代码:

void Game::playerCollision()
{
    if (projectiles[currProj]->bb_collision(player))
    {
        if (projectiles[currProj]->get_y() < player->get_y()) // top of player
        {
            float vx = cos(projectiles[currProj]->nGetAngle());
            float vy = sin(projectiles[currProj]->nGetAngle());


            float newAngle = atan2(-vy, vx) * 180 / 3.14;

            projectiles[currProj]->nSetAngle(newAngle);
            projectiles[currProj]->set_world_position_y(player->get_y() - projectiles[currProj]->get_height() - 1);
        }
        else if (projectiles[currProj]->get_y() + projectiles[currProj]->get_height() > player->get_y() + player->get_height() + 1) // bottom of player
        {
            projectiles[currProj]->set_world_position_y(player->get_y() + player->get_height());
            float vx = cos(projectiles[currProj]->nGetAngle());
            float vy = sin(projectiles[currProj]->nGetAngle());

            float newAngle = atan2(-vy, vx) * 180 / 3.14;

            projectiles[currProj]->nSetAngle(newAngle);
        }
        else if (projectiles[currProj]->get_x() < player->get_x()) // left of player
        {

            projectiles[currProj]->set_world_position_x(player->get_x() - projectiles[currProj]->get_width());

            float vx = cos(projectiles[currProj]->nGetAngle());
            float vy = sin(projectiles[currProj]->nGetAngle());

            float newAngle = atan2(vy, -vx) * 180 / 3.14;

            projectiles[currProj]->nSetAngle(newAngle);
        }

        else if (projectiles[currProj]->get_x() > player->get_x()) // right of player
        {
            projectiles[currProj]->set_world_position_x(player->get_x() + player->get_width());

            float vx = cos(projectiles[currProj]->nGetAngle());
            float vy = sin(projectiles[currProj]->nGetAngle());

            float newAngle = atan2(vy, -vx) * 180 / 3.14;

            projectiles[currProj]->nSetAngle(newAngle);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为你的碰撞检测还不够。不知道你的详细表述

  • 你没有检查射弹(pr)的来源。玩家(pl)内左侧的碰撞可能是从顶部或左侧进入的
  • 你不立即反弹,只是改变方向。根据入口深度,它可能无法在下一次迭代时退出。这种情况尤其发生在pr向下加速但向上减速的顶部。

所以你必须

  • 检测进入表面(确定角度)
  • 最重要的立即反弹