如何减慢在 C++/SFML 中移动矩形的速度

How can I slow down moving a rect in C++/SFML

问题来了: 在我的游戏中,有一个功能,当玩家用他的剑攻击敌人时,敌人应该被缓慢地击退到与玩家相反的方向。在我目前的代码中,当敌人受到攻击时,它会移动,但速度太快了,似乎要传送到指定的距离。这是我目前拥有的:

//Player sword collides with enemy

        if (elapsed4.asSeconds() >= 0.05) //only 1 collision every .05 seconds

        {
            clock4.restart();

            counter1 = 0;

            for (iter30 = swordArray.begin(); iter30 != swordArray.end(); iter30++)
            {

                counter2 = 0;

                for (iter4 = enemyArray.begin(); iter4 != enemyArray.end(); iter4++)

                {

                    if(swordArray[counter1].rect.getGlobalBounds().intersects(enemyArray[counter2].rect.getGlobalBounds()))
                    {

                        soundSwordHit.play();

                        enemyArray[counter2].hp -= Player1.attackDamage;


                        if (enemyArray[counter2].hp <= 0)

                        {

                            enemyArray[counter2].alive = false;

                        }

                            //Move enemy upon damage

                            if (Player1.direction == 1)

                            {

                                enemyArray[counter2].rect.move(0, -50);

                            }

                            else if (Player1.direction == 2)

                            {

                                enemyArray[counter2].rect.move(0, 50);

                            }

                            else if (Player1.direction == 3)

                            {

                                enemyArray[counter2].rect.move(-50, 0);

                            }

                            else if (Player1.direction == 4)

                            {

                                enemyArray[counter2].rect.move(50, 0);

                            }


                        //enemy aggro
                        enemyArray[counter2].aggro = true;

                    }

                    counter2++;

                }

                counter1++;

            }

        }

我试过在循环中使用计数器和计时器,但似乎无法让它按照我想要的方式运行。澄清一下,我希望敌人每次 t 移动 n 个像素,以模拟平滑移动。如何才能做到这一点?提前致谢

我觉得我没有足够的知识来回答这个问题,但我会尽力的。

在设计游戏(具有流畅动画的游戏)时,您需要考虑滴答声,即这一帧与下一帧之间的时间。 要计算它,您需要在游戏循环开始时进行一次测量,在结束时进行一次测量(这是一个有据可查的主题,请继续阅读)。

因为游戏中的一切都是以滴答为单位发生的,所以你不能只是将角色移动到一个位置并期望他神奇地平滑一系列帧的移动;如果您为一个实体分配了一个位置,它将在下一帧中出现在该位置。 (我什至不认为 SFML 有任何关于动画的特性)。

让我们假设这个简单的游戏循环。

while(running)
{
    // like i said, please read on measuring frame time, it's an extensive topic
    auto frametime = end - start;

    start = getTime(); // sorry, I do not remember what's the code for this
    readInput();

    // DO A LOT OF GAME STUFF

    end = getTime();
}

有了这个帧时间,你已经可以做很多非常漂亮的动画了,假设你想在某个方向移动一个角色。

void move(Entity& entity, float x, float y)
{
    entity.move(x, y);
}

float moveByInX = 50.0f;
float moveByInY = 0.0f;

while(running)
{
    auto frametime = end - start;

    start = getTime();
    readInput();

    // DO A LOT OF GAME STUFF

    float deltaX = moveByInX * frametime;
    float deltaY = moveByInY * frametime;

    move(/* some entity */, deltaX, deltaY);

    moveByInX -= deltaX;
    moveByInY -= deltaY;

    end = getTime();
}

现在,请记住,这是一个非常愚蠢的设计,这些动作、帧测量、动画 --- 至少应该在漂亮的对象或函数中,请阅读 一本关于这类东西的书,里面确实有很多关于游戏设计的内容,以及你应该如何处理这些问题。我推荐 http://www.gameenginebook.com/ 这个。 并找到了另外两个可能对您有用的资源 https://en.wikibooks.org/wiki/Video_Game_Design/Programming and https://en.wikibooks.org/wiki/Guide_to_Game_Development