Я создаю небольшую игру, на самом деле свою первую, и, прочитав о компонентах, я решил ее реализовать. Существует абстрактный класс 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 и его компоненты?
Заранее спасибо !!