2

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。これは可能ですか?

4

2 に答える 2

0

SMFL について何も知らなくても (より良い解決策を提供する可能性があります)、このベクトルを実装できると思います。複数の型から継承するオブジェクトへのポインターのみを受け入れる独自のポインター ラッパーを定義するだけで済みます。

template <class T1, class T2>
struct special_pointer_wrapper
{
    T1* t1;
    T2* t2;
    template<class T>
    special_pointer_wrapper(T* p)
        : t1(dynamic_cast<T1*>(p))
        , t2(dynamic_cast<T2*>(p))
    {
       if ((p1==0) || (p2==0))
           throw "Error";
    }

    getT1 T1* () const { return t1; }
    getT2 T2* () const { return t2; }
};

このクラスは任意のポインターを取り、その指す型が T1 と T2 から派生していることを保証します (それらがまったく無関係に見える場合でも)。派生オブジェクトでない場合はスローします。関数getT1()getT2()使用すると、両方の基本クラスへのポインターにアクセスできます。

dynamic_cast型の抽出は O(1) であるため、構築が遅くなる可能性があることに注意してください。

于 2013-10-17T20:05:25.350 に答える