Juegos Isométricos con AS3. Scroll multidireccional
Goto And Stop VS AddChild / RemoveChild
En la página anterior te hablaba de la profundidad en vista isométrica para juegos, y esta profundidad, propiedad de cada tile, se recalcula para cada cambio de tile que se produce en el movimiento del heroe, y para el heroe, por cada vez que éste se mueva. El detonador del movimiento lo encontrarás en la función ciclo de la clase. Obviaré comentar el código de control del teclado.
Observa el código de la función de la clase level changeTile(xold, yold, x, y)
En este momento es muy importante remarcar una diferencia sustancial de este desarrollo, con respecto al utilizado en el tuto para AS2.
TONYPA, utiliza , y muy sabiamente, el método conocido como "Goto And Stop", para procesar los cambios de Tiles (el movimiento de las columnas y filas auxiliares, que actuan como buffer de tiles). En todo momento existe un número fijo de MovieClips en pantalla. Cuando ha de moverse una fila o una columna, no se crean ni se eliminan MovieClips, solo se mueven de sitio y se actualiza el fotograma adecuado, para que muestre el tile correspondiente del mapa. Esto se puede hacer ya que todos los tiles están en el mismo MovieClip. De esta forma se elimina uno de los cuellos de botella de AS2, que es el coste computacional de añadir y eliminar MovieClips a la escena, bastante mas lento que moverlos de sitio y cambiar el fotograma al que apuntan (gotoAndStop).
En el caso de este ejemplo, para AS3, de un plumazo me he cargado todas estas buenas prácticas. Como recordarás, en este caso cada tile es un objeto de una clase diferente, floor00, floor01... Esto me otorga una serie de ventajas y también inconvenientes, uno de ellos precisamente es el tener que añadir a la lista de objetos visuales (DisplayList), y eliminar de ella, los tiles que cambian con el desplazamiento del heroe en las columnas y filas auxiliares, pues el tipo de objetos instanciados es diferente (getTile y getFloorTile devuelven instancias de objetos y no números de fotograma), por tanto he de eliminar los objetos que desaparezcan del área visible y crear nuevos objetos con los nuevos tiles mostrados. Siempre manteniendo un número constante de objetos en la lista de objetos visibles del clip contenedor (bgLayer y tileLayer).
Aunque este método tiene un coste computacional mas elevado que otros, me ha permitido reutilizar casi integramente el código de la función changeTile original, y lo cierto es que el rendimiento no se ve demasiado afectado, por la misma optimización de estos métodos nativa de flash y AS3.
Sin embargo y aunque esta solución no funciona mal en este ejemplo, hay que tener en cuenta que el tamaño de la lista de objetos visibles de un contenedor (DisplayList), hará este método mas o menos lento. Añadir y eliminar objetos a la lista de objetos visibles, puede tener un impacto considerable sobre el procesador y la memoria, en función del número de tiles visibles que debamos manejar.
Puesto que podeís dejar comentarios para el tuto (mas abajo), agradezco cualquier aportación para mejorar el rendimiento de la función changeTile.
...y para cabar
El resto de funciones no han sufrido cambios con respecto al desarrollo original (moveChar y BuildMap), salvo las relativas a la nueva forma de incluir los tiles en sus correspondientes arrays. Dale un vistazo al código y si tienes dudas ¡¡ jein !! utiliza tu cuenta de facebook y deja un comentario, a lo mejor alguien lo resuelve.
No tengo mucho mas que contarte. Espero que esta sea una buena introducción para ti en el mundo de los juegos isométricos para Flash. No esperes desarrollar un Halo 3, ni un Obliviom con esto, pero puede ser divertido si tienes afición. Y antes de despedir este tuto (por el momento), recomendarte querid@ lector/a de redribera, pasar por el tutorial de TONYPA, en español o en inglés, y por este mismo varias veces si algo no te quedo muy claro.
Y también a aprovecho para recomendarle relajarse jugando a alguno de los juegos que componen el extenso catálogo de juegos flash de esta web.
Mis disculpas si no supe explicarme bien en algún punto. Saludos amig@!




