As it is a bit offtopic i moved that part in its own thread here: Delegation - what system? component or entity?
I’m bumping the thread as it’s completely related to delegation issues i got a few months back.
Moving
What i’m doing atm is something like that in a MovementSystem
:
if input.left then translation.dx -= 5
if input.right then translation.dx += 5
I gather all my deltas and then a CollisionSystem
will resolve everything and actually push those deltas into a CPosition
component.
And all of it made sense until i tried to jump.
Jumping
My main issue is that i wasn’t sure where to put that piece of code. At first i simply added in the MovementSystem
something like:
if input.up && !entity.has(CJumping) then em.addComponent(entity, new CJumping())
if entity.has(CJumping) then
JUMPALGORITHMSOMETHING
trans.dy -= somevalue
It’s getting uglier but still working.
But then i was wondering, WHAT IF a spring block wanted to make my entity jump - if i’m following the rule of one system per component add/update i would obviously break it when another System would have to add a CJumping
component when it wasn’t its role.
So i talked to someone who advised me to go the entity way and i like the idea but not convinced about the implementation.
One way would be to go full impulse, if every movement delta is actually a new entity with a CImpulse
component then jumping is just a matter of adding a new entity with the proper physics value. But that kind of abstraction implies that i actually build a little physics engine when i just want to go the arcade way. I am not particularly found of the idea of generating that many impulse entities per frame either but that might be negotiable with my brain.
So i’m back with my specific jumping algorithm idea and still not sure how to go with it.
I could do something in MovementSystem
like:
if input.up then createJumpEntity()
That entity would have a CJump
and a CChildOf
component that a JumpSystem
will look for. So i could reach the entity through the CChildOf
pointer and apply some delta to the entity CTranslation
component. It would solve the spring block problem but again i’m modifying a component that is reserved for the CollisionSystem
originally.
So i ask myself if that’s a specific case of collision resolution… where i could actually enforce that rule or maybe more that CTranslation
by definition is made to gather a bunch of deltas so it’s fiiiiine and it’s probably not; i have huge issues figuring something as simple as jumping.
It seems to be the same problem every time i need to handle states, CJumping
, CGrounded
, CChopping
…
Help