c++ - SFML 中的 View 存在一些问题

标签 c++ sfml

所以我是堆栈溢出和一般编程的新手,所以如果我出于无知做了或说了任何公然愚蠢的话,请原谅我。

所以,我最近一直在尝试学习如何使用 SFML,到目前为止,一切顺利,但最近,我一直在尝试对移动相机进行编程。让我向您展示我的代码:

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

#include <iostream>
#include <cstdlib>

using namespace std;
using namespace sf;

bool frame60 = true;

void print(string inputText) {
    bool consoleOn = true;
    if(consoleOn == true) { cout << inputText; }
}

void start() {
    sf::View view1;
    view1.reset(sf::FloatRect(300, 200, 300, 200));
    view1.setCenter(0, 0);

    RenderWindow window(VideoMode(1600, 900), "Test Game");
    window.setView(view1);
    window.setKeyRepeatEnabled(false);
    switch(frame60) {
    case true:
        window.setFramerateLimit(60);
        break;
    case false:
        window.setFramerateLimit(30);
        break;
    default:
        window.setFramerateLimit(60);
        break;
    }

    Texture testure;
    testure.loadFromFile("vsm.png");
    Sprite testsprite;
    testsprite.setTexture(testure);

    testsprite.setOrigin(0, 0);

    float playerx = 0;
    float playery = 0;


    while(window.isOpen()) {
        Event event;
        while(window.pollEvent(event)) {
            switch(event.type) {
                //Making the window closable
            case Event::Closed:
                window.clear();
                window.close();
                break;
            }
        }

        if(Keyboard::isKeyPressed(Keyboard::A)) {
            playerx += 0.5;
        }
        if(Keyboard::isKeyPressed(Keyboard::D)) {
            playerx -= 0.5;
        }

        testsprite.setOrigin(playerx, playery);

        view1.setCenter(playerx, playery);
        window.draw(testsprite);
        window.display();
        window.clear();

        cout << playerx << endl;
    }
}

int main() {
    start();
    return 0;
}

(不要介意我使用自制的启动函数,这只是我在尝试更好地了解如何在一般情况下使用 C++。这个程序的很多不必要的部分可能就是这种情况,因为这个程序只是一个学习练习。)

所以,基本上,如您所见,我有一个移动的蓝色矩形。但是,我希望相机跟随它,所以在游戏循环中,我告诉我的 View 将其中心设置为矩形所在的位置。很基本。问题是,屏幕不动。我按我设置的左右键,我仍然看到盒子在黑色背景上移动,如果 View 跟随它,它看起来根本不会移动,唯一证明它在移动的证据应该是在我的控制台窗口中。

我做错了什么?

最佳答案

如果你想改变窗口的 View ,你必须在之后调用sf::RenderWindow::setView。您只是在修改 view1,而不是 sf::RenderWindow 存储和使用的拷贝。

Reference

我会在额外的范围内更新这个 View ,而不是污染外部范围:

{
    sf::View view = window.getView(); // get the current view, view1 is not needed here
    // modify the view
    window.setView(view);
}

关于c++ - SFML 中的 View 存在一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744278/

相关文章:

c++ - MFC:删除动态创建的 CWnd 对象

c++ - SFML 绘图居中文本

C++ 在类中声明数组并在类中声明二维数组

C++ SFML时钟疯狂输出

c++ - 我们可以在 SFML 2.1/C++ 中制作 Sprite 数组或多维数组吗?

c++ - 如何在以空格分隔的行中获得无限输入?

C++决定开关中变量的类型

C++ 标准偏差分配需要帮助更正错误

c++ - 一个声明中多个函数的原型(prototype)

c++ - 获取 sf::View 的 X 和 Y 偏移量