Seguro has visto esos jugos modernos de acción donde se ve una calidad de gráficos sorprendentes!! Definitivamente el trabajo artístico se lleva buenos aplausos. Pero ¿Qué hay de la programación ?
Imagino que los algoritmos actuales con los que se programan los juegos modernos deben ser un tanto más complejos que los que se usaban en aquellos tiempos donde el control sólo tenía una palanca de cuatro direcciones y un botón. ... es más! aquellos que sólo constaban de uno o dos botones como los famosos Game&Watch.
Por otro lado, en la base del juego, el algoritmo que permite jugarlo, creo que no debe ser tan diferente entre el Game&Watch de 1980 y el más divertido y emocionante juego de acción actual.
A ciencia cierta no sé, pero puedo imaginarme jugando el clasico juego de Game&Watch donde caen martillos y debes esquivarlos, pero esta vez, entre movimiento y movimiento, al desaparecer y aparecer el monito en otra posición, introduzco una animación elaborada que muestre cómo éste monito se traslado hasta su nueva posición. Lo que sugiero es insertar animaciones que recreen el movimiento completo del Game&Watch a través de las distintas posiciones que adopte. Entonces, sería igual a cualquier juego moderno.
Sistema de plataformas Game and Watch
Dada la anterior situación, me he dado a la tarea de hacer un sencillo sistema de plataformas muy al estilo Game&Watch que me permita mover un personaje tipo Indiana Jones a través de un escenario usando sólo dos teclas de dirección, pero no es tan sencillo, porque a su vez, el escenario puede diseñarse con un arreglo (array) que consta de tres tipos de bloques: espacio vacío, espacio lleno y escaleras.
La idea del algoritmo es sencilla. Dependiendo de la posición del personaje se toma un muestreo de los bloques que se encuentren enfrente y dependiendo de su configuración se deduce cual será su siguiente posición.
Enseguida, un diagrama de las distintas configuraciones posibles que he delimitado. El punto de la flecha indica la posición inicial, la punta de la flecha indica la posición final, el trayecto hace referencia a el curso de la animación (animación para la cual fue diseñado el algoritmo).
En el diagrama se puede ver el funcionamiento básico del sistema de plataformas tipo Game&Watch.
Los cuadros naranjas repesentan espacios llenos, los durazno espacios vacios y los verdes escaleras. Las letras azules son los códigos con los que he querido identificarles.
La siguiente función escrita en JavaScript es en si misma el algoritmo mencionado anteriormente. Al indicarle un arreglo (array bidimensional con valores entre el 0 y el -2 ), una posición x,y (del monito dentro del arreglo), una dirección (izquierda: -1, derecha: 1) y un valor booleano extra (el cual veremos inmediatamente), arroja la nueva posición x,y además de código que identifica la configuración encontrada (false de no ser ninguna esperada).
//---- Función moverGWJones ----
function moverGWJones(map,x,y,d,b){//--- fin de la función ---
var a=false;
d=d>0?1:-1;
var m=[[],[],[],[],[],[]];
for(var iy=0;iy<6;iy++){
var iyy=iy-2+y;
for(var ix=0;ix<4;ix++){
var ixx=x+(ix*d);
m[iy][ix]=map[iyy]!=undefined?(map[iyy][ixx]!=undefined?map[iyy][ixx]:-1):-1;
}
}
var s=map[y+1]!=undefined?(map[y+1][x-d]!=undefined?map[y+1][x-d]:-1):-1;
if(m[3][0]<0){ //tiene piso
if(m[2][1]>=0){ //no hay pared
if(m[3][1]<0){ x+=d; a="0"; }else //hay suelo
if(b){ //no hay suelo
x+=d;y++;
if(m[4][1]<0){ a="1" }else{ a="2"; }
}else{
if(m[0][1]>=0 && m[0][2]>=0 && m[1][1]>=0 && m[1][2]<0){ x+=d;y--; a="A"; }else
if(m[1][1]>=0 && m[1][2]>=0 && m[2][2]<0){ x+=2*d;y--; a="B"; }else
if(m[2][2]>=0 && m[3][2]<0){ x+=2*d; a="C"; }else
if(m[3][2]>=0 && m[4][2]<0){ x+=2*d;y++; a="D"; }else
if(m[3][2]>=0 && m[4][2]>=0 && m[5][2]<0){ x+=2*d;y+=2; a="E"; }else
if(m[1][1]>=0 && m[1][2]>=0 && m[0][2]>=0 && m[0][3]>=0 && m[1][3]<0){ x+=2*d;y--; a="F"; }else
if(m[1][2]>=0 && m[1][3]>=0 && m[2][2]>=0 && m[2][3]<0){ x+=2*d; a="G"; }else
if(m[2][2]>=0 && m[2][3]>=0 && m[3][2]>=0 && m[3][3]<0){ x+=3*d; a="H"; }else
if(m[2][2]>=0 && m[3][2]>=0 && m[3][3]>=0 && m[4][2]>=0 && m[4][3]<0){ x+=3*d;y++; a="I"; }else
a=false;
}
}else{ //hay pared
if(m[1][1]==-2){ y--; a="O"; }else
if(m[1][0]>=0 && m[1][1]>=0){ x+=d;y--; a="J"; }else
if(m[0][0]>=0 && m[0][1]>=0 && m[1][0]>=0 && m[1][1]<0){ y--; a="K"; }else
a=false;
}
}else{
if(m[1][1]==-2){ y--; a="P"; }else
if(s==-2){ y++; a="Q"; }else
if(m[2][1]<0 && m[1][0]>=0 && m[1][1]>=0){ x+=d;y--; a="L"; }else
if(m[3][0]>=0 && m[4][0]<0){ y++; a="M"; }else
if(m[3][0]>=0 && m[4][0]>=0 && m[5][0]<0){ y+=2; a="N"; }else
a=false;
}
return [x,y,a];
}
El valor booleano sirve para seleccionar una acción al aproximarse a un borde o caída: True para descender con cuidado, False para brincar.
Y Acá, un demo en vivo. La letra A representa al monito. El número 0 es un espacio lleno. El punto un espacio vacío. El signo + representa escaleras. Por otro lado. Use algunos sprites de Splinter Cell para hacer un ejemplo más completo a la derecha.

< Izquierda | Derecha > | Comportamiento Descender
Por ultimo, puedes descargar aquí el demo para que veas el código funcionando. Espero te sea útil en tus proyectos y no olvides mencionarme si lo usas. n_n
No hay comentarios.:
Publicar un comentario