Make Object Move Smoothly In C++-SFML

对着背影说爱祢 提交于 2019-12-12 04:56:46

问题


Hey Guys I'm a Beginner in Game Development with C++ and Sfml I Wrote this code to make that purple Object move,but the problem is that it doesn't move smoothly, it's like the text input, How to fix That ?

Here Is My code :

#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:


I assume your player.move() method simply adds the offset to the player position. This means that your object will always move with the same constant velocity (assuming frame rate is constant). What you want instead is to have an acceleration which updates the velocity in every frame.

Here's the basic idea (for one direction; the y direction will work accordingly, although using vectors would be better):

  • Give your object both a velocity and an acceleration.
  • If a key is held down, set the acceleration to a constant term, otherwise set it to zero.
  • In every frame, add timestep * acceleration to the velocity.
  • In every frame, add timestep * velocity to the object position.
  • In every frame, multiply the velocity with some decay factor, say 0.99.

This is assuming you have a fixed timestep (say, 1/60 s for 60 fps). Timestepping is slightly more advanced, and I'll refer you to this article on the topic.



来源:https://stackoverflow.com/questions/29720118/make-object-move-smoothly-in-c-sfml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!