所以我是堆栈溢出和一般编程的新手,所以如果我出于无知做了或说了任何公然愚蠢的话,请原谅我。
所以,我最近一直在尝试学习如何使用 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
存储和使用的拷贝。
我会在额外的范围内更新这个 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/