3

ねえ、私は「ボディ」と呼ばれるクラスに取り組んでいます。このクラスは、シェイプとスプライトを1つのオブジェクトとしてまとめています。ソースコードに入り、新しいオーバーロードRenderWindowのDraw()関数を追加して、この新しいオブジェクトを簡単に取り込んで描画できるようにしたいと思います。どうすればこれを行うことができますか?

私は現在使用しています

  • Windows 7
  • SFML 1.6
  • 新しくmsVS++2010でコンパイルされた静的デバッグライブラリとdll
  • 元のインクルードフォルダ

編集:

Drawable.hppヘッダーにもこれがあります。

private :

    friend class RenderTarget;

////////////////////////////////////////////////////////////
/// Draw the object into the specified window
///
/// \param Target : Target into which render the object
///
////////////////////////////////////////////////////////////
void Draw(RenderTarget& Target) const;

////////////////////////////////////////////////////////////
/// Render the specific geometry of the object
///
/// \param Target : Target into which render the object
///
////////////////////////////////////////////////////////////
virtual void Render(RenderTarget& Target) const = 0;

しかし、各関数の完全なコードがどこにあるのかわかりません。宣言だけです。残念ながら、そこにもミニチュートリアルは見つかりませんでした...

4

2 に答える 2

4

ノート:

独自のDrawableから派生して実装する前に、それを実行する必要があるかどうかを検討することをお勧めしますsf::Drawable SFMLの作成者は、当初はSFMLの外部でサブクラス化することを意図していなかったと述べています。

それはさておき、

SFML 1.6の場合:

からクラスを派生させてからsf::Drawable、仮想Render関数を実装するだけでよいようです。

class MyDrawable : public sf::Drawable {

private:

    virtual void Render(RenderTarget& target) const {
        // Do some rendering of whatever...
        target.Draw(mySubSprite);
    }

    sf::Sprite mySubSprite;

};

この例は、SFMLフォーラムにあります

SFML 2.0の場合:

DrawableSFMLのDrawableヘッダーファイルには、独自のクラスを派生させる方法を説明するコメントが含まれています。新しいDrawableを作成するためにSFMLソースコードを変更する必要はありません。

簡単な例も含まれています。

class MyDrawable : public sf::Drawable
{
public :
   ...
private :
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // You can draw other high-level objects
        target.draw(m_sprite, states);
        // ... or use the low-level API
        states.texture = &m_texture;
        target.draw(m_vertices, states);
        // ... or draw with OpenGL directly
        glBegin(GL_QUADS);
        ...
        glEnd();
    }
    sf::Sprite m_sprite;
    sf::Texture m_texture;
    sf::VertexArray m_vertices;
};

この例はSFML2.0に適用される場合がありますが、使用しているDrawable.hppSFMLのバージョンを調べる場合は、同様の例が含まれている必要があります。

于 2011-07-10T02:27:09.893 に答える
0

RenderWindow::Draw抽象クラス型のオブジェクトを取りますDrawable。つまり、理論的には、Bodyクラスを子にDrawableし、いくつかの仮想メソッドをオーバーロードしてレンダリングさせることができます。

しかし、そうではないようです。のドキュメントはDrawable、そのクラスに仮想関数が1つしかないことを示しています。それはデストラクタです。それは...ちょっとばかげています。

ただし、見た目はだまされている可能性があります。2.0のドキュメントをチェックして、継承階層を正しく作成する方法を理解しているかどうかを確認しましたが、オーバーライドする仮想メソッドがあることがわかりました。それは彼らがすべてプライベートであるということだけであり(それ自体は問題なく、実際には非常に良いことです)、SFMLの人たちはDoxygenにプライベートメンバーのドキュメントを生成するように指示しませんでした。私はこれについて彼らにバグを提出しました。

彼らがドキュメントを更新するまで、私が言えるのは、ヘッダーと、おそらくSpriteのソースコードを見て、派生したDrawableクラスを正しく作成する方法を理解することだけです。

于 2011-07-10T01:48:04.203 に答える