【问题标题】:How can I slow down moving a rect in C++/SFML如何减慢在 C++/SFML 中移动矩形的速度
【发布时间】:2016-01-26 07:50:45
【问题描述】:

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

//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 个像素来模拟平滑移动。如何才能做到这一点?提前致谢

【问题讨论】:

    标签: c++ sfml


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 2015-01-04
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多