将SFML RenderWindow传递给类

时间:2017-02-26 15:31:18

标签: c++ sfml

我担心我从有限的Python体验中来到C ++。在Python中,我经常使用Tkinter来处理我的GUI,我可以将“canvas”或“window”传递给存储它的其他类,然后可以绘制到只传递过一次的画布/窗口。

我希望对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 ++?

1 个答案:

答案 0 :(得分:1)

您可以从包含纯虚拟sf::Drawable方法的draw()继承。

class Player : public sf::Drawable
{
     protected:
          void draw(sf::RenderTarget& target, sf::RenderStates state) const
          {
               target.draw(sprite);
          }
};

Player班级成为sf::Drawable时,您将可以执行此操作:

Player player;
window.draw(player);

这也是如何在sfml中绘制实体,如形状,精灵,顶点等。