簡體   English   中英

指針向量的SFML繪圖元素

[英]SFML drawing elements of vector of pointers

這是我程序的結構:

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 ++知識),但是我不知道如何解決它。 我將不勝感激任何幫助。

我只是從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 使用繼承,可以避免此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM