Taller
>> Taller >> Curso De Iniciación A DIV by Wakroo >> Cap. 3, Más Procesos.

Habíamos terminado el capítulo anterior con un gráfico que se mueve en las direcciones del cursor e incluso en diagonal, con un movimiento uniforme y constante. Y queríamos incluirle aceleración. Muy fácil. Sólo hay que sustituir las variables x e y por dos varibles propias que iremos alterando. Aquí es donde entran en juego las diferentes clases de variables. Podríamos declarar esas variables como globales, locales o privadas. Si las declaramos como globales todos los procesos tendrán acceso a ella y podrán usarla y modificarla. Si la declaramos como local cada proceso tendrá su propio valor para esa variable, que podrá alterar como quiera. Si la declaramos como privada en un proceso sólo ese proceso podrá acceder a y modificar ese valor. La diferencia principal está en cuanta memoria necesita cada una. En este caso, como sólo hay dos procesos, dos variables y pocos gráficos, la diferencia entre una y otra es mínima. Por lo tanto en la práctica da igual como la declaremos. Pero en realidad lo más adecuado sería declararla como privada. Luego sería suficiente con modificar las coordenadas x e y de acuerdo a esas varibles. Y el proceso quedaría así:

......PROCESS personaje();

......PRIVATE
..........velocidadx=0;
..........velocidady=0;

......BEGIN
..........x=320; y=240; graph=1;
..........LOOP
..............IF (key(_up)) velocidady-=2; END
..............IF (key(_down)) velocidady+=2; END
..............IF (key(_left)) velocidadx-=2; END
..............IF (key(_right)) velocidadx+=2; END
..............x+=velocidadx;
..............y+=velocidady;
..............IF (collision(TYPE laberinto))
..................x=320; y=240;
..............END
..............FRAME;
..........END
......END

De esta manera nuestro personaje tendría dos aceleraciones: una en el eje x y otra en el eje y. Luego se modifican x e y para que el personaje se mueva, y contra más altos sean los valores de velocidadx y velocidady más rápido se moverá.

En este caso la velocidad máxima no está limitada y no hay rozamiento (en realidad se trata del espacio, por lo que es lógico). Si quisiéramos incluir estos sería tan fácil como poner, después de los IF estas líneas:

..............IF (velocidady>15) velocidady=15; END
..............IF (velocidady<-15) velocidady=-15; END
..............IF (velocidadx>15) velocidadx=15; END
..............IF (velocidadx<-15) velocidadx=15; END

..............IF (velocidady>0) velocidady-=1; END
..............IF (velocidady<0) velocidady+=1; END
..............IF (velocidadx>0) velocidadx-=1; END
..............IF (velocidadx<0) velocidadx+=1; END

Ya tenemos velocidad máxima y rozamiento. Me explico. Los cuatro primeros IF hacen que si en algún momento velocidad x o y es mayor que 15 pasa a ser 15. Por lo tanto, en el momento de moverse nunca se moverá más de 15 pixels en cualquier dirección. Los otros cuatro son para el rozamiento. Si alguna tecla está pulsada (independientemente para cada eje) la variable aumenta (o disminuye) en 2 unidades, pero luego se reduce en 1 al llegar aquí. Por lo tanto la aceleración total es de 1 (en cualquier dirección). Si no hay ninguna tecla pulsada (independientemente para cada eje) no se suma (o resta) 2, pero si se suma (o resta) 1, por lo que el personaje irá frenando lentamente. Como veis es muy simple.

Ahora veamos el siguiente caso: avanzar y girar. Cuando creamos un gráfico en DIV siempre estará "mirando" hacia la derecha. Por lo tanto al dibujar objetos vistos desde arriba la parte de delante debe esta mirando hacia la derecha. Así nos evitaremos muchos problemas (fijaros que yo el triángulo lo he dibujado hacia la derecha). Para hacer esto habría que sustituir los cuatro IF de movimiento por estos otros:

..............IF (key(_up)) advance(10); END
..............IF (key(_down)) advance(-10); END
..............IF (key(_left)) angle+=7500; END
..............IF (key(_right)) angle-=7500; END

Como veis es muy simple. La sentencia advance(); hace avanzar el gráfico el número de puntos indicado entre paréntesis en el sentido en el que está mirando el gráfico. Si el número es negativo lo hace retroceder. angle es una variable local predefinida, y representa el ángulo que existe desde la orientación de derecha hasta la orientación actual del proceso. Esta variable se mide en milésimas de grado y va en sentido contrario a las agujas del reloj. Por lo tanto si ponemos angle=90000; el proceso estará mirando hacia arriba, angle=180000; mirará hacia la izquierda, angle=270000; mirará hacia abajo y angle=360000; o angle=0; hacia la derecha. Tened cuidado con los ángulos, puesto que DIV, al pasar de 360000 no ajusta el ángulo a 0, sino que sigue hacia adelante. Lo mismo pasa al bajar de 0. Se podría dibujar el gráfico en otro sentido y luego ajustarlo, pero lo más sencillo es ponerlo mirando hacia la derecha y evitar complicaciones.

¿Y si ahora quisieramos incluir enemigos? Sería suficiente con crear un proceso llamada, por ejemplo, enemigo(); (ingenioso, eh) y hacer una llamada a ese proceso. ¿Pero y si queremos crear más de un enemigo? Basta con hacer más de una llamada. Se podría poner un LOOP en el MAIN y dentro una llamada al proceso enemigo(); y un FRAME (recordad que si no lo ponéis se colgará el programa). Así en cada frame se creará un enemigo. Pero como por defecto el programa funciona a 18 frames por segundo (fps, imágenes que muestra en un segundo; se puede cambiar con la sentencia set_fps();) se crearán demasiados enemigos. Por lo tanto hay que hacer algo para que aparezcan menos.