C++ 如何制作;“敌人”;绕着玩家旋转?

C++ 如何制作;“敌人”;绕着玩家旋转?,c++,trigonometry,sfml,C++,Trigonometry,Sfml,我试图让敌人的精灵在靠近玩家的时候环绕玩家的精灵。我用极坐标系来找到它们应该停留的点。目前,精灵闪烁,不能正确地停留在位置上,我无法完全弄清楚原因 当使用敌人的坐标时,问题似乎出现了。使用设置的数字时,不会闪烁,其行为符合预期 目前,代码将敌人的位置设置为在圆圈上,而不是逐渐移动到圆圈上 for (auto enemyShip = enemyShipStorage.begin(); enemyShip != enemyShipStorage.end();) {

我试图让敌人的精灵在靠近玩家的时候环绕玩家的精灵。我用极坐标系来找到它们应该停留的点。目前,精灵闪烁,不能正确地停留在位置上,我无法完全弄清楚原因

当使用敌人的坐标时,问题似乎出现了。使用设置的数字时,不会闪烁,其行为符合预期

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

        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++
for(auto-enemyShip=enemyShipStorage.begin();enemyShip!=enemyShipStorage.end();)
{
如果(!(*Eneyship.isofScreen)
{
//以度为单位求θ
//所有位置都使用浮动-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);
//正常化,因此0向上
θ-=90;
if(θ<0)
{
θ+=360;
}
否则如果(θ>360)
{
θ-=360;
}
//测试时当前使用固定半径距离
(*Eneyship.m_endPos.x=player.m_sprite.getPosition().x+(400*std::cos(theta*(3.141f/180)));
(*Eneyship.m_endPos.y=player.m_sprite.getPosition().y+(400*std::sin(theta*(3.141f/180)));
//将位置设置为圆上的点
(*enemyShip).m_sprite.setPosition((*enemyShip.m_endPos);
}
船++
预期的结果是敌人在玩家周围形成一个圆圈,而不会闪烁

只想提前对您的帮助表示感谢。

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

想一想

每一帧,敌舰将跳转到一个新的位置,你将再次转换。代码完全按照你的要求执行

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

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

想一想

每一帧,敌舰将跳转到一个新的位置,你将再次转换。代码完全按照你的要求执行


相反,你需要两个位置。转换前后。

次要的一点,但为什么喜欢度?坚持弧度将有助于解决未来的随机转换错误。此外,最好知道位置的类型和类型。最后,直接设置位置是糟糕的游戏编码。这会让人眼花缭乱,因为我和部队一起工作你最好给你的敌舰“动力”朝向目标点-从长远来看,它看起来更真实。我还想说调试位置数学的输出-确保每个刻度的结果都是相同的。如果不是,那么你就有了闪烁的来源。这可能很简单,只要打印每个tic的x/y位置,并查看其变化。编辑现在就发帖子来展示这些类型。你能告诉我一些关于给飞船一个点的脉冲的事情吗?这将是一个有趣的阅读,因为我不确定从哪里开始。我使用的是度,以便于阅读,将转换为rads。所谓脉冲,我的意思是每tic应用一个加速度(对于微积分来说,这基本上意味着为每个tic的速度增加一个值,然后为每个tic的位置增加速度。)困难的部分是知道何时以及如何减速,这样你就不会超过目标。它还有助于控制tic的长度,使其不以光速运行。使你的游戏与vblank(vsync)同步有助于限制模拟运行的速度。不过,你也可以使用其他值。次要的一点,但为什么喜欢度?坚持使用弧度将有助于解决未来的随机转换错误。此外,了解位置的类型和类型也会很好。最后,直接设置位置是糟糕的游戏编码。这是错误的因为真正的工作是与部队合作的。你最好给你的敌舰“动力”朝向目标点-从长远来看,它看起来更真实。我还想说调试位置数学的输出-确保每个刻度的结果都是相同的。如果不是,那么你就有了闪烁的来源。这可能很简单,只要打印每个tic的x/y位置,并查看其变化。编辑现在就发帖子来展示这些类型。你能告诉我一些关于给飞船一个点的脉冲的事情吗?这将是一个有趣的阅读,因为我不确定从哪里开始。我使用的是度,以便于阅读,将转换为rads。所谓脉冲,我的意思是每tic应用一个加速度(对于微积分来说,这基本上意味着为每个tic的速度增加一个值,然后为每个tic的位置增加速度。)困难的部分是知道何时以及如何减速,这样你就不会超过目标。它还有助于控制tic的长度,使其不以光速运行。使你的游戏与vblank(vsync)同步可以帮助限制模拟运行的速度。不过,您也可以使用其他值。如果我保存了最后一个位置,我将如何利用它使函数稳定。我在tra之前使用getPosition()