Comunidad de diseño web y desarrollo en internet online

Asignar código a frames a partir de Document Class

Citar            
MensajeEscrito el 13 May 2010 11:31 am
Hola de nuevo!

Como ya he comentado en otros post tengo el código distribuido en clases (bastantes) y código en la línea de tiempo (varios frames). Utilizo cada frame para mostrar pantallas diferentes. He intentado que el código en la linea de tiempo sea el mínimo pero aún así lo hay. Básicamente son llamadas a constructores de clases, añadirlas a la lista de visualización para mostrarlo en el stage y comprobaciones sencillas.

He estado ojeando por ahí y a partir del DocumentClass, creandome una clase principal y asignandosela al Documento (mediante sus propiedades) me da muchos errores. A parte de que no acabo de entender como transcribi el código de cada frame a la clase principal. No sé si me explico bien (imagino q no...:S)

Ya he visto en este tip: http://www.cristalab.com/tips/asignar-codigo-actionscript-en-clases-a-fotogramas-concretos-c62343l/ una explicación al respecto pero sinceramente estoy algo confusa. Imagino que me cuesta cambiar de concepto.

Mil gracias por la ayuda de antemano :)

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 May 2010 04:09 pm
creandome una clase principal y asignandosela al Documento (mediante sus propiedades) me da muchos errores

Recuerda que tienes que importar TODAS las clases incluídas las de Flash. (realmente no todas, quedan excluidas las que muestra este documentoAsí, p.e. si usas un Sprite debes añadir escribir

Código ActionScript :

import flash.display.Sprite;

Respecto a lo de usar el tip anterior, supongo que tienes problemas con los "packages". Es más difícil de explicar que de entender con una buena explicación (me temo que no va a ser esta, pero lo intento)
Cuando tenemos varios .as con varias clases del estilo

Código ActionScript :

//fichero clase1.as
package{
    public class Clase1{
       ...
   }
}
//fichero clase2.as
package{
    public class Clase2{
       ...
   }
}

"clase1.as" y "clase2.as" son ficheros que tenemos que tener en el mismo directorio que nuestro .fla
Normalmente, para ordenar las cosas un poco tenemos una estructura más ordenada. por ejemplo tenemos el .fla en un directorio y un subdirectorio "auxiliar" donde tenemos "clase1.as" y "clase2.as". Bien, en este caso DEBEMOS escribir las clases como

Código ActionScript :

//fichero clase1.as
package auxiliar{
    public class Clase1{
       ...
   }
}
//fichero clase2.as
package auxiliar{
    public class Clase2{
       ...
   }
}

Sí, le añadimos a la palabra package el DIRECTORIO donde se encuentra (contando a partir de nuestro .fla)

Vale, ahora resulta que nos hemos hecho unas clases muy útiles que vamos a reutilizar una y otra vez (o queremos usar PaperVision que no son sino una serie de .as). ¿cómo lo hacemos?
Lo suyo es colocarlas en un directorio cualquiera, en lugar de copiar dichas clases cada vez en uel directorio donde tengamos el .fla. Ahí es donde entra la idea de "ruta de clases".

Si vas a la pantalla de configurar la Publicación (Ctrl + Shift + F12). En la Pestaña Flas-->configuración tienes una opción para "Ruta de Clases"
Igualmente, cuando creamos un proyecto de flash le podemos indicar una "ruta de clases" para exclusivamente ese proyecto.

Vale, la ruta de clases son una serie de "directorios" (pueden ser más de uno). Es ahí donde lo ubicamos. Y sí. si antes una clase del estilo

Código ActionScript :

package auxiliar{
   public class Clase1{
       ...
   }
}

La buscaba en un subdirectorio de donde tenemos nuestro .fla, ahora flash lo buscará no sólo en ese directorio, sino en todos los que le hallamos indicado en la "ruta de clases" del proyecto y/o de la opción "configuración".

Con eso quiero decir que, en el tip de Zguillez nuestro "frameScript.as" que es de la forma

Código ActionScript :

package com.zguillez.core 
{ 
   public class FrameScript 
   { 
   }
}

DEBE estar en un subdirectorio que sea

Código :

RUTA/com/zguillez/core

donde "RUTA" es alguna de las indicadas en "ruta de Clases" o donde se encuentre nuestro .fla
puff
Lógicamente, podemos hacer que nuestro fichero "frameScript.as" sea de la forma

Código ActionScript :

package auxiliar.varios 
{ 
   public class FrameScript 
   { 
   }
}

Y estará en un subdirectorio que sea

Código :

RUTA/auxliar/varios


NOTA:Si no era eso lo que preguntabas siento el "tocho" de lectura

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 May 2010 10:33 am
Hola de nuevo!
Ya han pasado unos cuantos días desde mi primer post acerca de este tema pero se complicó la cosa y me tuve que poner con otras tareas. Ahora que lo retomo me encuentro con algunos problemas...
El tema de las rutas lo tengo controlado, gracias mil!

Volviendo al post de : http://www.cristalab.com/tips/asignar-codigo-actionscript-en-clases-a-fotogramas-concretos-c62343l/
tengo un problema con la línea de código de la función actions de la clase Frame1. Me sale el siguiente error de compilación: "1120: Access of undefined property _ruta."

Código ActionScript :

      var boton:MovieClip = _ruta.getChildByName("bot1") as MovieClip; 


Código ActionScript :

package  
{ 
   import flash.display.MovieClip; 
   import flash.events.MouseEvent; 
   import com.zguillez.core.FrameScript; 

   public class Frame1 extends FrameScript 
   { 
      public function Frame1(ruta:MovieClip) 
      { 
         super(ruta); 
      } 
      override protected function actions():void 
      { 
         var boton:MovieClip = _ruta.getChildByName("bot1") as MovieClip; 
         boton.buttonMode = true; 
         boton.addEventListener(MouseEvent.CLICK, function() 
         { 
            gotoFrame(2) 
         }); 
         /* resto del código para este fotograma */ 
      }
   } 
}


Por otro lado, a parte del error de compilación, en esa misma línea de código no entiendo exactamente que se hace. Bueno, más bien cómo hace lo de añadir el botón a la scn. Imagino que porque acostumbro a hacerlo de otro modo.
Si tengo un Mc "boton1" en la biblioteca y quiero añadirlo al escenario no haría:...?

Código ActionScript :

var  boton: bot1=new bot1(); 
addChild(boton);

??
Haciendolo de este modo obtengo el siguiente error:"1180: Call to a possibly undefined method addChild."
debido a que no he hecho el import 'import flash.display.Sprite;' y no he añadido el boton a un 'contenedor' tipo Sprite q luego añado a la escena. Otra opción posible sería que Frame1 extendiera de Sprite para poder hacer el addChild() directamente.

Gracias de antemano :)

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 May 2010 04:08 pm
Hola de nuevo!

El error ""1120: Access of undefined property _ruta."" ya no me sale. No me había dado cuenta de que era una variable protected de la superclase y la podía utitlizar en frame por se su 'hija'.

Pero sigo sin ver cómo añade el botón de la biblioteca en el Frame1 :S. Sé que es una tontería pero lo intento con un botón que tengo yo "startBtn", reemplazando el nombre en la sentencia.

Código ActionScript :

var boton:MovieClip = _ruta.getChildByName("startBtn") as MovieClip;  


y me da el error: "TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo."
¿Alguna sugerencia?

Por emedmaria

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 May 2010 03:05 pm
Hola!

Sigo con los accesos a la linea de tiempo externamente....Los problemas comentados en los post anteriores los he resuelto pero se me plantean unas dudas.

He tomado como referente a la hora de implementarlo el tip:http://www.cristalab.com/tips/asignar-codigo-actionscript-en-clases-a-fotogramas-concretos-c62343l/

En el Main se inicializan todas las clases asociadas a los Frames de la linea de tiempo:

Código ActionScript :

package  
{ 
   import flash.display.MovieClip; 
   import com.zguillez.core.TimelineScript; 
   //-------------------------------------------------------------------------------- 
   public class Main extends MovieClip 
   { 
      private var _timelineScript:TimelineScript; 
      //---------------------------------------------------------------------------- 
      public function Main() 
      { 
         _timelineScript = new TimelineScript(this); 
         _timelineScript.setFrame( 1, new Frame1(this) ); 
         _timelineScript.setFrame( 2, new Frame2(this) ); 
         _timelineScript.setFrame( 3, new Frame3(this) ); 
....
         /* etc.. */ 
      } 
      //---------------------------------------------------------------------------- 
   } 
}


pero en mi caso ésto no es viable, bueno mejor dicho no siempre. En los dos primeros frames las clases que inicializo no depende de ninguna varible de entrada pero en los sucesivos sí.
Me explico, en los dos primeros frames se cargan dos pantallas diferentes que no dependen de ninguna elección por parte del usuario, por tanto no hay problema en hacer:

Código ActionScript :

timeLineScript.SetFrame( 1, new Frame1(this) );

En el caso del Frame 4 por ejemplo, creamos un objeto de una clase creada externamente que carga unos contenidos prodecentes de un XML externo. El fichero XML a cargar depende del valor de una variable modificada en el frame anterior por el usuario. Es decir, la acción de pulsar un botón u otro en el frame anterior modifica el valor de una variable global que determinará cual es el fichero a cargar en el siguiente Frame.
Por tanto si inicio todos las clases Frame en el Main , las clases que dependen de entradas o elecciones por parte del usuario si se inician al principio toman un valor por defecto que no siempre coincide con la decisión tomada por el usuario.
Necesito una carga secuencial que permita saltos adelante y detras....

Por emedmaria

73 de clabLevel



 

firefox

 

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