La Churrera 3.99.2
Antes que nada, bájate el paquete de la nueva versión de la churrera haciendo click justo aquí debajo:
http://www.mojontwins.com/churrera/mt-churrera-3.99.2.zip
¿Otra vez? ¿Y el capítulo de scripting?
Sí, ya sé que os debemos el capítulo de scripting y veinte mil cosas más, pero no nos parecía guay seguir ampliando la churrera y que vosotros no pudiéseis disfrutar de las cosas nuevas que trae. ¿Qué significa esto? Pues nada, que a lo mejor no os enteráis mucho de algunas de las características que vamos a explicar aquí, pero paciencia. El capítulo del scripting es muy importante y no queremos hacerlo de cualquier forma. Intentaremos empezar la semana que viene a dar las primeras pautas. Mientras tanto, echadle un ojete a esto… Y consultad el capítulo anterior en el que se explica cómo actualizar la churrera de tu güego a una nueva versión.
Pulsa aquí para ver el capítulo entero.
Temporizadores
Se añade a la churrera un temporizador que podemos usar de forma automática o desde el script. El temporizador toma un valor inicial, va contando hacia abajo, puede recargarse, se puede configurar cada cuántos frames se decrementa o decidir qué hacer cuando se agota. En config.h, como siempre:
#define TIMER_ENABLE |
Con TIMER_ENABLE se incluye el código necesario para manejar el temporizador. Este código necesitará algunas otras directivas que especifican la forma de funcionar:
#define TIMER_INITIAL 99 #define TIMER_REFILL 25 #define TIMER_LAPSE 32 |
TIMER_INITIAL especifica el valor inicial del temporizador. Las recargas de tiempo, que se ponen con el colocador como hotspots de tipo 5, recargarán el valor especificado en TIMER_REFILL. El valor máximo del timer, tanto para el inicial como al recargar, es de 99. Para controlar el intervalo de tiempo que transcurre entre cada decremento del temporizador, especificamos en TIMER_LAPSE el número de frames que debe transcurrir.
#define TIMER_START |
Si se define TIMER_START, el temporizador estará activo desde el principio.
Tenemos, además, algunas directivas que definen qué pasará cuando el temporizador llegue a cero. Hay que descomentar las que apliquen:
#define TIMER_SCRIPT_0 |
Definiendo esta, cuando llegue a cero el temporizador se ejecutará una sección especial del script, ON_TIMER_OFF. Es ideal para llevar todo el control del temporizador por scripting, como ocurre en Cadàveriön.
//#define TIMER_GAMEOVER_0 |
Definiendo esta, el juego terminará (“GAME OVER”) cuando el temporizador llegue a cero.
//#define TIMER_KILL_0 //#define TIMER_WARP_TO 0 //#define TIMER_WARP_TO_X 1 //#define TIMER_WARP_TO_Y 1 |
Si se define TIMER_KILL_0, se restará una vida cuando el temporizador llegue a cero. Si, además, se define TIMER_WARP_TO, además se cambiará a la pantalla espeficiada, apareciendo el jugador en las coordenadas TIMER_WARP_TO_X y TIMER_WARP_TO_Y. Usa esto si estos datos van a ser fijos durante el juego. En Cadàveriön, por ejemplo, van cambiando, por lo que todo se maneja desde el script.
//#define TIMER_AUTO_RESET |
Si se define esta opción, el temporizador volverá al máximo tras llegar a cero de forma automática. Si vas a realizar el control por scripting, mejor deja esta comentada.
#define SHOW_TIMER_OVER |
Si se define esta, en el caso de que hayamos definido o bien TIMER_SCRIPT_0 o bien TIMER_KILL_0, se mostrará un cartel de «TIME'S UP!» cuando el temporizador llegue a cero.
Scripting:
Como hemos dicho, el temporizador puede administrarse desde el script. Es interesante que, si decidimos hacer esto, activemos TIMER_SCRIPT_0 para que cuando el temporizador llegue a cero se ejecute la sección ON_TIMER_OFF de nuestro script y que el control sea total.
Además, se definen estas comprobaciones y comandos:
Comprobaciones:
IF TIMER >= x IF TIMER <= x |
Que se cumplirán si el valor del temporizador es mayor o igual o menor o igual que el valor especificado, respectivamente.
Comandos
SET_TIMER a, b |
Sirve para establecer los valores TIMER_INITIAL (a) y TIMER_LAPSE (b) desde el script.
TIMER_START |
Sirve para iniciar el temporizador.
TIMER_STOP |
Sirve para parar el temporizador.
Control de bloques empujables
Hemos mejorado el motor para que se pueda hacer más cosas con el tile 14 de tipo 10 (tile empujable) que simplemente empujarlo o que detenga la trayectoria de los enemigos. Ahora podemos decirle al motor que lance la sección PRESS_FIRE de la pantalla actual en el script justo después de empujar un bloque empujable. Además, el número del tile que se «pisa» y las coordenadas finales se almacenan en tres flags que podemos configurar, para poderlas usar desde el script para hacer comprobaciones.
Este es el sistema que se emplea en el script de Cadàveriön para controlar que coloquemos las estatuas sobre los pedestales, por poner un ejemplo.
Recordemos lo que teníamos hasta ahora:
#define PLAYER_PUSH_BOXES #define FIRE_TO_PUSH |
La primera es necesaria para activar los tiles empujables. La segunda obliga al jugador a pulsar FIRE para empujar y, por tanto, no es obligatoria. Veamos ahora las nuevas directivas:
#define ENABLE_PUSHED_SCRIPTING #define MOVED_TILE_FLAG 1 #define MOVED_X_FLAG 2 #define MOVED_Y_FLAG 3 |
Activando ENABLE_PUSHED_SCRIPTING, el tile que se pisa y sus coordenadas se almacenarán en los flags especificados por las directivas MOVED_TILE_FLAG, MOVED_X_FLAG y MOVED_Y_FLAG, respectivamente. En el código que se muestra, el tile pisado se almacenará en el flag 1, y sus coordenadas en los flags 2 y 3.
#define PUSHING_ACTION |
Si definimos esta, además, cuando empujemos un bloque se ejecutarán las secciones PRESS_FIRE AT ANY y PRESS_FIRE de la pantalla actual del script. En este caso, se cumplirá la condición “JUST_PUSHED” y desde el scripting podremos controlar qué pasa cuando empujamos un bloque.
Recomendamos estudiar el script de Cadàveriön, el cual, además de ser un buen ejemplo del uso del temporizador y del control del bloque empujable, resulta ser un script bastante complejo que emplea un montón de técnicas avanzadas. Bueno, cuando el tutorial esté listo :*)
Comprobar si nos salimos del mapa
Es aconsejable poner límites en tu mapa para que el jugador no se pueda escaparse del mapa y que el motor haga cosas raras, pero si tu mapa es estrecho puede que quieras aprovechar toda la pantalla. En ese caso, puedes activar:
#define PLAYER_CHECK_MAP_BOUNDARIES |
Que añadirá comprobaciones y no dejará que el jugador se salga del mapa. ¡Ojo! Si puedes evitar usarlo, mejor: ahorrarás espacio.
Tipo de enemigo «custom» de regalo
Hasta ahora habíamos dejado sin código los enemigos de tipo 6, pero hemos pensado que no nos cuesta poner uno, de ejemplo. Se comporta como los murciélagos de Cheril the Goddess. Para usarlos, ponlos en el colocador de enemigos como tipo 6 y usa estas directivas
:
#define ENABLE_CUSTOM_TYPE_6 #define TYPE_6_FIXED_SPRITE 2 #define SIGHT_DISTANCE 96 |
La primera los activa, la segunda define qué sprite va a usar (menos 1, si quieres el sprite del enemigo 3, pon un 2. Sorry por la guarrada, pero ahorro bytes). La tercera dice cuántos píxels ve de lejos el bicho. Si te ve, te persigue. Si no, vuelve a su sitio (donde lo hayas puesto con el colocador).
Esta implementación, además, utiliza dos directivas de los enemigos de tipo 5 para funcionar:
#define FANTY_MAX_V 256 #define FANTY_A 12 |
Define ahí la aceleración y la velocidad máxima de tus tipo 6. Si vas a usar también tipo 5 y quieres otros valores, sé un hombre y modifica el motor.
Configuración de teclado / joystick para dos botones
Hay güegos de vista lateral que se juegan mejor con dos botones, uno de salto y otro de disparo. Si activas esta directiva:
#define USE_TWO_BUTTONS |
El teclado será el siguiente, en vez del habitual:
A izquierda |
Si se elige algún joystick, FIRE y M disparan, y N salta.
Disparos hacia arriba y en diagonal para vista lateral
Ahora podrás permitir que el jugador dispare hacia arriba o en diagonal. Para ello define esto:
#define CAN_FIRE_UP |
Esta configuración funciona mejor con USE_TWO_BUTTONS, ya que así separamos «arriba» del botón de salto.
Si no pulsas «arriba», el personaje disparará hacia donde esté mirando. Si pulsas «arriba» mientras disparas, el personaje disparará hacia arriba. Si, además, estás pulsando una dirección, el personaje disparará en la diagonal indicada.
Balas enmascaradas
Por velocidad, las balas no llevan máscaras. Esto funciona bien si el fondo sobre el que se mueven es oscuro (pocos pixels INK activos). Sin embargo, hay situaciones en las que esto no ocurre y se ve mal. En ese caso, podemos activar máscaras para las balas:
#define MASKED_BULLETS |
Y ya está
Con estas cosas se pueden hacer muchos tipos de güego nuevos. No te rayes demasiado si la mitad de lo que se explica aquí suena a chino, porque pronto entenderás como funciona el scripting y todo el podewwwr que pone en tus manos.
The Mojon Twins
Próximamente capítulo 8, que ya está en la imprenta! ^_^
…mensaje eliminado por expreso deseo de su autor…
Ke sí, ke sí… pero tenemos una versión arkaika de la churrera !! Liberad la 4.6 mamoncetes !! XD
En serio, ké ganotas de meterle mano al script
La 4.6 la tienes en el código del Ramiro. Volvimos a la 3.1 y re-comenzamos desde ahí porque la 4.6 estaba inmanejable. La 3.99.2 es muy superior a la 4.6 en todo: el código es más rápido y más compacto. Para nada es una versión "arkaika", es la versión actual. Es la que usamos nosotros mismos para desarrollar, vaya 😀 Pero ya te digo que si realmente quieres la 4.6 no tienes más que descargar los fuentes de Ramiro.
Lo sé, sólo es un komentario 'teletériko' para echarnos unas risas.
nota: me auto-kastigaré sartando en la korchoneta de sartar. mirando a la pared unas 40 horas aproximádamente.
Vamos, ke se me enfría el proyecto.. XDD
nota2: Tengo unas kuántas dudakas ke tengo al respecto, y kreo ke el mejor sitio para hacerlas es en el foro mojóniko [no?] Aun así, entoavía estoy xperando el 'vvisto bueno' de mi registro allí mesmo.
@lordraptor con qué nombre te has registrado? tenemos un problema de spam y no nos enteramos a veces de los registros. Dime nombre y te activo 🙂
Ya te he encontrado 😀
Activado!
Faaleeee… de koña !!
De momento ya he realizau mis primeras dudakas en el kapítulo 8.
De toas formas nus vemoz po'allí.
Un saludo