Comunidad de diseño web y desarrollo en internet online

Problema con root desde clase externa

Citar            
MensajeEscrito el 30 Jul 2010 10:58 pm
Hola! Éste es mi primer mensaje en el foro, aunque llevo bastante tiempo consultando dudas, y de decir que me ha salvado en varias ocasiones :lol:

El caso es que esta duda no he podido resolverla, y por ello me he animado a postear.


He de cargar y almacenar datos en un fichero XML, que contendrá los HighScores de un juego. La idea es coger los datos del fichero XML y ponerlos en una variable TextField para mostrarlos por pantalla.

En mi línea de tiempo principal tengo lo sifuiente

Código ActionScript :

var texto:TextField = new TextField();
addChild (texto);

var puntos:Records = new Records();
puntos.cargaXML();



Y en mi clase Records:

Código ActionScript :

private var miRoot:MovieClip;
      var cargador:URLLoader = new URLLoader();
      var url:String = "HighScores.xml";

      public function Records(){      //   Constructor de la calse Enemigo
         addEventListener(Event.ADDED, iniciar);
      }
      
      private function iniciar(e:Event):void{
         miRoot = MovieClip(root);
         trace("hola");
         trace (miRoot.texto.text);
         trace("holaaaa");
      }
      
      public function cargaXML() {
         miRoot.texto.text += "hola";
         cargador.addEventListener(Event.COMPLETE, cargaCompleta);
         //loadUrl.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
         //loadUrl.addEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
         //loadUrl.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler)
         cargador.load(new URLRequest(url));
      }


Todos los "holas" son mi manera de depurar el código y ver hasta dónde llega la ejecucución :lol:

No hace ninguno, y muestra el error

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Records/cargaXML()

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 30 Jul 2010 11:24 pm
En esta línea:

cargador.addEventListener(Event.COMPLETE, cargaCompleta);

Haces referencia a un método cargaCompleta que no existe

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 31 Jul 2010 06:13 am
BuenAS:

En lugar del evento Event.ADDED

Código :

      public function Records(){      //   Constructor de la calse Enemigo
         addEventListener(Event.ADDED, iniciar);
      }


utiliza Event.ADDED_TO_STAGE

Es el que garantiza que cuando se produce, la instancia realmente se ha añadido al escenario, y por tanto, existe escenario (stage) y root.

Ya como gusto personal, cambiaría la forma en la que obtienes el campo de texto. ¿Por qué en vez de recuperarlo a través de la propiedad root, no le pasas a la clase una instancia de dicho textField? Es que de esta forma, como le cambies el nombre de instancia, lo añadas a otro MovieClip, etc. no vas a localizarlo y seguramente no "recuerdes" cómo lo obtienes.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 01 Ago 2010 01:44 pm
Gracias por las repuestas!!

Pues parece que con Event.ADDED_TO_STAGE da el mismo error.
De todas maneras, tienes toda la razón. Le pasaré una instancia del campo de texto y me quito de líos.

Jorge, el método cargaCompleta existe, pero no lo puse porque no lo creí relevante. Ahí es donde utilizo el XML.

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Ago 2010 02:31 pm
BuenAS:

Creo que es que llamas a cargaXML antes de realizar el addChild de puntos

Código :

var puntos:Records = new Records();
puntos.cargaXML();


De todas formas, si no le pasas ningún parámetro a cargaXML podrías llamarlo directamente dentro de la clase en el método iniciar.

Y dicho todo esto, comento cómo me lo plantearía yo:
1. Pasaría el campo de texto como un parámetro a la clase.
2. Haría el addChild de puntos.
3. Llamaría al método cargaXML(ruta_del_xml) pasándole la ruta, así no tengo que entrar a modificar la clase Record si cambia la ruta del xml.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 01 Ago 2010 10:22 pm
Ajam. Todo correcto. Eso mismo he intentado yo. Pero no me dejar hacer el AddChild porque Records hereda de Sprite, que no es un DisplayObject.

Lo cambiare a Movieclip, pero es que no lo entiendo como algo que vaya a ser animado y me parecía más logico que fuese un simple Sprite. Aún estoy comprendiendo la jerarquía de clases de Flash...

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Ago 2010 05:45 am
BuenAS:

La clase Sprite hereda de DisplayObject y por tanto se puede añadir como hijo a otro Sprite o MovieClip. Posiblemente haya algún error de otro tipo que no permita hacerlo. El debugger del compilador de Flash se ha mejorado bastante pero no es precisamente perfecto :)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 02 Ago 2010 09:23 am
Muy cierto. Lo que pasaba es que añadía Records (clase) en lugar de records (instancia).

1067: Conversión implícita de un valor de tipo Class a un tipo flash.display:DisplayObject no relacionado.

Pues ahora me funciona de luxe. Gracias por estas pequeñas lecciones!

Por Cher0

18 de clabLevel



 

chrome

 

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