1

ヒューマノイドから派生したプレーヤークラスがあり、ヒューマノイドはスプライトから派生しています

Sprite -> Humanoid -> Player

ここまでは順調ですね。スプライトには仮想メソッドがあります

virtual sf::Sprite getSprite() { return sprite_; }

ここで、sprite は画面に描画できる画像オブジェクトです。

ヒューマノイド宣言virtual sf::Sprite getSprite();

プレーヤーが定義するvirtual sf::Sprite getSprite() { return sprite_; }

スプライトにはメンバーがありsprite_ます。これが私がやりたいことです:

1) のようにスプライトを渡しながらプレイヤークラスを作成する

Player::Player(sf::Image image)
    : Humanoid()
{   
    sprite_.SetImage(image); // Converts sf::Image to sf::Sprite
}

2) Game クラスから画面に描画する

sf::Image playerImage;
if(!playerImage.LoadFromFile("Link/Link.png"))
    std::cin.get();

Player *player = new Player(playerImage);

/* ... */

App.Draw(player->GetSprite());

プログラムをテストしたところ、player->getSprite()メソッドが実際に呼び出されていることがわかりましたが、Sprite::getSprite()実際にメソッドを派生させて使用するのではなく、メソッドを隠していたのではないかと心配しています。Sprite クラスには保護された sprite_ メンバーがあるため、関数を呼び出したときに実際にどの sprite_ オブジェクトを返すのか混乱します。

また、画像ファイルが途中で失われたようで、SFML フォーラムに投稿する前に、私の継承ツリーが実際に正しいかどうかを確認したいと思います。

4

1 に答える 1

6

Spriteクラスにsprite_メンバーがあり、どの派生クラス ( ) にも同じ名前のメンバーが追加されていない場合、インスタンスごとにHumanoid/Player1 つのオブジェクトしかなく、関数は期待どおりに動作するはずです。ただし、まったく同じ動作をさせると、sprite_オーバーライドする理由がわかりません。getSprite

于 2010-11-04T21:05:02.690 に答える