Taller
>> Taller >> Santa Attack by Wakroo >> Cap. 3, La nave y sus complementos.

En este apartado se tratan 3 procesos: santa(x,y,graph), fuego(x,y,angle,graph) y retro(x,y,angle). Se tratarán por separado excepto en aquellos aspectos en los que se solapen.

Empecemos por santa. Este proceso es el que pone en pantalla el trineo a reacción y su movimiento. Al principio crea un regalo(), que será tratado en otra sección. Luego entra en el bucle que lo controla. Empieza sumando las variables velx a x y vely a y, pero divididas entre 10. Puesto que quería que la nave tuviera inercia, creé dos variables para guardar la velocidad horizontal y la vertical de ese momento, que cada turno se suma a las variables x,y. Además, se le suma la gravedad a la velocidad vertical (hay que recordar que la variable y aumenta según se baja). Como se han usado enteros (x,y lo son, de todas formas) esto le da más precisión a los movimientos y permite, por ejemplo, sumar "medio pixel" a velx. Luego, al dividir, se desprecian las fracciones, en realidad no afectará al movimiento, pero la próxima vez que se le sume medio pixel ya harán un pixel entero y eso sí afecta. Este mismo efecto se podría hacer con la variable local RESOLUTION=10, que hace que todas las magnitudes estén multiplicas por 10 (x=1000 sería la coordenada 100 de pantalla), pero no estoy muy seguro de cómo funciona y así es más simple.

A continuación se controla si el jugador quiere rotar la nave y se obliga al valor de angle a estar entre 0 y 359999 (en milésimas de grado). Esto se hace para que la rutina de los regalos funcione correctamente, ya que angle puede valer 45000 o 405000, que la rotación del gráfico será la misma. Con este ángulo se calculan las nuevas velocidades cuando se activan los propulsores. El sistema es sencillo. Mediante las funciones get_distx, get_disty se puede obtener la proyección de una distancia dada con un ángulo dado sobre los ejes x,y. Con esto se consigue que el impulso sea de una cantidad fija y en cualquier dirección.

Ejemplo de proyección en los ejes x,y

En la función hay que poner el ángulo de la dirección en la que se quiere hacer la propulsión. Por lo tanto, para el propulsor trasero es, simplemente, el angle de la nave (hacia delante) y para los inferiores el angle+90000 (hacia arriba). El último parámetro es la magnitud que hay que proyectar. Puesto que los propulsores inferiores tienen dos posibles fuerzas no es lo mismo darle a espacio o a la tecla arriba, aunque la fuerza se hará en la misma dirección. Además, como no tiene que ser posible activar los propulsores a potencia media y fuerte a la vez primero se comprueba la potencia fuerte con un IF y dentro de su ELSE se comprueba la potencia media. Con la tecla alt el procedimiento es el mismo pero para el propulsor delantero. Finalmente se hace que la nave no pueda salir de la pantalla.

Pasemos ahora a los procesos fuego (para los propulsores inferiores) y retro (para el trasero), que son prácticamente iguales. Primero reproduce un sonido y luego asigna z=faher.z+2. Con esto se asegura que el gráfico estará por detrás del de la nave. Luego hay un par de xadvance que, lo que hacen, es mover el gráfico hasta donde tiene que estar, partiendo de las coordenadas del padre (los parámetros). Está calculado con prueba y error, aunque se podrían haber usado puntos de control en el gráfico del padre para saber la posición exacta. Pero, claro, para eso hace falta tiempo para investigar...

Ahora hay que fijarse en el FPG. Las posiciones 2, 3 y 4 las ocupan el mismo gráfico (los fuegos inferiores) pero de distintos tamaños verticales. En Fenix existe la posibilidad de escalar horizontal o verticalmente un gráfico mediante size_x, size_y (creo), pero en la 0.82 no está implementado aún. Por lo tanto, hice 3 gráficos con los distintos tamaños (de menor a mayor). Volvamos al código. El valor que se le ha asignado a graph es el valor del gráfico "normal". En este momento se le ha coge el gráfico anterior. Los motivos los entenderéis al final. Luego se hace un FRAME.

A continuación se reduce en 1 la z. Aún así, todavía queda por debajo de la nave, ya que antes se ha aumentado en 2 con respecto a su z. Luego se aumenta en 1 el gráfico para volver a tener el original, se cogen la x, y, angle del padre y se vuelve a poner el gráfico en su sitio. Así, aunque el padre se mueva los fuegos le seguirán. Se hace otro FRAME. Luego se vuelve a coger el gráfico anterior y se aumenta z otra vez. Se ajusta la posición con respecto a la nave y se hace FRAME.

¿Cuál es la razón de todos estos cambios en graph y z? Muy sencillo. Cada vez que se pulsa espacio o la tecla arriba se hace una llamada al proceso fuego(x,y,angle,graph) (la diferencia es el gráfico: 3 en el de potencia media y 4 en el de fuerte). Si os fijáis en el proceso fuego veréis que tiene 3 FRAMEs pero ningún bucle. Por lo tanto, estará en pantalla 3 FRAMEs y luego desaparecerá. En el primer FRAME se pone el gráfico anterior, que es más pequeño que el original, y se pone como z la del padre +2. En el siguiente FRAME se pone el gráfico original (más grande) y se disminuye en 1 la z. Con esto se consigue que quede por debajo del gráfico del padre pero por encima de cualquier fuego que esté en el primer FRAME. Finalmente en el tercero se vuelve a poner el gráfico más pequeño y la z de antes para que quede por detrás de cualquier fuego que esté en el segundo paso.

Todo este lío se ha hecho para conseguir el efecto de que el fuego "crece y disminuye". Si os fijáis un poco en el juego el fuego no sale completamente desde el principio, sino que primero sale más pequeño y luego a tope. A la hora de apagarse pasa lo mismo pero al revés. El problema que tiene este sistema es que, en realidad, el fuego va tarde. Suponiendo que se pulsa la tecla durante un FRAME, en ése sale un fuego pequeño, en el siguiente más grande y en el último uno pequeño. Pero el efecto de la impulsión sólo se dará en el primer FRAME. De todas formas, como es muy poco probable que alguien consiga una impulsión de un solo FRAME y era la forma más sencilla de darle un toque bonito decidí que no importaba ese retraso.

Queda el proceso retro(x,y,angle), pero como funciona prácticamente igual que el proceso fuego(x,y,angle,graph) no hace falta comentar nada más. Sigamos adelante con los regalos.