在C ++中使对象平滑移动 - SFML

时间:2015-04-18 16:50:08

标签: c++ sfml

Hey Guys我是游戏开发的初学者,使用C ++和Sfml我编写了这个代码来使紫色物体移动,但问题是它不能顺利移动,它就像文字输入,如何解决?

这是我的代码:

#include <SFML/Graphics.hpp>

int main()
{
    sf::ContextSettings settings;
    settings.antialiasingLevel = 12;

    sf::RenderWindow window(sf::VideoMode(640, 480), "Ala Eddine", sf::Style::Default, settings);

    sf::CircleShape player(20, 5);
    player.setFillColor(sf::Color(150, 70, 250));
    player.setOutlineThickness(4);
    player.setOutlineColor(sf::Color(100, 50, 250));
    player.setPosition(200, 200);

    while(window.isOpen())
    {
        sf::Event event;

        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
            {
                window.close();
            }
            //MOOVING PLAYER////////////////////////////////////////
            // moving our player to the right                     //
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)){      //
                                                                  //
                                                                  //
                player.move(3, 0);
            }
            // moving our player to the left
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q)){
                player.move(-3, 0);
            }
            // moving our player to the UP
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z)){
                player.move(0, -3);
            }
            // moving our player to DOWN
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)){
                player.move(0, 3);
            }
        }

        window.clear();
        window.draw(player);
        window.display();
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

我假设您的player.move()方法只是将偏移量添加到玩家位置。这意味着您的对象将始终以相同的恒定速度移动(假设帧速率恒定)。你想要的是有一个加速度来更新每一帧的速度。

这里是基本思路(对于一个方向; y方向将相应地工作,尽管使用向量会更好):

  • 为物体提供速度和加速度。
  • 如果按住某个键,请将加速度设置为常数,否则将其设置为零。
  • 在每个帧中,将timestep * acceleration添加到速度。
  • 在每个框架中,将timestep * velocity添加到对象位置。
  • 在每一帧中,将速度乘以一些衰减因子,比如0.99

假设您有一个固定的时间步长(例如,60 fps的1/60秒)。时间步长略高一些,我会将您推荐给this article on the topic