2017-04-25 81 views
1

所以我使用SFML作爲計算機科學項目 - 製作象棋遊戲。我有一個類Square這是棋盤的一個方形 - 目前,它包含四個頂點(四個sf::Vertex對象在成員變量sf::VertexArray),並且被着色爲白色或黑色。類ChessBoard封裝了Squares的std::vector繪製「高級」對象

使用SFML給出的教程中,我能畫一個正方形。然而,基於頂點draw()功能的作品,而且由於ChessBoard類不不實際包含的頂點,而是使用對象是本身包含的頂點,我不能畫棋盤(即其內部draw()功能不起作用)。

有誰知道如何解決這個問題? (我可以根據需要/有益提供更多信息/澄清/代碼。)

回答

0

沒關係。傻我。在類Square內部實現了一個吸氣器,它返回頂點數組&內部的Chessboard環通過正方形矢量,在每次迭代中調用getter。

2

這不是真正的「高級繪圖」應該如何工作。

你的父類(ES)不應該打擾如何繪製的孩子。你在混合責任。

相反,子類sf::Drawable(和sf::Transformable,如果需要的話)。

這一切都不會強迫你實現一個draw()成員,它做所有的繪圖。

這裏有一個簡單的例子,你ChessBoard類:

class ChessBoard : public sf::Drawable { 

    void draw (RenderTarget &target, RenderStates states) const { 
     for (auto &tile : mTiles) // Iterate over all board pieces 
      target.draw(tile, states); // Draw them 
    } 
} 

正如你所看到的,這是微不足道的設置。以類似的方式,你可以超載你的類Square。 (是不是這個名字太普通?爲什麼就不能重用sf::RectangleShape?)

class ChessBoard : public sf::Drawable { 

    void draw (RenderTarget &target, RenderStates states) const { 
     target.draw(mVertices, states); 
    } 
} 

所以,回到你的遊戲主循環。如何繪製ChessBoard?同樣的,瑣碎的:

while (window.isOpen()) { 
    // All the other things happening 

    window.draw(mChessBoard); 
} 

雖然這種方法的優點可能不會在第一次那麼明顯,這是很容易地看到,你能夠通過責任倒行的。例如,ChessBoard不必知道如何正確繪製Square。在一個簡單的例子中 - 只使用單色多邊形 - 並不是那麼容易注意,但是一旦你開始添加着色器,紋理等,你的代碼將變得更加清潔。突然之間,你不再需要返回一個sf::VertexArray,但是你還需要指向其他資源的指針或引用。因此,ChessBoard必須知道,要從Square請求哪些組件才能正確繪製它(它是否具有着色器?是否需要紋理?)。

+0

非常感謝所有的信息。稍後必須詳細瞭解,因爲我正在緊張地完成我的項目,但非常感謝。 –