指针向量的SFML绘图元素

时间:2018-11-05 19:52:22

标签: c++ pointers drawing sfml dereference

这是我程序的结构:

class Game
{
public:
    unsigned int progressFlags;

    sf::RenderWindow appWindow;
    Screen* currentScreen;

    Game(const unsigned int& width, const unsigned int& height, 
         const unsigned int& bitsPerPixel, const std::string& windowName);
   ~Game();

    void drawScreen();
};

游戏包含一个屏幕,定义为:

class Screen
{
public:
    std::vector<sf::Drawable*> sceneElements;
    sf::Sprite backgroundSprite;
    Screen();
    virtual ~Screen();
protected:
    sf::Texture backgroundTexture;  
};

std :: vector scene的元素从这样的屏幕中收集:

sceneElements.push_back(&backgroundSprite);

最后,我尝试使用一种简单的方法绘制所有图形对象:

void Game::drawScreen()
{
    for (unsigned int i = 0; i < currentScreen->sceneElements.size(); i++)
        appWindow.draw(*currentScreen->sceneElements(i));
}

但是appWindow.draw()失败。我认为这与取消引用指针有关(我不记得一些基本的c ++知识),但是我不知道如何解决它。我将不胜感激。

1 个答案:

答案 0 :(得分:2)

我只是从sf::Drawable(可能还有sf::Transformable)派生您的自定义类。这种分层绘制的方法非常简单,并且基本上由SFML完成。以下片段是从内存中写入的;可能有错别字。 :)

您只需将您的Screen类子类化:

class Screen : public sf::Drawable
{
public:
    std::vector<sf::Drawable*> sceneElements;
    sf::Sprite backgroundSprite;
    Screen();
    virtual ~Screen();
    virtual void draw(sf::RenderTarget &rt, sf::RenderStates states) const;
protected:
    sf::Texture backgroundTexture;  
};

draw()内,您只需遍历所有元素(类似于您已经做过的事情):

void draw(sf::RenderTarget &rt, sf::RenderStates states) const
{
    for (const auto &e : sceneElements)
        rt.draw(*e, states);
}

在这里,我们一次取消引用以从指针返回到对象,然后该对象通过引用传递(其余部分由继承进行传递)。

Game::drawScreen()也变得更加简单:

void Game::drawScreen()
{
    appWindow.draw(*currentScreen);
}

再次,从指针到实际对象(通过引用传递)去引用一次。

还要注意,您的原始设计违反了封装,因为Game必须知道如何使用Scene内部的内容。因此,如果您在Scene内部进行更改,则必须相应地调整Game。使用继承,可以避免此问题。