SFML でビジュアル ツリーを実装しています。SFML には、 と の 2 つの重要な描画クラスが含まれていsf::Drawable
ますsf::Transformable
。これらが一緒にバンドルされていればいいのですが、そうではありません。多くのオブジェクトは両方から継承します。
class SFML_GRAPHICS_API Text : public Drawable, public Transformable
class SFML_GRAPHICS_API Sprite : public Drawable, public Transformable
class SFML_GRAPHICS_API Shape : public Drawable, public Transformable
私のビジュアル ツリーには、SceneNode
Drawable と Transformable から継承するクラスがあり、描画関数はプライベート onDraw 自体を呼び出し、次にその子を呼び出します。ただし、 などの多くの SFML ネイティブ クラスにsf::Text
は、非公開の draw 関数があります。だから、私はのようなクラスを作成することはできません
class Text: public sf::Text, public SceneNode
そしてそれをビジュアルツリーに入れます。これらのネイティブ クラスについては、いずれにせよ子を描画する必要はありません。ビジュアル ツリーにリーフ ノードとして追加できるようにしたいだけです。sf::Drawable
問題の核心は、ビジュアル ツリーの各メンバーがおよびから継承する必要があることsf::Tranformable
です。これらの両方から継承する型を定義できる必要があります。ダミークラスを定義すると
class LeafNode: public sf::Drawable, public sf::Tranformable { }
私が望むタイプを定義しているように見えます。次に、SceneNode
が含まれますstd::vector<LeafNode*> m_children
。これらの子を描画するときは、各項目に対して動的キャストを実行して、それが であるかどうかを確認してからSceneNode
、描画関数を呼び出して、 がSceneNode
その子を描画するようにします。
ただし、次のコードは型の非互換性のためにコンパイルされません。
LeafNode * node = new sf::Text("PLAY", font, 20);
理想的には、次のようなものを定義したい
std::vector<sf::Drawable, sf::Transformable*> m_children
その作成された構文は、各要素がsf::Drawable
との両方から派生する必要があることを意味しますsf::Transformable
。これは可能ですか?