Line 51: | Line 51: | ||
Every effect is based on at least one particle. Often but not always these root particles function only as emitters that spawn new particles and have no appearance of their own. They have the following three required properties: | Every effect is based on at least one particle. Often but not always these root particles function only as emitters that spawn new particles and have no appearance of their own. They have the following three required properties: | ||
;type: physical properties of the particle | ;type: physical properties of the particle | ||
; | ;position-x: (initial) position on map relative to the position where the effect is created (pixel-based) | ||
; | ;position-y: (initial) position on map relative to the position where the effect is created (pixel-based) | ||
; | ;position-z: (initial) position on map relative to the position where the effect is created (pixel-based) | ||
The following properties are optional: | The following properties are optional: | ||
Line 72: | Line 72: | ||
'''required:''' | '''required:''' | ||
:; | :;position-x: (initial) position on map relative to the parent particle (pixel-based) | ||
:; | :;position-y: (initial) position on map relative to the parent particle (pixel-based) | ||
:; | :;position-z: (initial) position on map relative to the parent particle (pixel-based) | ||
'''optional:''' | '''optional:''' |
Revision as of 01:19, 25 January 2007
This idea isn't really new. I already mentioned this topic a while ago but i decided to wait with the implementation until the new animation system is working so that it can be used for animated particles. To avoid any discussions about implementation details after the code is written i decided to document the whole system beforehand.
This article isn't finished. That is why it is in my personal directory. When i finished the article i will move it to Particle engine and link it from the front page in the RFC section.
What is a particle engine?
A particle engine is a system that allows to create beautiful dynamic special effects based on creating and managing a large number of small, independent, moving sprites. Flames, smoke, fountains and waterfalls are just some examples what can be done with such an engine. For more information about particle engines see the Wikipedia article about particle systems.
Why a particle engine?
A particle engine would allow us to create a large variety of beautiful special effects with minimal effort that would outclass those of most other sprite based rpgs. The areas where particle effects could be used include but are not limited to:
- Environmental effects like waterfalls, fountains or smoke comming out of chimneys
- Visualisation of mystical phenomenons like teleporters or other points of interest
- Graphic effects for spells
- Visualisation of status effects
Implementation
The basic element of the particle engine is the ParticleEngine class. It maintains a tree of particle effects. Each particle has a position in three dimensional space (in this case the two dimensional game world is threatet as a flat plane in a three dimensional space). Based on the type of particle it might or might not have:
- Movement based on physical properties
- A visual representation (a single image or an animation)
- A list of emitters that create additional particles.
The Particles are derived class from the "Sprite" class so that they can be added to the maps sprite list to be drawn together with the other sprites by the "map" class.
Types of particles
Static particles
Static particles are spawned on a specific map position and usually stay there. Unually used for invisible emitters that create animated effects on the map.
Independent particles
Particles that have a movement vector and move around without a specific target. Usually spawned by other particles.
targetingPoint particles
Particles that move to a specific map position.
targetingBeing particles
Particles that follow or move to a specific being (like players or monsters).
Ways to create an effect
To create an effect we need 3 informations:
- Animation file
- Location of the effect (a being or a map location)
- Destination of created particles (empty for independent particles, a being or a map location)
hat means that there are 6 different ways to create an effect.
The effect definition file
The effect definition files are xml documents describing one or more single particles or particle emitters. They can theoretically be loaded for all 6 ways to create effects.
<effect>
Is the root element of the XML document.
<particle>
Every effect is based on at least one particle. Often but not always these root particles function only as emitters that spawn new particles and have no appearance of their own. They have the following three required properties:
- type
- physical properties of the particle
- position-x
- (initial) position on map relative to the position where the effect is created (pixel-based)
- position-y
- (initial) position on map relative to the position where the effect is created (pixel-based)
- position-z
- (initial) position on map relative to the position where the effect is created (pixel-based)
The following properties are optional:
- lifetime
- Lifetime in game-ticks. (default: unlimited)
- image
- path to the image that should be drawn at the position of the particle (default: no image)
- behavior
- Either following or independent. Determines if the effect should head toward the target if one has been defined or not. (default: independent)
- acceleration
- acceleration towards the target if one is defined in pixels/game-tick² (default: 0.0f)
- momentum
- Momentum of the particle if a target is defined. Before adding the acceleration the old vectors are multiplied by this. A momentum of 0 would make the acceleration a constant speed, a momentum of 1 a perfect newtonian object. (default: 0.0f)
- die-distance
- Distance in pixels to the target that causes the destruction of the particle when reached if a target is defined. (Default: 0.0f = not destroyed on contact)
In addition they can have any number of emitters
<emitter>
Emitters are always child-elements of a particle and create new particles themself which can also include emitters and so on. Their only (and required) property is the type of particle they create. They also include a number of <property> child elements that define the initial properties of the created particles. The property elements have two or three properties. Either name and value or name, min and max.
They can also have one or more <emitter> childtags. When these exist all child-particles will be equipped with these emitters.
required:
- position-x
- (initial) position on map relative to the parent particle (pixel-based)
- position-y
- (initial) position on map relative to the parent particle (pixel-based)
- position-z
- (initial) position on map relative to the parent particle (pixel-based)
optional:
- image
- path to the image that should be drawn at the position of the particles (default: no image)
- behavior
- Either targeting or independent. Determines if the created particles should head toward the target if one has been defined or not. (default: independent)
- horizontal-angle
- clockwise angle of initial vector on horizontal plane in degree. 0° means straight right. (default: 0°)
- vertical-angle
- angle of initial vector in degree (default: 0°)
- power
- Initial speed of the particles in pixels/ game-tick (default: 0.0f)
- gravity
- Downward acceleration of particles in pixels/game-tick² (default: 0.01f)
- randomnes
- Random changes in the X, Y and Z vector. The unit is maximum pixels/game-tick/1000.
- lifetime
- lifetime in game ticks (default: unlimited)
optional for targeting particles:
- acceleration
- acceleration of particles towards the target in pixels/game-tick² (default: 0.0f)
- momentum
- Momentum of the particles. Before adding the acceleration the old vectors are multiplied by this. A momentum of 0 would make the acceleration a constant speed, a momentum of 1 a perfect newtonian object. (default: 0.0f)
- die-distance
- Distance in pixels to the target that causes the destruction of the particles when reached. (Default: 0.0f = not destroyed on contact)