Comunidad de diseño web y desarrollo en internet online

Problema con Profundidades (Depth's) en juego de Tiles

Citar            
MensajeEscrito el 25 Jun 2010 05:34 am
Buenas. Actualmente ando en un proyecto de un juego RPG basado en Tiles, osea en los casilleros tipicos del mapa al estilo final fantasy para nes o pokemon red o el zelda para gameboy. En este momento estoy intentando hace ya algunos dias meter paisaje al mapa, pero para esto es necesario al caminar con el personaje, que las profundidades vayan cambiando de los paisajes y del jugador para poder pasar por delante y por detras de los paisajes dependiendo la posicion del personaje. Hice una cosa asi en AS2 pero directamente mandandole el numero de profundidad a mano, y arreglandolo de esa forma. Pero ahora en AS3 lo unico que me encuentro es con el swapDepth y se me esta complicando la vida. Alguien podria darme una mano con este tema? Les paso la funciones que me estoy armando, basicamente me falta hacer bien una de las funciones que se encarga de los cambios de profundidades.

El personaje al caminar, tira un evento el cual para este caso solo importa si la direccion fue hacia arriba o hacia abajo para modificar los depth de los objetos.

Tanto el personaje como los paisajes se encuentran en un contenedor grafico (this._mapContainer) para poder realizar los intercambios de profundidades.

Lo que intento hacer es intercambiar las profundidades de todos los paisajes que haya en una misma fila de tiles con las del jugador (character) pero al hacer esto sale cualquier cosa. Creo que mi mayor problema en este caso es pensar la algoritmia necesaria para solucionar este problema. O tal vez haya algo en profundidades de AS3 que aun no conosca y pueda aliviarme la vida.


Código ActionScript :

      public function updateLandscapeDepth(character:Character, direction:uint):void{
         
         var row:uint = character.posY;
         
         for(var i:uint = 0; i < (this._mapLandscape[row] as Array).length; i++){
            
            var landscape:Landscape = (this._mapLandscape[row] as Array)[i] as Landscape;
            
            this._mapContainer.swapChildren(character, landscape);
         }
         
         
      }


Espero que alguien me pueda dar una mano o alguna ayuda :)

Saludos, Benutti

Por Benutti

188 de clabLevel

1 tutorial

 

NutT

firefox
Citar            
MensajeEscrito el 25 Jun 2010 07:26 am
Hola,
hazlo al revés: en lugar de cambiar las profundidades de todos los tiles de una fila, es mejor que cambies la profundidad del personaje y lo coloques justo delante de la fila de tiles sobre la que está.
Por ejemplo, si la perspectiva del juego es top-view, y el mapa lo dibujas de arriba hacia abajo, de izquierda a derecha, y el mapa es de 10x10, tendrás en la fila superior los tiles en las profundidades 0 a 9, en la segunda de 10 a 19, ..., en la última de 90 a 99. Entonces si tu personaje está por ejemplo en la fila 2 tienes que mandarlo a la profundidad del tile 19 + 1, y si de ahí se mueve a la fila 3 lo mandas a la profundidad del tile 29 + 1, y así sucesivamente.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 25 Jun 2010 05:27 pm
Hola Isidoro, gracias por contestar. Asi como estas planteando es algo como lo que hacia antes, porque se podia decir explicitamente la profundidad del objeto. Es posible hacer eso en AS3? es decir, modificar la profundidad de un objeto por medio de un numero literal? Porque mi complicacion por el momento es que al no poder hacer eso, solo tengo la herramienta swapDepth y se me complica un poco mas.

Saludos, Benutti

Por Benutti

188 de clabLevel

1 tutorial

 

NutT

firefox
Citar            
MensajeEscrito el 25 Jun 2010 06:31 pm
En AS3 la gestión de profundidades es totalmente diferente a como se hacía en AS2. Al poner a tu personaje por ejemplo en la profundidad 25 automáticamente todos los objetos que estén en una profundidad superior se moverán una posición hacia arriba.
Por otro lado, aparte de swapDepth (que intercambia las profundidades de 2 clips) hay un truquillo que consiste en volver a hacer un addChild de un clip que ya está en la escena, pero en una profundidad determinada, y con ello todos los clips superiores se moverán hacia arriba. Con esto te evitarás tener que hacer el bucle para recolocar todos los tiles de la línea.
La función quedaría más o menos así (por cierto, he quitado el parámetro direction porque no voe que se use):

Código ActionScript :

public function updateLandscapeDepth(character:Character):void
{
   _mapContainer.addChildAt(character, _mapLandscape[character.posY + 1][0]);
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 25 Jun 2010 08:42 pm
Hola. Gracias de nuevo por responder. Ese truco de ir moviendo los indices de profundidad me sirvio bastante, aunque aun tengo el problema de que pasa si no hay ningun paisaje en la siguiente linea. En ese caso por ejemplo si camino hacia abajo a una fila donde no hay paisaje, al no haber nada con que reemplazar los indices, el personaje pasa por debajo de los paisajes de la linea de arriba.

El array bidimensional _mapLandscape tiene como filas arreglos los cuales tienen diferentes cantidades de elementos, dependiendo de la cantidad de paisajes que tengan en esa fila.

Modifique un poco el codigo que me pasaste.

Código :

      public function updateLandscapeDepth(character:Character, direction:uint):void{
         
         if( this._mapLandscape[character.posY][0] != null ){
            //si en la proxima fila hay paisajes
            this._mapContainer.addChildAt(character, this._mapContainer.getChildIndex(this._mapLandscape[character.posY][0]));
            
         }


A ese if le agrege un else que quedo demasiado complicado y no logre que funcionara correctamente asique no lo puse aca. Mi idea era, en el caso de que el movimiento sea hacia abajo (direction == CharacterDirections.DOWN) busque la anterior fila con paisajes (si es que existe) y hacer un addChildAt del character en la posicion del ultimo de los paisajes de la fila, aunque esto por ahora no me funciona.

El tema de la direccion por ahora no se si es necesario, pero lo mantengo en caso de que sea util, sino despues lo saco.

Gracias de nuevo por las respuestas y espero que tengas alguna idea con respecto al problema que ando teniendo.

Saludos, Benutti

Por Benutti

188 de clabLevel

1 tutorial

 

NutT

firefox
Citar            
MensajeEscrito el 25 Jun 2010 09:19 pm
Buenas, acabo de solucionar por fin el problema. Me fue de mucha ayuda tu idea isidoro, gracias :)

Me fue necesario usar la direccion para poder arreglar el problema de las filas sin paisajes.

Pongo el codigo de la funcion por si alguno le sirve. Me quedo medio complicadito pero funciona :P

Código ActionScript :

      public function updateLandscapeDepth(character:Character, direction:uint):void{
         
         if( this._mapLandscape[character.posY][0] != null ){
            //si en la proxima fila hay paisajes
            this._mapContainer.addChildAt(character, this._mapContainer.getChildIndex(this._mapLandscape[character.posY][0]));
            
         }else{
            //si no hay paisajes y me muevo hacia abajo
            
            var index:int;
            
            if( direction == CharacterDirections.DOWN ){
               
               if( this._mapLandscape[character.posY - 1][(this._mapLandscape[character.posY - 1] as Array).length - 1] != null){
                  
                  index = this._mapContainer.getChildIndex(this._mapLandscape[character.posY - 1][(this._mapLandscape[character.posY - 1] as Array).length - 1]) + 1;
                  this._mapContainer.addChildAt(character, index);
               }
               
            }
            
         }
         
      }


Saludos, Benutti

Por Benutti

188 de clabLevel

1 tutorial

 

NutT

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.