Flash CS4 y AS3. Duda al definir constructor en clase externa
Hola a tod@s.
Llevo ya un par de horas dándole vueltas a este problema y una vez más, me he decido a pasar por aquí a ver si alguien me puede echar un cable.
Estoy intentando crear una clase externa que está asociada a un mc, el cual quiero que se adapte al ancho y alto de my stage al cambiar el tamaño del mismo.
Mi .fla contiene esto:
var cont:container = new container;
var myStage:Stage=this.stage;
myStage.scaleMode=StageScaleMode.NO_SCALE;
myStage.align=StageAlign.TOP_LEFT;
addChild(cont);
En este .fla, como digo, he creado un mc de 150x150px asociado a la clase imgContainer con nombre de clase base container.
En el la clase .as imgContainer tengo lo siguiente:
package tesko.utils
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;
public class imgContainer extends MovieClip
{
//trace("estoy instanciado");
public function imgContainer()
{
this.height=this.stage.stageHeight;
this.width=this.stage.stageWidth;
this.x=this.stage.stageWidth/2;
this.y=this.stage.stageHeight/2;
this.stage.addEventListener(Event.RESIZE, resizeDisplay);
}
private function resizeDisplay(event:Event):void
{
this.height=this.stage.stageHeight;
this.width=this.stage.stageWidth;
this.x=this.stage.stageWidth/2;
this.y=this.stage.stageHeight/2
}
}
}
El error que me tira el ouput panel es el siguiente:
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at tesko.utils::imgContainer()
at container()
at createMc_fla::MainTimeline/frame1()
Es bastante raro ya que la clase se instancia bien y creo que esta claro que cometo algun error en el constructor pero no sé ver donde.
Cualquier ayuda es bien recibida.
Gracias de antemano.
Salutens.
Roberto.
robertoabril
Ey!.
Gracias de nuevo por los tips y los consejillos literarios codebites.
La verdad que ya le eché un ojo a ese libro que comentas y está entre los futuribles. De momento estoy con Learning Action Script 3.0: A beginners Guide que creo que se adapta mejor a mi lamentable nivel. Bueno pues que muchas gracias otra vez por tu tiempo y consejos, así da gusto preguntar!.
Salutens!
Roberto.
codebites
Hola Roberto, no te cortes en preguntar
En una aplicación flash tenemos por encima del swf principal (que normalmente tiene una clase de documento vínculada) una instancia de stage, stage solo esta disponible para los DisplayObject(como los movieclips) una vez estos se han añadido a la displayList.
if(stage)
aquí verificamos si el objeto ya tiene acceso a stage, esto puede ser porque lo hayamos puesto en la timeline en vez de crearlo por código, o por que sea la clase del documento...(hay varias posibilidades de que se tenga acceso a stage en el constructor, depende del player que usemos,navegador y del sistema opertivo), en todo caso, si no existe stage aún, esperamos a que este disponible mediante el evento ADDED_TO_STAGE
addEventListener(Event.ADDED_TO_STAGE...
es lo mismo que poner
this.addEventListener(Event.ADDED_TO_STAGE
así que no le estoy poniendo este listener al stage, si no que se lo estoy poniendo a mi objeto, diciendole, ¡ei, avisame cuando stage ya este disponible para mí!
removeEventListener(Event.ADDED_TO_STAGE
Una vez el listener a cumplido su función (cualquier listener), es considerado buena practica no dejarlo en memoria consumiendo recursos, a no ser que vayas a ir quitando y añadiendo el objeto de la display list y cada vez tengas que hacer comprobaciones sobre stage, este se puede borrar
normalmente, si un objeto quiere averiguar por si mismo si esta en displayList hace lo que ya hemos comentado, pregunta por if(stage) o espera con el listener hasta que esta disponible, tambien puede ser que quieras que un mc "padre" sea el que controla sus mc "hijos", para eso tienes que utilizar Event.ADDED que permite escuchar cada vez que se añade un objeto "hijo" a la displayList
a mi me sirvió de mucho para dar el salto a AS3 el libro Actionscript 3.0 de colin mook, es de O'reilly, lo edita anaya-multimedia en castellano, aunque va bien pillarlo con nociones de programación orientada a objetos
Saludos!
robertoabril
Hola codebites.
Muchas gracias por la ayuda!. Ahora funciona perfectamente. :)
Puedo pregunatarte el porque añades un listener en el caso de que no esté añadido al stage para luego en la función quitarlo y enviarlo igualmente a la funcion que define las propiedades de container?¿. Ese listener lo añades al stage verdad?. Por otra parte la declaración if(stage) se puede utilizar para comprobar si cualquier otro objeto está añadido a la display list del fla?. Esto sería necesario si añadiese el mc desde la clase?.
Perdona si te rayo con las preguntas, pero estoy empezando con AS3 y hay muchas cosas que aún no pillo del todo. Busqué el evento ADDED_TO_STAGE en la ayuda de Flash, pero como casi siempre me quedé igual.
De todas maneras, gracias de nuevo por la ayuda y el tip.
Saludamens!
Roberto.
codebites
Hola roberto,
Esto sucede porque en el momento que creas un objeto container su propiedad stage es null, al menos hasta que lo añadas a la display list de su contenedor, se tiene que usar el evento ADDED_TO_STAGE, prueba así:
public class imgContainer extends MovieClip
{
//trace("estoy instanciado");
public function imgContainer()
{
if(stage){
init();
}else{
addEventListener(Event.ADDED_TO_STAGE, addedToStage);
}
public function addedToStage(ev:Event){
removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
init();
}
public function init():void{
this.height=this.stage.stageHeight;
this.width=this.stage.stageWidth;
this.x=this.stage.stageWidth/2;
this.y=this.stage.stageHeight/2;
this.stage.addEventListener(Event.RESIZE, resizeDisplay);
}
espero que funcione, un saludo!