5. +
Game entities share capabilities among
each others
deal_damage_around
deal_damage_around deal_damage_around
deal_damage_around
movable
movable movable
throwable
throwable
lie_on_ground
lie_on_ground
delay_on_activating
delay_on_activating
activate_on_touch
activate_on_touch
6. +
Game entities share capabilities among
each others
Impossible to build a good OOP class hierarchy!
natural relationships welcome changes code reuse
7. +
First solution comes to mind:
mix-ins via multiple-inheritance
1. Just a small portion of the tree is a mess already
2. Multiple inheritance smells
3. Where to put logic that evolves object of different classes?
Capability
Moveable DealDamage ActivateOnTouch Throwable
Thorn Cloud Bomb Bull
8. +
Need a better solution
Component-based entity system has been
a hot topic for years.
It helps solve our problem in an elegant way!
9. +
Component-based entity system
Multitude of ways to represent and
implement
This talk discusses one way which we found
practical and easy to understand
Three elements:
Entity
Component
System
10. +
Component-based entity system
Decompose game entities by capabilities into
reusable components.
Prefer aggregation over inheritance, i.e.,
entity has components, not is a type of
some component.
11. +
Entity and Component
Velocity Damage Graphic ThrowAngle ActivateOnTouch
Thorn x x x
Cloud x x x
Bomb x x x x
Bull x x x x
Entity is: an unique ID + a list of components
Component contains only data
12. +
Where does the logic go?
The systems.
Bull Light
-ning
Thorn
Cloud
Stick
-man
Game has a bunch of
entities
Entities are processed by
systems
M o v e m e n t S y s t e m
A n i m a t i o n S y s t e m
P h y s i c s S y s t e m
C o l l i s i o n S y s t e m
H e a l t h S y s t e m
13. +
Systems only process entities they
“care” about
Entities are keys Systems are locks
http://gamedev.stackexchange.com/a/31491
Components are teeth
14. +
Entity system sum up
Entity
Is just a unique ID with a bunch of components
Doesn’t need a separate Class for each entity
Component
Is the “ingredient” to make entities.
Contains data only.
System
Contains game logic
Run on every game loop, process entities who has a set of
components it care about.
15. +
Other benefits of using entity
system
Goes hand-in-hand with Data-Driven development:
Entities are defined as bags of components, in text file.
“No engineer required”, game designer can create new or edit
existing entities easily.
Easy to change or fine-tune entities
Promote multi-threading
Systems are independent from one another, so they can run on
separate threads
16. +
Artemis Entity System
An Entity system framework written in Java:
http://gamadu.com/artemis/tutorial.html
Is open-source, active project
Ported to many different languages
17. +
Artemis Entity System and Cocos2d
Sidar Talei ported to C++, we forked, modified and maintain:
https://github.com/vinova/Artemis-Cpp
Our port:
Works great with cocos2d-x!
Work great with any C++ framework. No external libs or C++11
compiler are required
JavaScript binding coming soon
18. +
References
A Data-Driven Game Object System
http://scottbilas.com/files/2002/gdc_san_jose/game_objects_slides.ppt
Entity Systems are the future of MMOG development
http://t-machine.org/index.php/2007/11/11/entity-systems-are-the-future-of-mmog-
development-part-2/
Evolve Your Hierarchy
http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
Editor's Notes
Introduction
It’s always great to start small, release fast and learn a complete experience.
Our second game is God’s Rage.
The story is that you play the God. Your daughter is so beautiful that a “normal” guy felt in love with her.
Of-course, as a God, you can’t accept that, so you try to prevent the guy from reaching to your daughter.
Your weapons are traps, which were initially put on the road, and skills, which you can throw down
And for any software being a bit complex, we need a good architecture for it.
And for any software being a bit complex, we need a good architecture for it.
Really don’t need separate classes for different entities.
Just pick proper components and we have the entity we want
Slice game by aspects into systems
MovementSystem
AnimationSys
PhysicSys
Systems run sequentially in each game loop, process entities they cares about.
Which entities a system cares about? The ones that have a certain set of components.
MovementSystem process entities having Position and Velocity components
CollisionSystem process entities having RigidBody component.
RenderSystem process entities having Sprite and Position components.
Byte56 had a great explanation of the roles of component