将 SFML RenderWindow 传递给 class
Passing SFML RenderWindow to class
恐怕我是从有限的 Python 经验中来到 C++ 的。在 Python 中,我经常使用 Tkinter 来处理我的 GUI,我可以将我的 'canvas' 或 'window' 传递给存储它的其他 classes,然后可以绘制到 canvas / window 只经过一次。
我希望对 SFML 和 C++ 做同样的事情,但到目前为止,我只找到了每次调用该方法时必须将我的 sf::RenderWindow
传递给该方法的解决方案。
例如,我有一个'player' class,我想每次都拿着玩家的精灵并移动精灵 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);
}
我知道将 render-window 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++?
您可以从 sf::Drawable
继承,其中包含纯虚拟 draw()
方法。
class Player : public sf::Drawable
{
protected:
void draw(sf::RenderTarget& target, sf::RenderStates state) const
{
target.draw(sprite);
}
};
当 Player
class 成为 sf::Drawable
时,您将能够做到这一点:
Player player;
window.draw(player);
这也是在 sfml 中绘制实体的方式,例如形状、精灵、顶点等
恐怕我是从有限的 Python 经验中来到 C++ 的。在 Python 中,我经常使用 Tkinter 来处理我的 GUI,我可以将我的 'canvas' 或 'window' 传递给存储它的其他 classes,然后可以绘制到 canvas / window 只经过一次。
我希望对 SFML 和 C++ 做同样的事情,但到目前为止,我只找到了每次调用该方法时必须将我的 sf::RenderWindow
传递给该方法的解决方案。
例如,我有一个'player' class,我想每次都拿着玩家的精灵并移动精灵 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);
}
我知道将 render-window 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++?
您可以从 sf::Drawable
继承,其中包含纯虚拟 draw()
方法。
class Player : public sf::Drawable
{
protected:
void draw(sf::RenderTarget& target, sf::RenderStates state) const
{
target.draw(sprite);
}
};
当 Player
class 成为 sf::Drawable
时,您将能够做到这一点:
Player player;
window.draw(player);
这也是在 sfml 中绘制实体的方式,例如形状、精灵、顶点等