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
私のビジュアル ツリーには、SceneNodeDrawable と 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。これは可能ですか?