Вызов виртуальных методов с полиморфизмом на обоих классах-наследниках C ++ - PullRequest
0 голосов
/ 27 мая 2020

Я создаю небольшую игру, на самом деле свою первую, и, прочитав о компонентах, я решил ее реализовать. Существует абстрактный класс GameObject, состоящий из GraphicsComponent и InputComponent (и, кроме того, из PhysicsComponent), классы компонентов Graphics и Input также являются абстрактными. У них есть следующий метод:

virtual void update(GameObject& gameObject) = 0;

У меня есть два наследования GameObject, Player (используется в GameRunningState) и Button (используется в MainMenuState). Каждый из них должен будет реализовать Graphics и Input, соответствующие их поведению (например, PlayerGraphicsComponent, PlayerInputComponent, ButtonGraphicsComponent и т. Д.).

Итак, вот и проблема, разница между игроком и кнопкой - это их свойства :

  • скорость и скорость для игрока
  • наведение и нажатие кнопки.

Доступ к этим свойствам осуществляется методом обновления, как показано ниже :

void ButtonGraphicsComponent::update(GameObject& gameObject, float& dt)
{
    if( gameObject._pressed )
        _sprite.setColor( _pressedColor );
    else if( gameObject._hover )
        _sprite.setColor( _hoverColor );
    else
        _sprite.setColor( _idleColor );
}

Он работает "нормально", но для того, чтобы это работало, эти свойства должны быть в GameObject:

class GameObject
{
    /* Player */
    sf::Vector2f _velocity;
    int _speed;
    /* Button */
    bool _hover;
    bool _pressed;
protected:
    GraphicsComponent* _graphicsComponent;
    InputComponent* _inputComponent;
}

Если я изменю ButtonGraphicsComponent :: update на Button вместо GameObject as параметра, я теряю общность в частных указателях на Graphics и Inputs на GameObject. GameObject и его компоненты?

Заранее спасибо !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...