How to reduce Duck-typing phenomenon in entity-component-system?
Example
(These are pseudo code. Many things are simplified and omitted.)
There are 2 systems in my ECS :-
System_Projectile
: manage all projectile and bullet aspect.
System_Physic
: manage physic's component.
There are 2 components-type : Com_Projectile
, Physics
.
Sometimes, I find that it is nice to cache pointer to another entity in some certain component :- .
class Com_Projectile{
public: Entity* basePhysic;
};
Here is how I currently change position of the Com_Projectile
via its field : basePhysic
.
class System_Projectile{
public: void manage(Entity* projectile){
Com_Projectile* comP = getComponent<Com_Projectile>(projectile);
//suffer duck-typing at "comP->basePhysic"
System_Physic::setVelocity(comP->basePhysic,Vec3(1,0,0));
}
};
getComponent<>
is a function to request a certain component from an entity.
Problem
The real program based on the above snippet works OK.
However, when coding, Com_Projectile::basePhysic
suffer duck-typing.
- I get no clues about
basePhysic
's type at all. - I have to be conscious about type of
basePhysic
. - Then, I have to recall name of system (
System_Physic::
) that can do a thing I want (setVelocity()
). - There are a lot of indirection for my brain.
In my old days, when I use a lot of (deep) inheritance, it is much easier, like this :-
basePhysic->setVelocity(Vec3(1,0,0));
I really miss the cute content assists that list all the functions that related to physics.
Question
How to reduce duck-typing in some certain part of ECS system?
More specifically, what is a design pattern to enable the cute content-assist again?
My current workaround is to let Com_Projectile
cache Physic* basePhysic
instead of Entity*
, but it will promote unwanted (?) coupling.
class Com_Projectile{
public: Physic* basePhysic; //edited from "Entity* basePhysic"
};
Aucun commentaire:
Enregistrer un commentaire