34 (*psys) -> source[ 0 ] = x ;
35 (*psys) -> source[ 1 ] = y ;
36 (*psys) -> source[ 2 ] = z ;
39 (*psys) -> sprites = (ALLEGRO_BITMAP **)calloc( max_sprites,
sizeof( ALLEGRO_BITMAP *) );
41 (*psys) -> sprites = NULL ;
66 if( psys -> list -> nb_items == psys -> list -> nb_max_items )
69 for( it = 0 ; it < 3 ; it ++ )
71 object . position[ it ] += psys -> source[ it ] ;
77 new_p -> spr_id = spr ;
78 new_p -> mode = mode ;
79 new_p -> lifetime = lifetime ;
80 new_p -> color = color ;
81 new_p -> size = size ;
83 memcpy( &new_p ->
object , &
object ,
sizeof(
PHYSICS ) );
85 return list_push( psys -> list, new_p, &free );
110 double vx,
double vy,
double vz,
111 double ax,
double ay,
double az )
119 VECTOR3D_SET(
object . angular_acceleration, 0.0, 0.0, 0.0 );
121 return add_particle( psys, spr, mode, lifetime, size,color,
object );
139 node = psys -> list -> start ;
144 if( ptr -> lifetime != -1 )
146 ptr -> lifetime -= delta_t / 1000.0 ;
149 if( ptr -> lifetime > 0 || ptr -> lifetime == -1 )
152 node = node -> next ;
157 node = node -> next ;
177 double delta_t =
get_usec( &psys -> timer );
200 node = psys -> list -> start ;
204 double x = 0, y = 0 ;
207 x = ptr ->
object . position[ 0 ] - xpos ;
208 y = ptr ->
object . position[ 1 ] - ypos ;
210 if( ( x < -range ) || ( x > ( w + range ) ) || ( y< -range ) || ( y > ( h + range ) ) )
212 node = node -> next ;
216 for(
int it = 0 ; it < 3 ; it ++ )
218 while( ptr ->
object . orientation[ it ] < 0.0 )
219 ptr ->
object . orientation[ it ] += 256.0 ;
221 if( ptr ->
object . orientation[ it ] >= 256.0 )
222 ptr ->
object . orientation[ it ] = fmod( ptr ->
object . orientation[ it ], 256.0 );
227 if( ptr ->
object . speed[ 0 ] != 0 )
228 x = x + ptr ->
object . speed[ 0 ] * sin( (ptr ->
object . position[ 0 ]/ptr ->
object . speed[ 0 ]) ) ;
230 x = x + ptr ->
object . speed[ 0 ] * sin( ptr ->
object . position[ 0 ] );
232 if( ptr ->
object . speed[ 1 ] != 0 )
233 y = y + ptr ->
object . speed[ 1 ] * cos( (ptr ->
object . speed[ 1 ]/ptr ->
object . speed[ 1 ]) ) ;
235 y = y + ptr ->
object . speed[ 1 ] * sin( ptr ->
object . position[ 1 ] ) ;
237 if( ptr -> spr_id >= 0 && ptr -> spr_id < psys -> max_sprites && psys -> sprites[ ptr -> spr_id ] )
239 int spr_w = al_get_bitmap_width( psys -> sprites[ ptr -> spr_id ] );
240 int spr_h = al_get_bitmap_height( psys -> sprites[ ptr -> spr_id ] );
242 al_draw_rotated_bitmap( psys -> sprites[ ptr -> spr_id ], spr_w/2, spr_h/2, x - spr_w / 2, y - spr_h /2, al_ftofix( ptr ->
object . orientation[ 2 ]), 0 );
245 al_draw_circle( x, y, ptr -> size, ptr -> color, 1 );
250 if( ptr -> spr_id >= 0 && ptr -> spr_id < psys -> max_sprites && psys -> sprites[ ptr -> spr_id ] )
252 int w = al_get_bitmap_width( psys -> sprites[ ptr -> spr_id ] );
253 int h = al_get_bitmap_height( psys -> sprites[ ptr -> spr_id ] );
255 al_draw_rotated_bitmap( psys -> sprites[ ptr -> spr_id ], w/2, h/2, x - w / 2, y - h /2, al_ftofix( ptr ->
object . orientation[ 2 ]), 0 );
258 al_draw_circle( x, y, ptr -> size, ptr -> color, 1 );
262 al_draw_filled_rectangle( x - ptr -> size, y - ptr -> size, x + ptr -> size, y + ptr -> size, ptr -> color );
265 al_draw_circle( x, y, ptr -> size, ptr -> color, 1 );
266 node = node -> next ;
284 while( (*psys) -> list -> start )
311 node = psys -> list -> start ;
316 ptr ->
object . position[ 0 ] = ptr ->
object . position[ 0 ] + vx ;
317 ptr ->
object . position[ 1 ] = ptr ->
object . position[ 1 ] + vy ;
318 ptr ->
object . position[ 2 ] = ptr ->
object . position[ 2 ] + vz ;
319 node = node -> next ;
#define Malloc(__ptr, __struct, __size)
Malloc Handler to get errors and set to 0.
#define __n_assert(__ptr, __ret)
macro to assert things
#define Free(__ptr)
Free Handler to get errors.
#define remove_list_node(__LIST_,__NODE_, __TYPE_)
Remove macro helper for void pointer casting.
int list_push(LIST *list, void *ptr, void(*destructor)(void *ptr))
Add a pointer to the end of the list.
LIST * new_generic_list(int max_items)
Initialiaze a generic list container to max_items pointers.
Structure of a generic list node.
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
#define LOG_ERR
error conditions
int start_HiTimer(N_TIME *timer)
Initialize or restart from zero any N_TIME HiTimer.
time_t get_usec(N_TIME *timer)
Poll any N_TIME HiTimer, returning usec, and moving currentTime to startTime.
int draw_particle(PARTICLE_SYSTEM *psys, double xpos, double ypos, int w, int h, double range)
draw particles of a particle system
#define NORMAL_PART
classic moving particle
int move_particles(PARTICLE_SYSTEM *psys, double vx, double vy, double vz)
draw particles of a particle system
#define PIXEL_PART
pixel particle
int manage_particle_ex(PARTICLE_SYSTEM *psys, double delta_t)
update particles positions usting provided delta time
int free_particle_system(PARTICLE_SYSTEM **psys)
destroy and free a particle system
int manage_particle(PARTICLE_SYSTEM *psys)
update particles positions usting particle system internal timer
#define SINUS_PART
sinus based moving particle
int add_particle_ex(PARTICLE_SYSTEM *psys, int spr, int mode, int off_x, int off_y, int lifetime, int size, ALLEGRO_COLOR color, double vx, double vy, double vz, double ax, double ay, double az)
add a particle to a particle system, all in line version (you have to set the PHYSICS object paramete...
int add_particle(PARTICLE_SYSTEM *psys, int spr, int mode, int lifetime, int size, ALLEGRO_COLOR color, PHYSICS object)
add a particle to a particle system
int init_particle_system(PARTICLE_SYSTEM **psys, int max, double x, double y, double z, int max_sprites)
initialize a particle system
Structure of a single particle.
Structure of a particle system.
#define VECTOR3D_SET(VECTOR, X, Y, Z)
helper to set a VECTOR3D position
int update_physics_position(PHYSICS *object, double delta_t)
Update object position, reversed.
structure of the physics of an object