Вопрос о наследовании в моей игре - PullRequest
1 голос
/ 05 ноября 2010

У меня есть класс Игрока, который происходит от Гуманоида, а Гуманоид происходит от Спрайта, вот так

Sprite -> Humanoid -> Player

Пока все хорошо. Sprite имеет виртуальный метод

virtual sf::Sprite getSprite() { return 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, я хотел бы получить некоторое подтверждение того, является ли мое дерево наследования правильным или нет.

1 Ответ

6 голосов
/ 05 ноября 2010

Если класс Sprite имеет член sprite_ и ни один из производных классов (Humanoid/Player) не добавил члена с таким именем, то для каждого экземпляра существует только один объект sprite_, и функция работать как положено. Я не понимаю, почему вы переопределяете getSprite, если вы даете ему точно такое же поведение.

...