【问题标题】:SFML drawing elements of vector of pointers指针向量的 SFML 绘图元素
【发布时间】:2019-04-09 05:13:44
【问题描述】:

这是我的程序的结构:

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 sceneElements 的元素是从这样的屏幕中收集的:

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++ 知识),但我不知道如何解决它。我将不胜感激。

【问题讨论】:

  • sceneElements(i) 是如何编译的?
  • 你是对的!最近我的 matlab 编码太多了……该死的 :)

标签: c++ pointers drawing sfml dereference


【解决方案1】:

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

你只需要继承你的 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。使用继承可以避免这个问题。

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2015-12-06
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多