Comunidad de diseño web y desarrollo en internet online

Profundidad

Citar            
MensajeEscrito el 22 Oct 2009 12:55 pm
Muy buenas gente!
Os traigo un problemita que seguro alguien tiene idea de como solucionarlo.
Veréis, estoy haciendo un juego en flash que consiste en que en una cuadricula un muñequito se mueve para conseguir llegar a distintas casillas hasta marcar las que toca.
Esto no tendría mayor problema, pero resulta que el usuario puede crear sus pantallas y hacer que las casillas de la cuadricula suban de nivel formando bloques que se han de esquivar o de saltar.
Esto también esta bien, pero el problema esta en que cuando el muñequito esta justo detrás de alguna cuadricula que ha "crecido" y se han convertido en bloques, no da el efecto que este por detrás de ella, ya que el muñeco esta una capa por encima de las casillas.
Se me había ocurrido traer al frente (o por lo menos una capa por encima de la del muñeco) a las casillas que se convierten en bloques, pero me esta dando un fallo.
No se como hacerlo exactamente, ya que las casillas las tengo colocadas directamente en el stage y mediante un .txt cargo la pantalla creada por el usuario, cambiando el frame de la casilla (las casillas son unos MCs con distintos frames, en los que en cada frame esta el nivel de bloque que se quiere dar).
He probado con .setChildIndex(0), de este modo (la película de flash la cargo en Flex):

Código ActionScript :

private function show(evt:Event):void
      { 
         fichero = root.parent.parent['parentApplication']['cf'];
         c.text = fichero;
         var valor:int = 0;
         var aux:int = 2;
         for (var i = 0; i < 8; i++)
         {
            for (var j = 0; j < 8; j++)
            {
               valor = int(fichero.charAt(aux));
               matrizCasillas[i][j].IrAFrame(valor);
               if (valor > 1)
               {
                  matrizCasillas[i][j].setChildIndex(this, 0);
               }
               aux++;
            }
         }


pero me da este fallo (el fallo es desde flex, que es donde lo pruebo):

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/setChildIndex()
at ClasePrincipal/show()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
at Demo6/loadHandler()[/Users/seiya/Programas/lo que hago en Flex/Demo6/src/Demo6.mxml:43]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.zigzah.utils::FileLoader/makeBytes()[/Users/seiya/Programas/lo que hago en Flex/Demo6/src/com/zigzah/utils/FileLoader.as:56]

Supongo que hay algún fallo en como hago la llamada en .setChildIndex, pero no se cual es el fallo, posiblemente tenga que poner algo en lugar del this, pero no lo se.
Creo que si consigo hacer que los objetos vayan y vengan al frente y atrás tendré casi todo lo que necesito, así que si alguien se le ocurre como hacerlo le estaré muy muy agradecido.
Muchas gracias!

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 22 Oct 2009 04:41 pm
He probado ha poner este codigo, cambiando el contenido del .setChildIndex:

Código ActionScript :

private function show(evt:Event):void
      { 
         fichero = root.parent.parent['parentApplication']['cf'];
         c.text = fichero;
         var valor:int = 0;
         var aux:int = 2;
         for (var i = 0; i < 8; i++)
         {
            for (var j = 0; j < 8; j++)
            {
               valor = int(fichero.charAt(aux));
               matrizCasillas[i][j].IrAFrame(valor);
               if (valor > 1)
               {
                  matrizCasillas[i][j].setChildIndex(matrizCasillas[i][j],numChildren); 
               }
               aux++;
            }
         }
      }


pero me dice que el "indice suministrado esta fuera de los limites":
RangeError: Error #2006: The supplied index is out of bounds.
at flash.display::DisplayObjectContainer/setChildIndex()
at ClasePrincipal/show()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
at Demo6/loadHandler()[/Users/seiya/Programas/lo que hago en Flex/Demo6/src/Demo6.mxml:43]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.zigzah.utils::FileLoader/makeBytes()[/Users/seiya/Programas/lo que hago en Flex/Demo6/src/com/zigzah/utils/FileLoader.as:56]

Bueno, tambien he probado mas cosas, pero con los mismo resultados...

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 22 Oct 2009 10:06 pm
Tu primer codigo no lo entiendo bien, this a que ambito ase referencia?. El segundo codigo que pones tambien esta algo imcompleto como para saber de ke va, pero noto que el segundo parametro de setChildIndex() es numChildren, me imagino que estas ampliando alguna clase DisplayObjectContainer y utilizas esa propiedad, yo creo ke deberia ser: numChildren - 1 ya que las posiciones de profundidad empiesan en cero. Talves pueda servir.

Por marrkitos

51 de clabLevel



 

Arequipa - Peru

firefox
Citar            
MensajeEscrito el 23 Oct 2009 12:42 am
A ver, ante todo gracias por responder, pero ese no es el problema.
En este caso esta puesto numChildren porque se me olvido ponerle el "-1" despues de un monton de pruebas.

Disculpa que no entiendas el codigo. Solo he puesto eso de codigo porque en realidad lo que me esta dando problemas es que me indica que el tamaño que le indico (el de numChildren) es demasiado alto... bueno, en realidad me dice que cualquier valor se sale de los limites, aunque ponga un 0 o le reste 1 a numChildren, se lo sume o haga lo que sea.
No he puesto nada mas porque hasta que no he intentado cambiar la profundidad de los MC no me ha dado problema.
Ese mismo codigo sin la parte del if funciona perfectamente.

Por SeiyaJapon

54 de clabLevel



 

España

firefox
Citar            
MensajeEscrito el 23 Oct 2009 07:21 am
Si las casillas las tienes colocadas directamente en el stage y en el array matrizCasillas[i][j] tienes una referencia al MC que es la casilla

Código ActionScript :

//para enviarlas al fondo, es simplemente
setChildIndex(matrizCasillas[i][j],0)
//si las quisieras mandar al frente
setChildIndex(matrizCasillas[i][j],numChildren-1)

Si tienes tu MC "personaje"

Código ActionScript :

//para mandar al frente al personaje
setChildIndex(personaje,numChildren-1)
//para mandar al fondo al personaje
setChildIndex(personaje,0)

Observa que la sintaxis de setChildIndex es

Código :

[contenedor].setChildIndex([contenido],[depth])

"contenido" ha de estar DENTRO de "contenedor".

Lo que no he entendido es que si tienes tanto el personaje como las casillas en el stage en tiempo de diseño, no pongas el personaje en la última capa -en la capa de por debajo del todo- para que todo lo que haya en una capa superior lo "tape".

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Oct 2009 07:34 am
Se me escabapa, cuando digo que
en el array matrizCasillas[i][j] tienes una referencia al MC que es la casilla

me refiero a que supongo que tienes, p.e. diversas casillas en el escenario "casilla0_0", "casilla0_1"...,"casilla0_9",""casilla1_0", "casilla1_1"...,"casilla0_9",...
Entonces has hecho un bucle parecido a

Código ActionScript :

for (i=0;i<10;i++){
   for (j=0;j<10;j++){
           //¡¡OJO!! la matriz la igualamos al MC
          //bien con
          matrizCasillas[i][j]=this["casilla"+i+"_"+j]  //<--el elemento de la matriz es un MC
          //bien con
         matrizCasillas[i][j]=getChildByName("casilla"+i"+"_"+j)  //<--el elemento de la matriz es un MC
          //pero NUNCA
        matrizCasillas[j][j]="casilla"+i+"_"+j //<--MAL, el elemento de la matriz es un STRING
   }
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 23 Oct 2009 11:26 am
Muchas gracias!!
Ya he entendido mi fallo.
Yo habia puesto

Código ActionScript :

matrizCasillas[i][j].setChildIndex(matrizCasillas[i][j],numChildren);  


Y el [contenedor] no es matrizCasillas, sino el stage. Asi que lo he dejado como

Código ActionScript :

setChildIndex(matrizCasillas[i][j],numChildren);  


y me ha funcionado a la perfección. Muchas gracias de verdad!!

XD XD XD XD XD XD

Por SeiyaJapon

54 de clabLevel



 

España

firefox

 

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