Comunidad de diseño web y desarrollo en internet online

Problema al usar Loader

Citar            
MensajeEscrito el 19 Ago 2008 10:18 pm
Hola, que tal? Llevo unos cuantos dias con AS3 y la verdad me ha gustado mucho, solo que he tenido muchos problemas. Bueno, el problema que tengo ahora es que tengo una clase para mover un movie clip con las teclas de direccion, simulando un personaje en 3D que camina mediante el uso de etiquetas en la linea de tiempo, lo tengo en .as y al ponerlo como clase de documento en el .fla donde tengo la animacion, todo bien. Al correr el .swf, todo bien, pero cuando uso el metodo Loader para incluirlo en otro .swf, tengo el siguiente error:

AS3 escribió:

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at clases::moverJugador$iinit()


He hecho muchos cambios en mi código, de hecho cuando tenia la animación con el código en el frame 1 en vez de un .as, lo podia importar sin problemas, pero se me hace mucho más conveniente hacer uso de clases, sólo que tengo este problema y no sé que pueda ser.

El código de mi archivo moverJugador.as es éste:

Código :

package clases {
   import flash.events.*;
   import flash.display.MovieClip;
   public class moverJugador extends MovieClip {
      //Configuracion del jugador
      public static var velocidad:Number=3;
         
      //Variables globales
      public static var xDown:Boolean=false;
      public static var yDown:Boolean=false;
      public static var xDir:Number;
      public static var yDir:Number;
      public static var direccion:String;
      
      //Constructor
      public function moverJugador() {
         //Eventos
            this.stage.addEventListener(KeyboardEvent.KEY_DOWN,abajo);
            this.stage.addEventListener(KeyboardEvent.KEY_UP,arriba);
            this.stage.addEventListener(Event.ENTER_FRAME,quieto);
      }
      
      //Si no esta caminando, se detiene el movieClip, respetando la direccion 
        function quieto(ef:Event) {
            if(xDown==false && yDown==false)
            char.gotoAndPlay(direccion);
        }

      //Se ejecuta cuando esta presionada una tecla
      function abajo(event:KeyboardEvent):void {
         if(event.keyCode==40 || event.keyCode==38){ //Verifica que se presionen las flechas ARRIBA o ABAJO
             yDown=true; 
            yDir=event.keyCode;
            this.stage.addEventListener(Event.ENTER_FRAME, moveY);
            }
           if(event.keyCode==39 || event.keyCode==37){ //Verifica que se presionen las flechas IZQUIERDA o DERECHA
            xDown=true;
            xDir=event.keyCode;
            this.stage.addEventListener(Event.ENTER_FRAME, moveX);
           }
           }

         //Se ejecuta cuando se suelta una tecla
      function arriba(event:KeyboardEvent):void {
         if(event.keyCode==40 || event.keyCode==38){
            yDown=false;
         }
         if(event.keyCode==39 || event.keyCode==37){
            xDown=false;
         }
      }

      //Se mueve verticalmente y detecta combinaciones de tecla para caminar esquineado
      function moveY(evento:Event){
         if(yDown==true){
         if(yDir==38){
            this.y-=velocidad; 
            if(xDown==true && xDir==37) {
               if(direccion!="UL") { //Comprueba si ya esta caminando en esa direccion
               char.gotoAndPlay("UL"); }//Up-left
               direccion="UL"; }
            else { 
               if(xDown==true && xDir==39) {
                 if(direccion!="UR") {
                  char.gotoAndPlay("UR"); } //Up-right
                  direccion="UR"; }
               else {
                  if(direccion!="U") {
                 char.gotoAndPlay("U"); } //Up
                  direccion="U";  } } }
         else if(yDir==40){
            this.y+=velocidad;
            if(xDown==true && xDir==37) {
               if(direccion!="DL") {
               char.gotoAndPlay("DL"); } //Down-left
               direccion="DL"; }
            else { 
               if(xDown==true && xDir==39) {
                 if(direccion!="DR") {
                  char.gotoAndPlay("DR"); } //Down-right
                  direccion="DR"; }
               else {
                  if(direccion!="D") {
                  char.gotoAndPlay("D"); } //Down
                  direccion="D";
            } }
         }
         }
      }

      //Se mueve horizontalmente, no necesita checar combinaciones de tecla
      function moveX(evento:Event){
         if(xDown==true){
         if(xDir==37){
            this.x-=velocidad;
            if(yDown==false) {
             if(direccion!="L") {
            char.gotoAndPlay("L"); }
            direccion="L"; }
         }else if(xDir==39){
            this.x+=velocidad;
            if(yDown==false) {
             if(direccion!="R") {
            char.gotoAndPlay("R"); }
            direccion="R"; }
         }
         }
      }
         }
      }

Éste archivo lo uso como Document Class en mi archivo jugador.swf. Y para importarlo en el otro archivo, main.swf, uso el siguiente código:

Código :

//Importamos clases
import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.LoaderInfo;
import flash.utils.*;

//Creamos el objeto que contendrá al jugador
var char:Object;

//Creamos un contenedor para cargar el SWF del jugador
//Cuando se complete, se ira al metodo "cargado"
var contenedor:Loader=new Loader();
contenedor.contentLoaderInfo.addEventListener(Event.COMPLETE, cargado);
contenedor.load(new URLRequest("jugador.swf"));
stage.addChild(contenedor);

//Una vez cargado el archivo, se mete al objeto Char
function cargado(e:Event):void {
   var loaderInfo:LoaderInfo = e.target as LoaderInfo;
    addChild(e.target.content);
    char=loaderInfo.content;
}


Si corro esto, me marca el error que dije anteriormente, pero si no uso moverJugador.as en jugador.fla, lo carga sin problemas.

Ayudenme por favor :(

Bueno, espero haber sido lo suficientemente específico, saludos! :)

Por LuisHerrada

5 de clabLevel



 

Mexico

firefox
Citar            
MensajeEscrito el 20 Ago 2008 12:23 am
En tu clase moverJugador dentro de la función constructora te refieres a stage, en AS3 stage se refiere al área de trabajo y es accesible desde cualquier DisplayObject que haya sido añadido a la displayList, por ejemplo intenta el siguiente script:

Código ActionScript :

var mySprite:Sprite = new Sprite();

mySprite.stage.addEventListener(MouseEvent.MOUSE_MOVE, doSomething);

function doSomething(evt:MouseEvent):void{
   
   trace("moviendo el mouse");
   
}


Te lanzará este herror:


TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.


Esto se debe a que no se puede acceder a la stage de este Sprite porque no ha sido añadido a la displayList y por lo tanto esta es nula.

Cuando instentas cargar tu SWF te lanzará el herror porque antes de añadir el loader a la displayList se está haciendo una referencia al stage, en este caso del SWF que vas a leer.

Como lo puedes solucionar, en tu clase contructora poniendo algo como lo siguiente:

Código ActionScript :

public function moverJugador():void {

   this.addEventListener(Event.ADDED_TO_STAGE, startGame);


}

private function startGame(evt:Event):void{

    this.stage.addEventListener(KeyboardEvent.KEY_DOWN,abajo); 
    this.stage.addEventListener(KeyboardEvent.KEY_UP,arriba); 
    this.stage.addEventListener(Event.ENTER_FRAME,quieto);

}


Nunca se va a ejecutar ningún código de la clase hasta que moverJugador no sea añadido a la stage, después que esto ocurra llamas a todas tus funciones que seguro no te dará conflicto porque ya se puede acceder a la stage de este.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 06:18 pm
Ooh lo he probado y funciona perfectamente, muchas gracias :D
Saludos.

Por LuisHerrada

5 de clabLevel



 

Mexico

firefox
Citar            
MensajeEscrito el 20 Ago 2008 09:10 pm
Que pena, pero ahora tengo otro problema :s
El código que estaba en main.fla lo cambie a un .as y lo uso como Document Class, y todo perfecto.
Solo que ahora no se como referirme a objeto char (al contenido del loader) para poder modificarlo, bueno, en realidad es para poder detectar colisiones con hitTestObject, pero no se qué poner ya que de todas las formas que intento me dice que estoy intentando acceder a una propiedad posiblemente no definida. Que podrá ser?

Saludos.

Por LuisHerrada

5 de clabLevel



 

Mexico

firefox
Citar            
MensajeEscrito el 20 Ago 2008 11:52 pm

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

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