【发布时间】:2017-07-17 03:54:07
【问题描述】:
恐怕我是从有限的 Python 经验来到 C++ 的。在 Python 中,我经常使用 Tkinter 来处理我的 GUI,我可以将我的“画布”或“窗口”传递给其他存储它的类,然后可以绘制到只传递一次的画布/窗口。
我希望对 SFML 和 C++ 做同样的事情,但到目前为止,我只找到了每次调用该方法时都必须将我的 sf::RenderWindow 传递给该方法的解决方案。
例如,我有一个“玩家”类,我想在每次调用 Player.move('up') 时保存玩家的精灵并移动精灵,目前我已经解决了发现说我必须使用以下代码(可能有点不正确,我只是在火车上打出来的,但希望你能得到图片):
Main.cpp
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "Player.h"
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "My Game");
Player player(); //Nothing passed
player.move(window, "up"); //Pass window every time
player.move(window, "down");
player.move(window, "left");
return 0;
}
Player.cpp
Player::move(sf::RenderWindow& window, char direction){
/*Code to move the sprite shall be on this line*/
window.draw(sprite);
}
我知道将渲染窗口 window 传递给一个方法并不是什么大问题,但我觉得必须有一种方法可以更像这样:
Main.cpp
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "Player.h"
int main(){
sf::RenderWindow window(sf::VideoMode(800, 600), "My Game");
Player player(window); //Pass window once.
player.move("up"); // Relax knowing that everything is already handled.
player.move("down");
player.move("left");
return 0;
}
Player.cpp
Player::Player(sf::RenderWindow& win_gui){
window = win_gui;
}
Player::move(char direction){
/*various case statements to move the sprite on this line*/
window.draw(sprite);
}
我要么错过了一些巨大的东西,要么完全误解了。我的猜测是两者兼而有之。如果可以用另一种语言,为什么不使用 C++?
【问题讨论】:
-
为什么
move还要打电话给draw?将渲染与游戏逻辑隔离开来。 -
'down'应该是双引号。这段代码编译了吗? -
Guillame,我已经更正了单引号。我目前正在一段很长的火车旅程中,并从记忆中输入了这个,所以可能有更多的错误。 LogicStuff,为什么
move不应该打电话给draw?我被教导让方法处理任何人可能期望的尽可能多的过程。如果我给某人这个类来使用他们的 SFML 游戏并且他们输入“player.move("up");"当玩家不向上移动时,他们会很困惑。如果我不能用方法做那种事情,那么我们世界上唯一的东西就是 getter 和 setter,太无聊了!