|
Taller
|
| >> Taller >> Curso De Iniciación A DIV by Wakroo >> Cap. 5, Aún Más Procesos. |
Supongo que ya os habréis dado cuenta de que en DIV todo gira en torno a los procesos y a la sentencia FRAME;. Por eso le dedico tantos capítulos a los procesos. Nos habíamos quedado en darle alguna manera de defenderse a nuestro pobre protagonista. Está bien.
Para eso tenemos que crear un nuevo proceso, llamado disparo();. La llamada a este proceso se hará en el proceso personaje(); , dentro de un IF con la condición key(_control) (o cualquier otra tecla que queráis; mirad la ayuda de DIV para saber los códigos adecuados). De esta manera cada vez que apretemos la tecla control se creará un proceso disparo. La condición se puede poner en cualquier parte del proceso personaje(); , aunque lo más adecuado sería ponerla después de que se haya movido el proceso, pero antes del FRAME;. La condición sería algo parecido a esto:
......IF (key(_control)) disparo(); END
Ya hemos conseguido que el protagonista dispare. Sólo faltan dos pequeños detalles. El primero es escribir el código del proceso disparo(); , que lo haremos dentro de un momento. El segundo es que no sabemos exactamente donde está el personaje. Por lo tanto deberemos usar parámetros para que el disparo sepa donde está el personaje (igual que en el proceso explosion();). Le pasaremos los parámetros x, y, angle. Entonces la llamada queda disparo(x,y,angle); . Con esto ya hemos solucionado uno de los problemas. Ahora falta el otro.
Tenemos dos comportamientos para el disparo: que vaya recto hacia arriba o que vaya en la dirección en la que está mirando el personaje. Todo dependerá de la forma de movimiento que hayamos elegido para el personaje. De todas formas el código del proceso será bastante parecido:
......PROCESS disparo(x,y,angle);
......BEGIN
..........graph=4;
..........LOOP
..............y-=15;
..............IF
(x<-20) BREAK; END
..............IF
(x>660) BREAK; END
..............IF
(y>500) BREAK; END
..............IF
(y<-20) BREAK; END
..............FRAME;
..........END
......END
En este caso no hace falta la variable angle para nada y bastaría con el primer IF, pero si queremos que el disparo vaya en la dirección en la que está mirando el personaje se necesita tanto la variable como los cuatro IF (recordad lo que decíamos con los enemigos). Sería suficiente con sustituir y-=15; por advance(15); . Deberéis meter un gráfico adecuado en el fpg (unos 15 x 5 estaría bien).
Luego, en el proceso enemigo(); , habría que incluir la siguiente condición:
......IF (collision(TYPE disparo)) BREAK; END
Así si cualquier enemigo se choca con el disparo saldrá del bucle y llegará al END del BEGIN, por lo que dejará de ejecutar el código. Pero ahora nos encontramos con dos pequeños incovenientes. El primero es que no queda estético que el disparo salga del centro del protagonista. Para solucionar eso basta con hacer que se mueva antes de empezar el LOOP, es decir, que antes de que empieze el bucle ejecute un y-=15; o un advance(15); . De esta manera cuando empiece el LOOP ya no estará en el centro, sino "delante" del personaje.
El segundo incoveniente es que el disparo no sabe cuales son los valores actuales de x, y, angle del proceso personaje. Solucionar esto es tan simple como poner en la llamada disparo(x,y,angle); . Como el que llama es el proceso personaje le pasará como parámetros los valores actuales de su x, y, angle. Si no pusieramos ningún parámetro y teniendo el código tal y como está más arriba el disparo se crearía en (0,0) y con ángulo 0 (recordad que todas las variables valen 0 hasta que se les asigna otro valor).
Ahora hay que hacer que el enemigo muera cuando un disparo choque con él. Para eso incluiremos en el LOOP del proceso enemigo(); la siguiente sentencia:
......IF (collision(TYPE disparo)) BREAK; END
Con esto hacemos lo mismo que en el caso del proceso personaje(); . Sólo faltaría hacer que el enemigo explotase en vez de desaparecer sin más. Para eso podríamos usar el proceso explosion(); , siempre que no hayamos puesto ninguna sentencia que finalice el programa (por ejemplo exit();). Si la hemos puesto tendríamos que quitarla o escribir otro proceso para las explosiones de los enemigos. Para la llamada bastaría con ponerla después del END del LOOP y pasarle los valores x, y, size (como hay enemigos de distinto tamaño también habrá explosiones de distinto tamaño).
Me imagino que os habréis dado cuenta de que los disparos no desaparecen una vez que han destruido al enemigo. Se podría poner una sentencia en el proceso disparo que lo finalizara al chocar con el enemigo, pero no suele funcionar. Cuando el proceso enemigo choca con el disparo ejecuta su sentencia y por lo tanto desaparece, por lo que cuando el proceso disparo llega a su sentencia ya no está chocando con el enemigo y no desaparece, y viceversa. La mejor manera que he encontrado para solucionar esto es usar códigos identificadores.