在SFML C ++中移动圆圈时,结实的轨迹轨迹在球后出现毛刺

时间:2019-03-12 23:52:11

标签: c++ sfml

#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;
using namespace sf;

int main()
{

    RenderWindow window(VideoMode(800, 600), "Lolyan", Style::Default);

    Event event;

    CircleShape circle(30.0f, 30.0f);
    circle.setFillColor(Color::Blue);
    circle.setPosition(40, 530);

    window.setFramerateLimit(200);

    window.draw(circle);
    window.display();

    int velocityX = 0, velocityY = 0;
    Vector2i mousePosition;

    while (window.isOpen()) {


        circle.move(velocityX / 2, velocityY / 2);


        window.draw(circle);


        window.display();


        while (window.pollEvent(event)) {

            window.clear(Color::Black);



            if (event.type == Event::Closed) {
                window.close();
            }


            else if (event.type == Event::KeyPressed ) {

                cout << velocityX << endl;

                switch (event.key.code) {

                case Keyboard::A:
                    velocityX = -5;
                    break;

                case Keyboard::D:
                    velocityX = 5;
                    break;

                case Keyboard::S:
                    velocityY = 5;
                    break;

                case Keyboard::W:
                    velocityY = -5;
                    break;
                }

            }


            else if (event.type == Event::MouseButtonPressed) {
                circle.setFillColor(Color::Red);
            }


            else if (event.type == Event::MouseButtonReleased) {
                circle.setFillColor(Color::Blue);

            }

            else if (event.type == Event::MouseMoved) {
                mousePosition = Mouse::getPosition(window);
                circle.setPosition(mousePosition.x - 30, mousePosition.y - 30);

            }

            else if (event.type == Event::KeyReleased) {
                velocityX = 0;
                velocityY = 0;
            }






            window.display();

        }


    }

    return 0;
}

所以这不是我尝试移动球的第一个方法。第一种方法是每当按下一个键时x或y发生变化的每个事件,但是使用这种方法时,移动并没有我想要的那么平滑,因此在以下示例中尝试了该方法:当我按下w时,速度(velocityY)变为5游戏的每一帧位置都会改变。它运行平稳,但在球失灵并有时重新出现之前,会出现小故障轨迹。 我发现,当我在窗口中移动鼠标时(知道我实现了一个需要鼠标移动的事件),球的移动非常平稳。

1 个答案:

答案 0 :(得分:0)

扩展comments中的答案,使用进行游戏循环的正确实现应如下所示:

HasX<WithoutX>::value

SFML tutorials

中提取的代码

但是,由于您正在从事物理学工作,因此我建议您answer来设置恒定游戏滴答,以避免在出现这种情况时出现此类故障元素发生碰撞。