【问题标题】:Moving Sprite (SFML) in c++ using Loops使用循环在 C++ 中移动 Sprite(SFML)
【发布时间】:2019-07-23 23:40:11
【问题描述】:

我是 C++ 和 SFML 的新手。我正在尝试使用循环使我的精灵对象相对于其最后一个位置向下移动。我正在寻找程序启动时它的精灵对象掉落的动画。

我认为在我的 for 循环中实现 sleep 函数将有助于解决我遇到的问题,即程序只会在循环的最后一次迭代中显示对象。但是我的程序只是冻结和崩溃。

寻找方向。也许 sleep 函数在这里调用不正确?

#include <SFML/Graphics.hpp>
#include <Windows.h>
#include <iostream>
using namespace std;


int main()
{
    // Create the window here. Calling out the dimensions
    sf::RenderWindow window(sf::VideoMode(800, 600), "Example Window");

    // run the program as long as the window is open
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            //close window we requested
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }

        }

        window.clear(sf::Color::Black);


        sf::Texture texture;
        if (!texture.loadFromFile("c:\\abstract.png"))
        {
            cout<<"Failed to load image...";
        }
        sf::Sprite sprite;
        sprite.setTexture(texture);
        sprite.setTextureRect(sf::IntRect(20,20,30,30));


        for (float i = 0; i < 30.; i++)
        {
            sprite.move(sf::Vector2f(5.f, i));
            window.draw(sprite);
            Sleep(50);
        }



        window.display();
    }

    return 0;
}

【问题讨论】:

    标签: c++ sprite sfml


    【解决方案1】:

    您在for 中所做的是:处理、绘图、处理、绘图...最后显示您使用window.display() 绘制的内容。 这意味着每帧将在窗口上显示的内容是您“处理,绘图”的结果,换句话说,是您的精灵在不同位置的 30 倍。 你想要的是每帧移动你的精灵一点。因此,您必须完成当前的while (window.isOpen()) 迭代才能移动您的精灵、绘制它并显示它,并且一遍又一遍地进行。

    你应该做的是在你的游戏循环之外声明你的精灵(即while (window.isOpen())),并将它移动到这个循环中。

    一步一步,你的程序应该是这样的:

    • [开始]
    • 初始化上下文
    • 创建一个精灵
    • 开始循环
      • 清屏
      • 收集输入
      • 移动你的精灵
      • 画出你的精灵
      • 在窗口上显示您的绘图
    • 结束循环
    • [退出]

    您需要处理的最后一件事是 deltaTime(时间步长)。因为如果你每帧从 (x,y) 移动你的精灵,这意味着你的计算机越快(能够快速渲染很多帧),你的精灵移动得越快。为了解决这个问题,你必须考虑当前帧和前一帧之间经过的时间来移动你的精灵(你的 PC 越慢,你的精灵在一帧中移动的越多,你的 PC 越快,你的精灵在一帧中移动的越少)。时间步长将使您的精灵每秒移动 (x,y),而不是每帧移动 (x,y),这是您在大多数图形应用程序中想要的。

    【讨论】:

    • 加上 Adrien 已经说过的话,尝试在循环之外声明/加载您的精灵,它不是很有效地从您的应用程序的每一帧的硬盘驱动器加载精灵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多