首页 > 解决方案 > 如何让“敌人”围绕玩家运行?

问题描述

我试图让敌人精灵靠近玩家精灵时绕着他们旋转。我正在使用极坐标系来找到它们应该停留的点。目前精灵闪烁并且没有正确保持在位置上,我无法完全弄清楚为什么。

使用enemySprite坐标时似乎会出现问题。当使用设定的数字时,没有闪烁,它的行为符合预期。

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

        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++

预期的结果是敌人在玩家周围形成一个圆圈,而不会闪烁。

只想提前说声谢谢你的帮助。

标签: c++trigonometrysfml

解决方案


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

想一想。

每一帧,敌舰都会跳到一个新的位置,你会再次改变它。该代码完全按照您的要求执行。

相反,您需要两个职位。改造前后。


推荐阅读