Este tutorial aplica a la versión 0.88c (o posteriores) de MK2
MK2 implementa dos hitters (por el momento, exclusivos) que podemos activar desde /dev/config.h:
#define PLAYER_CAN_PUNCH
#define PLAYER_HAZ_SWORD
Activando uno de estos dos (sólo uno) estaremos activando el hitter. Por defecto, el primero define un puñetazo que puede darse a uno u otro lado, y el segundo un espadazo que puede darse a izquierda, derecha o arriba (siempre en vista lateral, ya nos curraremos algo genital cuando sea necesario).
Por supuesto, los gráficos, recorrido y comportamiento de los hitters es fácilmente modificable. Vamos a ver aquí cómo modificar la espada, los puños son más sencillos y el proceso es prácticamente el mismo.
Modificando la trayectoria y número de frames
El comportamiento principal de los hitters y, en este caso, la espada, está en el archivo /dev/engine/hitter.h. Casi al principio del mismo verás algo así:
Código: Seleccionar todo
#ifdef PLAYER_HAZ_SWORD
unsigned char swoffs_x [] = {8, 10, 12, 14, 15, 15, 14, 13, 10};
unsigned char swoffs_y [] = {2, 2, 2, 3, 4, 4, 5, 6, 7};
#endifCuando el jugador pulsa disparo, se activa la espada. Esta activación dura nueve cuadros. Cada cuadro, la espada se coloca en la posición indicada por el índice correspondiente de esas dos arrays, siempre tomando como origen la posición del jugador.
Cuando el jugador mira hacia la derecha o a la izquierda:
- La posición "y" donde se dibuja la espada será gpy + swoffs_y [cuadro], donde gpy es la posición "y" del jugador y cuadro va de 0 a 9.
- Si el jugador mira a la derecha, la posición "x" será gpx + swoffs_x [cuadro], y si mira a la izquierda será gpx + 8 - swoffs_x [cuadro], donde gpx es la posición "x" del jugador y cuadro va de 0 a 8.
- La posición "y" donde se dibuja la espada será gpy + 6 - swoffs_x [cuadro].
- La posición "x" donde se dibuja la espada será gpx + swoffs_y [cuadro].
También podemos aumentar o disminuir el número de frames que ocupa la animación. Vamos a poner una espada más rápida, quitaremos todos los cuadros pares y nos quedaremos sólo con cinco cuadros de animación. Hacemos esto, literalmente: nos cargamos cada valor par de los arrays. Nos quedaría:
Código: Seleccionar todo
#ifdef PLAYER_HAZ_SWORD
unsigned char swoffs_x [] = {8, 12, 15, 14, 10};
unsigned char swoffs_y [] = {2, 2, 4, 5, 7};
#endifCódigo: Seleccionar todo
#ifdef PLAYER_HAZ_SWORD
if (hitter_frame == 5) {
#endifLlamamos "intervalo de hitter caliente" a los cuadros de la animación del hitter en los que se considera que el hitter está golpeando. Por ejemplo, en Ninjajar! el puño no golpea mientras se retrae. Con la espada, y considerando que los cuadros originalmente iban de 0 a 8, el intervalo de hitter caliente eran los frames 3 a 6, ambos inclusive:
Código: Seleccionar todo
FRAME: 0 1 2 3 4 5 6 7 8
GOLPEA: NO NO NO SI SI SI SI NO NOVamos a dejar el intervalo así, ahora que tenemos menos frames:
Código: Seleccionar todo
FRAME: 0 1 2 3 4
GOLPEA: NO SI SI SI NOCódigo: Seleccionar todo
#if defined (BREAKABLE_WALLS) || defined (BREAKABLE_WALLS_SIMPLE)
if ((attr (gpxx, gpyy) & 16) && (hitter_frame > 0 && hitter_frame < 4))
break_wall (gpxx, gpyy);
#endifCódigo: Seleccionar todo
if (hitter_frame > 0 && hitter_frame < 4) {La detección de colisiones del hitter con el escenario o los enemigos se hace basándonos en un pixel dentro del sprite. Por defecto, este pixel es:
- Espada hacia arriba: (hitter_x + 4, hitter_y)
- Espada hacia la izquierda: (hitter_x, hitter_y + 4)
- Espada hacia la derecha: (hitter_x + 7, hitter_y + 4)
Para cambiar esto tendremos que cambiar las asignaciones a gpxx y gpyy que hay en el bloque de código que gobierna la colocación de la espada con respecto al jugador en /dev/engine/hitter.h, o sea, aquí:
Código: Seleccionar todo
#ifdef PLAYER_HAZ_SWORD
if (p_up) {
hitter_x = gpx + swoffs_y [hitter_frame];
hitter_y = gpy + 6 - swoffs_x [hitter_frame];
hitter_next_frame = sprite_sword_u;
#if defined (BREAKABLE_WALLS) || defined (BREAKABLE_WALLS_SIMPLE)
gpxx = (hitter_x + 4) >> 4; gpyy = (hitter_y) >> 4; // <<< AQUI (x, y espada hacia arriba)
#endif
} else {
hitter_y = gpy + swoffs_y [hitter_frame];
#if defined (BREAKABLE_WALLS) || defined (BREAKABLE_WALLS_SIMPLE)
gpyy = (hitter_y + 4) >> 4; // <<< AQUI, (y espada horizontal)
#endif
if (p_facing) {
hitter_x = gpx + swoffs_x [hitter_frame];
hitter_next_frame = sprite_sword_r;
#if defined (BREAKABLE_WALLS) || defined (BREAKABLE_WALLS_SIMPLE)
gpxx = (hitter_x + 7) >> 4; // <<< AQUI, (x espada hacia la derecha)
#endif
} else {
hitter_x = gpx + 8 - swoffs_x [hitter_frame];
hitter_next_frame = sprite_sword_l;
#if defined (BREAKABLE_WALLS) || defined (BREAKABLE_WALLS_SIMPLE)
gpxx = (hitter_x) >> 4; // <<< AQUI, (x espada hacia la izquierda)
#endif
}
}
#if defined (BREAKABLE_WALLS) || defined (BREAKABLE_WALLS_SIMPLE)
if ((attr (gpxx, gpyy) & 16) && (hitter_frame > 2 && hitter_frame < 7))
break_wall (gpxx, gpyy);
#endif
#endifCambiando el gráfico
La espada está definida en /dev/extrasprites.h a partir de la linea 259. Las etiquetas _sprite_sword_l, _sprite_sword_r y _sprite_sword_u contienen los frames para la espada hacia la izquierda, hacia la derecha y hacia arriba, respectivamente, usando los 4 bloques de 8x8 pixels con máscaras habituales.