C++ SFML Sprite 运动没有按预期工作

标签 c++ sfml

我正在使用带有 C++ 的 SFML 来尝试移动应用了特定纹理的 Sprite ,但它并没有按照我想要的方式移动。

我是 SFML 的新手,我在 sfml 网站上阅读了关于运动的教程,并且我在 Youtube 上观看了很多关于这方面的教程。目前我看到的东西要么非常基础,要么足够复杂(主要是游戏开发的东西)

#include <SFML/Graphics.hpp>

#include <thread>
#include <chrono>

#include<iostream>

using namespace sf;
using namespace std;

    int main()
    {
        sf::RenderWindow window(sf::VideoMode(600, 600), "test!");

        Texture t;
        t.loadFromFile("/*texture directory*/");

        Sprite s(t);
        s.setScale(Vector2f(0.25f, 0.25f));

        float temp = 0;

        while (window.isOpen())
        {
            sf::Event event;
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                    window.close();
            }

            window.clear(Color::White);
            window.draw(s);
            window.display();

            s.move(Vector2f(temp, temp));


            for (int i = 0; i < 3; i++) {
                if (i == 0) {
                    this_thread::sleep_for(chrono::milliseconds(1000));
                    temp = 10;
                }
                else if (i == 1) {
                    this_thread::sleep_for(chrono::milliseconds(1000));
                    temp = 20;
                }
                else {
                    this_thread::sleep_for(chrono::milliseconds(1000));
                    temp = -10;
                }
            }
        }
        return 0;
    }

我希望 Sprite 移动到 (10,10),然后在一秒钟后移动到 (20,20),然后在一秒钟后移动回 (10,10)。 相反, Sprite 每三秒仅移动一次 (-10,-10),因此它仅在循环结束时获取 temp 的值。 setPosition 也是如此。

这里有一些非常基础的东西,但研究让我提出的问题多于答案,这就是我来这里的原因。

最佳答案

最外层的 while 循环管理绘图。您在其中放置了另一个 for 循环。内部循环必须先完成,然后外部循环才能继续其迭代,即绘制另一帧。执行不会异步发生,因此您的 for 循环与 std::this_thread::sleep_for 调用会阻塞渲染循环总共 3 秒。它使其更改为 temp,最后无条件地为 -10

相反,您想要做的是创建在渲染循环中持续存在的状态,并制作一个小型状态机。这个状态就是你的i。在 temp 附近声明并初始化它(当然,您也可以在 if 语句中使用 temp)并删除 for循环。如果您愿意,请在将 temp 设置为 -10 时忘记将 i 设置回 0继续动画。

另一种可行但较差的方法是:

  1. 将渲染(可能还有事件处理)代码放入一个函数中;
  2. 每次您希望刷新图形时调用此函数,即在每次设置 temp 之后,但请记住事先更新 s

最后,我相信 sf::Sprite 有访问状态的成员函数,而不仅仅是修改,所以你应该能够只使用 s,而不需要临时。保持简单并考虑控制流。

关于C++ SFML Sprite 运动没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247084/

相关文章:

c++ - Sublime 上的 EasyClangComplete 有什么用?

c++ - 将 boost 与显式模板实例一起使用

c++ - 模板 lambda 有时无法编译

c++ - 在结构中使用字符串时出现段错误

c++ - 尝试绘制 Sprite 图时出现 sfml 错误

c++ - SFML 2.0 碰撞类

c++ - 在我的 Mac 上编译时,当我使用 "gcc"编译但不使用 clang++ 时出现此错误

c++ - 使用valijson和Nlohmann的JSON for Modern C++来验证具有子方案的架构

c++ - GetInput() SFML 的替代品?

c++ - 运行 cmake 后出现 undefined reference 错误