これは実際には「高レベルの描画」がどのように動作するはずではありません。
あなたの親クラスは、子供の描き方を気にする必要はありません。あなたは責任を混同しています。
代わりに、サブクラス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
から適切に描画するよう要求するコンポーネント(シェーダはありますか?テクスチャが必要ですか?)を知っている必要があります。
すべての情報をありがとうございました。私のプロジェクトを終わらせるためのクランチと同じように、後で詳しく見ていく必要がありますが、それは非常に感謝しています。 –