Comunidad de diseño web y desarrollo en internet online

[AS3] - Error #1010 en funciones (event:TimerEvent)

Citar            
MensajeEscrito el 15 Ene 2011 11:37 pm
Bueno, este es mi primer mensaje por aqui, estoy haciendo un "juego" por llamarlo de alguna manera. Tengo hecho un nivel, tal cual quiero que sea una vez este acabado el juego, y el nivel por separado funciona bien.

El problema viene cuando hago que el juego empiece en el frame 2. Para hacer la prueba pongo a mano un boton en el frame 1 que conduzca al frame 2. En la clase constructora "Joc" tengo un currentFrame que se encarga de mirar el frame en el que se encuentra, y un switch para, segun en que frame se encuentre, construir y remover lo que toque.

Soy bastante novato en todo lo que se refiere a actionscript, ni 2 ni 3 ni nada, pero creo que hasta aqui voy bien.

Cuando lo ejecuto, sale el boton que coloque manualmente en el frame 1, hago click y se construye todo, y todo va bien excepto aquello cuyo funcionamiento depende de una funcion event:TimerEvent.

TypeError: Error #1010: Un término no está definido y no tiene propiedades.
at codi::Energia_contador/sube_baja_energia()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

Salen muchos errores como ese, Energia_contador es el nombre de una clase que peta y sube_baja_energia una funcion que hay dentro de esa clase de tipo event:TimerEvent. He mirado todos los errores que da al ejecutar y todas las funciones son de ese tipo, aquellas funciones que no dependen de un event:TimerEvent funcionan bien.

Código ActionScript :

package codi
{

   import flash.display.MovieClip;
   import flash.events.*;
   import flash.display.*;
   import flash.utils.Timer;

   import codi.Escenari;
   import codi.Escenari1;
   import codi.Escenari2;
   import codi.Escenari3;
   import codi.Velocimetro;
   import codi.Coche_prota;
   import codi.Carril1;
   import codi.sonido;
   import codi.Estatico;

   public class Joc extends MovieClip
   {
      var carretera:MovieClip;
      var pers:MovieClip;
      var speed:MovieClip;
      var carril_arriba:MovieClip;
      var bateria:MovieClip;
      var barra_energia:MovieClip;
      var comprobarframe1:Boolean = true; //Para que solo construya una vez dentro del frame 1
      var comprobarframe2:Boolean = true; //Para que solo construya una vez dentro del frame 2



      public function Joc()
      {
         addEventListener(Event.ENTER_FRAME, comprobarFrame);

         function comprobarFrame(e:Event)
         {
            switch (currentFrame)
            {

               case 1 :
                  if (comprobarframe1 == true)
                  {
                     trace("hola 1!!");
                     comprobarframe1 = false;
                  }
                  break;

               case 2 :                  
                  if (comprobarframe2 == true)
                  {
                     trace("hola 2!!");
                     
                     carretera = new Estatico();
                     carretera.name = "estatico";
                     stage.addChild(carretera);
                     
                     carretera = new Escenari3(stage,this);
                     carretera.name = "edificio3";
                     stage.addChild(carretera);
                     
                     carretera = new Escenari2(stage,this);
                     carretera.name = "edificio2";
                     stage.addChild(carretera);

                     carretera = new Escenari1(stage,this);
                     //carretera.name = "edificio1";
                     stage.addChild(carretera);

                     carretera = new Escenari(stage,this);
                     //carretera.name = "carretera1";
                     stage.addChild(carretera);

                     carril_arriba = new Carril1(stage,this);
                     carril_arriba.name = "carriles";
                     stage.addChild(carril_arriba);

                     pers = new Coche_prota(stage,carril_arriba);
                     pers.name = "personatge";
                     stage.addChild(pers);

                     speed = new Velocimetro(stage,this);
                     stage.addChild(speed);

                     barra_energia = new Energia_contador(stage,this);
                     barra_energia.name = "hud_energia";
                     stage.addChild(barra_energia);

                     comprobarframe2 = false;
                  }
                  break;
            }
         }
      }
   }
}


Cualquier critica sera bien recibida, no tengo mucha idea y cualquier cosa que sirva para mejorar sera probada, asi que muchas gracias a los que hayais leido hasta aqui abajo xD.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

chrome
Citar            
MensajeEscrito el 16 Ene 2011 08:56 am
BuenAS:

Por el error que emite parece que la función controladora del Timer hace referencia a objetos que AÚN NO ESTÁN CREADOS. Posiblemente los que creas en la segunda opción del switch.

Yo cambiaría el enfoque. ¿Por qué no añades todo el código que ejecutas en el ENTER_FRAME (ese código se ejecuta 24 veces por segundo) en la función que tengas asignada al evento CLIK? O sea, más que estar comprobando CONSTANTEMENTE (24 veces por segundo) si estás en un frame u otro y hacer lo que corresponda; cuando se pulse el botón ves a qué parte de tu interactivo vas y ejecutas el código correspondiente (1 vez por click).

Por otro lado, ten cuidado cuando accedas al stage en una clase, en el constructor de dicha clase es conveniente añadir un listener al evento Event.ADDED_TO_STAGE y en su función controladora añadir el código que hace referencia al stage. Esto es debido a que cuando añades una instancia de una clase a la lista de visualización (o sea, haces un "new" y un "addChild") NO tiene acceso al stage al momento.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome

 

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