這不是真正的「高級繪圖」應該如何工作。
你的父類(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
請求哪些組件才能正確繪製它(它是否具有着色器?是否需要紋理?)。
非常感謝所有的信息。稍後必須詳細瞭解,因爲我正在緊張地完成我的項目,但非常感謝。 –