Jak skrócić/ulepszyć fragment mojego kodu

0

Mam stworzony EntityComponentSystem i powiedzmy mam dwa komponenty:

Podstawa class C_Body;
I komponenty class C_WalkingBody; oraz C_FlyingBody;

Do entity przypisujemy w przypadku tych komponentów jeden z nich.
Potem mam fragment kodu:

	C_Position* position = entities->GetComponent<C_Position>(entity, Component::Position);
		C_Drawable* drawable = nullptr;
		C_Body* body = nullptr;
		if (entities->HasComponent(entity, Component::SpriteSheet)){
			drawable = entities->GetComponent<C_Drawable>(entity, Component::SpriteSheet);
		} else { continue; }
		if(entities->HasComponent(entity, Component::WalkingBody)){
			body = entities->GetComponent<C_WalkingBody>(entity, Component::WalkingBody);
			position->SetPosition(body->GetPosition());
		}

		drawable->UpdatePosition(position->GetPosition());

Nie podoba mi się fragment

		if(entities->HasComponent(entity, Component::WalkingBody)){
			body = entities->GetComponent<C_WalkingBody>(entity, Component::WalkingBody);
			position->SetPosition(body->GetPosition());
		}

Powiedzmy że będę miał nagle 10 komponentów różnego typu body i musiałbym we wszystkich miejscach programu dodawać te ify do każdego rodzaju komponentu; Czy jest jakiś sposób by to skrócić? Na początku wpadłem na pomysł żeby w klasie C_Body stworzyć zmienną C_Body* m_bodyType; i w każdym komponencie robić m_bodyType = this; ale nie mam dostępu do tego wskaźnika przecież co możecie zauważyć we fragmencie kodu który pokazałem.

1
    C_Position *position = entities->GetComponent<C_Position>(entity,Component::Position);
    if(!entities->HasComponent(entity, Component::SpriteSheet)) continue;
    C_Drawable *drawable=entities->GetComponent<C_Drawable>(entity,Component::SpriteSheet);
    if(entities->HasComponent(entity,Component::WalkingBody))
    {
        C_Body *body=entities->GetComponent<C_WalkingBody>(entity,Component::WalkingBody);
        position->SetPosition(body->GetPosition());
    }
    drawable->UpdatePosition(position->GetPosition());
typedef void Proceed(C_Entity *entity);
void proceedWalkingBody(C_Entity *entity) { ... }
void proceedFlyingBody(C_Entity *entity) { ... }
static map<Component::BodyType,Proceed> map
{
    {
        {Component::WalkingBody,proceedWalkingBody},
        {Component::FlyingBody,proceedFlyingBody},
    }
};

Nie ma już żadnych ifów, obróbkę robisz przez mapę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1