如何使“敌人”绕玩家旋转?

时间:2019-08-29 17:29:04

标签: c++ trigonometry sfml

我正在尝试让敌人精灵在玩家精灵接近时围绕其旋转。我正在使用极坐标系统来找到它们应停留的点。目前,子画面会闪烁并且无法正确定位,我无法完全弄清原因。

使用敌人的精灵坐标似乎出现了问题。使用设定数字时,不会闪烁,并且表现正常。

当前代码将敌人的位置设置在圆圈上,而不是逐渐将其移动到圆圈上。

        for (auto enemyShip = enemyShipStorage.begin(); enemyShip != enemyShipStorage.end();)
        {
            if (!(*enemyShip).isOffScreen)
            {
                //Finding theta in degrees
                //All positions use floats - sf::Vector2f
                float theta = std::atan2((*enemyShip).m_sprite.getPosition().y - player.m_sprite.getPosition().y, (*enemyShip).m_sprite.getPosition().x - player.m_sprite.getPosition().x) * (180 / 3.141f);

                //normalised so 0 is up
                theta -= 90; 

                if (theta < 0)
                {
                    theta += 360;
                }
                else if (theta > 360)
                {
                    theta -= 360;
                }


                //currently using fixed radius distance while testing
                (*enemyShip).m_endPos.x = player.m_sprite.getPosition().x + (400 * std::cos(theta * (3.141f / 180)));
                (*enemyShip).m_endPos.y = player.m_sprite.getPosition().y + (400 * std::sin(theta * (3.141f / 180)));

                //set position to be at the point on the circle
                (*enemyShip).m_sprite.setPosition((*enemyShip).m_endPos);
         }
         ship++

预期结果是敌人在玩家周围绕圈而不会闪烁。

只想在此先感谢您。

1 个答案:

答案 0 :(得分:0)

您使用(*enemyShip).m_sprite.getPosition()获取位置,计算一些变换,然后使用(*enemyShip).m_sprite.setPosition(...)设置位置。

想一想。

每帧,敌军舰艇将跳到一个新位置,您将再次对其进行变换。该代码完全符合您的要求。

相反,您需要两个职位。转换前后。