Por Nacho Cabanes
Vamos a ver cómo se puede conseguir...
Por una parte, debemos definir la secuencia de movimientos que hará durante el salto. Se puede conseguir con un "array", que almacene cuanto deberá aumentar la coordenada "y" de nuestro personaje en cada instante del salto (aumentará mucho al principio, luego aumentará más despacio, y finalmente repetirá los mismos pasos, pero disminuyendo, para la secuencia de caida):
int[] pasosSaltoArriba = {-14, -14, -11, -8, -6, -4, -2, 0, 0, 2, 4, 6, 8, 11, 14, 14 };
Y deberemos poner en marcha la secuencia de salto cuando se pulse cierta tecla (por ejemplo, Espacio). Esto se limitará a cambiar el valor de una variable booleana, porque después el resto del movimiento del salto debe proseguir aunque ya no se esté pulsando esa tecla.
// Comienza la secuencia de salto public void Saltar() { if (saltando) return; saltando = true; fotogramaMvto = 0; incrXSalto = 0; }
De la misma forma, podemos hacer que salte hacia los lados, si existe un incremento que aplicar a la coordenada X, ya sea positivo o negativo:
// Comienza la secuencia de salto hacia la derecha public void SaltarDerecha() { Saltar(); incrXSalto = incrX; } // Comienza la secuencia de salto hacia la izquierda public void SaltarIzquierda() { Saltar(); incrXSalto = -incrX; }
Por supuesto, esto se tiene que reflejar también en la clase "Partida", que debe permitir que se pulse Espacio (posiblemente, a la vez que otra tecla):
void comprobarTeclas() { [...] if (Hardware.TeclaPulsada(Hardware.TECLA_ESP)) { if (Hardware.TeclaPulsada(Hardware.TECLA_DER)) miPersonaje.SaltarDerecha(); else if (Hardware.TeclaPulsada(Hardware.TECLA_IZQ)) miPersonaje.SaltarIzquierda(); else miPersonaje.Saltar(); } [...] }
Deberemos crear una nueva función (por ejemplo, "Mover"), que no haga nada cuando no se está saltando, y que si se está en medio de un salto, calcule cual sería la siguiente posición a la que hay que desplazarse. Si ya se han dado todos los pasos que forman la secuencia de salto, cambiará el valor de "saltando" a "false" para dar la secuencia por terminada:
// Para cuando deba moverse solo, p.ej. saltando public new void Mover() { if (saltando) { // Calculo las siguientes posiciones y veo si son validas short xProxMov = (short) (x + incrXSalto); short yProxMov = (short) (y + pasosSaltoArriba[fotogramaMvto]); bool subiendoSalto = (pasosSaltoArriba[fotogramaMvto] < 0); // Si todavía se puede mover, avanzo if (miPartida.GetMapa().EsPosibleMover( xProxMov, yProxMov + alto - 4, xProxMov + ancho, yProxMov + alto) || subiendoSalto) { x = xProxMov; y = yProxMov; } // Y si no, quizá esté cayendo else saltando = false; fotogramaMvto++; if (fotogramaMvto >= cantidadMovimientoSalto) saltando = false; } }
Obviamente, esto falla cuando saltamos en el extremo de una plataforma, porque el personaje todavía no "cae" sino que se queda "en el aire", aunque no tenga nada debajo. Los cambios para que caiga son pequeños, pero los veremos un poco más adelante.
Esta versión, que no tiene ningún cambio en cuanto a apariencia, es la 0.05, que puedes descargar en la página del proyecto en Google Code.
Siguiente entrega...