1 /*-------------------------------------------------------
3 --------------------------------------------------------
4 Copyright (c) 2002, Kronoman
5 En memoria de mi querido padre
7 --------------------------------------------------------
8 Engine de explosiones usando una lista enlazada
9 muy sencilla, sirve para muchas capas de explosiones
10 mediante el uso de punteros.
11 --------------------------------------------------------*/
21 /* esta variable NO es necesaria, solo la uso para
22 ver cuantos enemigos hay en memoria, y de esa manera,
23 revisar la performance... */
24 int cant_explosion_debug
= 0;
27 /* --- globales internas --- */
29 /* Cache de imagenes y sonidos, para el combo de explosion */
30 BITMAP
*explo_cache_bmp
[3];
31 SAMPLE
*explo_cache_snd
[3];
33 /* No hay puntero al 1er item de la lista, debe crearse,
34 permite usar muchas listas a la vez! */
36 /* Estos dos punteros deben ser puestos cada vez que se quieren usar
37 en las diferentes llamadas */
38 EXPLOSION
*ptr_explo_fondo
= NULL
;
39 EXPLOSION
*ptr_explo_arriba
= NULL
;
42 Esta funcion agrega una nueva explosion a la lista enlazada [al principio].
43 PASARLE el puntero a la primera de la lista como &puntero!
45 void agrega_explosion( EXPLOSION
**prt_1era
,
53 EXPLOSION
*nueva
= (EXPLOSION
*)malloc(sizeof(EXPLOSION
));
54 nueva
->next
= *prt_1era
;
57 if (nueva
!= NULL
) /* si el malloc funciono, seteo los datos... */
73 Esta funcion actualiza la logica (mueve)
74 tambien las elimina si vida < 0
75 pasarle el puntero con &puntero
77 void mover_explosiones(EXPLOSION
**prt_1era
) {
78 EXPLOSION
**tmp_p
= prt_1era
;
79 EXPLOSION
*tmp
= NULL
;
81 cant_explosion_debug
= 0; /* DEBUG: innecesario */
85 cant_explosion_debug
++; /* DEBUG: innecesario */
90 tmp
->x
= fixadd(tmp
->x
, tmp
->dx
);
91 tmp
->y
= fixadd(tmp
->y
, tmp
->dy
);
96 tmp
->rot
+= rand()%32+1; /* girar */
97 if (tmp
->rot
> 255) tmp
->rot
= 0;
100 tmp
->r
= fixsub(tmp
->r
, tmp
->dr
);
102 if (tmp
->r
< ftofix(0.001) ) tmp
->vida
= -1; /* se extinguio... */
105 /* murio, eliminar!!! */
109 tmp_p
= &tmp
->next
; /* siguiente por favor! */
115 Esta funcion dibuja en el bitmap bmp
116 Las dibuja desplazadas x,y
118 void dibujar_explosion(EXPLOSION
*prt_1era
, BITMAP
*bmp
, int x
, int y
) {
120 EXPLOSION
*tmp
= prt_1era
;
128 x2
= fixtoi(tmp
->x
)-x
;
129 x2
-= fixtoi(fmul(itofix(tmp
->spr
->w
), tmp
->r
))/2;
131 y2
= fixtoi(tmp
->y
)-y
;
132 y2
-= fixtoi(fmul(itofix(tmp
->spr
->h
), tmp
->r
))/2;
135 rotate_scaled_sprite(bmp
, tmp
->spr
, x2
, y2
, itofix(tmp
->rot
), tmp
->r
);
137 tmp
= tmp
->next
; /* proximo... */
141 /* Esta funcion se debe llamar cuando no se precise mas la lista
142 Libera la RAM usada y reinicia la lista
143 pasar el puntero asi &puntero
145 void liberar_lista_explosion(EXPLOSION
**prt_1era
) {
146 EXPLOSION
*tmp
= *prt_1era
;
150 EXPLOSION
*next
= tmp
->next
;