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

时间:2016-01-26 07:50:45

标签: 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++;

            }

        }

我尝试在循环中使用计数器和计时器,但似乎无法让它按照我的意愿行事。为了澄清,我希望敌人每次移动n个像素来模拟平滑移动。如何才能做到这一点?提前致谢

1 个答案:

答案 0 :(得分:1)

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

在设计游戏(具有流畅动画的游戏)时,您需要根据刻度来考虑,这是此帧与下一帧之间的时间。 要计算出来,您需要在游戏循环开始时进行一次测量,最后再进行另一次测量(这是一个记录良好的主题,请仔细阅读)。

因为游戏中的所有内容都是以刻度形式发生的,所以你不能只是将角色移动到一个位置并期望他能够神奇地平滑掉一堆帧上的动作。如果您为实体分配了一个位置,它将出现在下一帧的该位置。 (我甚至认为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/Programminghttps://en.wikibooks.org/wiki/Guide_to_Game_Development