2017-04-25 9 views
1

私はSFをサイエンスプロジェクトに使用しています - チェスゲームを作っています。私は、チェス盤の1つの正方形であるクラスSquareを持っています - 現在、それは4つの頂点(メンバー変数sf::VertexArrayの4つのsf::Vertexオブジェクト)を含み、白か黒の色です。 ChessBoardクラスは、正方形のstd::vectorをカプセル化します。"上位レベルの"オブジェクトを描画する

SFMLで与えられたチュートリアルを使用して、1つの四角形を描くことができます。しかし、draw()関数は頂点に基づいて動作し、ChessBoardクラスは実際には頂点を含んでおらず、それ自身が頂点を含むオブジェクトであるため、チェスボードを描画することはできません(つまり、内部のdraw()関数は機能しません)。

これを回避する方法を知っている人はいますか? (必要に応じて詳しい情報や説明を入力できます)

答えて

0

Nevermind。愚かな私。頂点配列を返したクラスSquareの中に&のゲッターを実装し、Chessboardを四角形のベクトルにループさせ、各繰り返しでゲッターを呼び出しました。

2

これは実際には「高レベルの描画」がどのように動作するはずではありません。

あなたの親クラスは、子供の描き方を気にする必要はありません。あなたは責任を混同しています。

代わりに、サブクラス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

すべての情報をありがとうございました。私のプロジェクトを終わらせるためのクランチと同じように、後で詳しく見ていく必要がありますが、それは非常に感謝しています。 –

関連する問題