• Sábado 15 de Diciembre de 2018, 12:37

Autor Tema:  Problema con flujo de ejecución o bien problema de conceptos  (Leído 1809 veces)

d3v1an

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problema con flujo de ejecución o bien problema de conceptos
« en: Lunes 27 de Enero de 2014, 20:38 »
0
Hola gente de Cristalab, vuelvo a escribir a ver si algún experto en el tema puede orientarme porque vengo tratando de resolver este dilema hace tiempo y sinceramente no quiero seguir hechando mano ya que creo que voy a generar más problemas y podría estar haciendo mal las cosas.

Estoy programando un juego, y al principio del mismo estoy haciendo como un "tutorial" donde un dibujito te explica los botones que tenes que apretar para aprender a jugar etc, (muy al estilo cityville el estilo de tutorial).

El sistema lo pense algo así :

Imaginemos que tengo un Main como este:

Código: [Seleccionar]
package  {   
   import flash.display.MovieClip;
   import Imagenes;
   import imgLoader;
   import Animaciones;
   import Tutorial;
   
   public class Main extends MovieClip {   
   public var cont:uint;
   private var img:Imagenes;
   private var loader:imgLoader;
   public var tutorial:Tutorial;
   
      public function Main()
      {
         img = new Imagenes();
         cont = 0;
         tutorial = new Tutorial(this);
         cargarImagenes();         
      }
     
      private function cargarImagenes():void
      {         
         for (var i:uint = 0; i < img.imagenes[0].length;i++)
         {   
            trace("ENTRA. i: " + i);
            loader = new imgLoader(this,img.imagenes,i);
         }
      }

      public function continuar():void{
         ordenar();
         Loading.visible = false;
         tutorial.iniciarTutorial(img.imagenes);
      }
     
      private function ordenar():void{
         for (var i:uint = 0; i < cont; i++){
            if ((img.imagenes[1][i] == "img")||(img.imagenes[1][i] == "spr")){
            this.setChildIndex(this.getChildByName(img.imagenes[0][i]),i);               
            }
            else if (img.imagenes[1][i] == "array")
            {
            this.setChildIndex(this.getChildByName(img.imagenes[0][i][0]),i);               
            }
         }
         cont = 0;
      }     
   }   
}

por otro lado tengo la clase imagenes que es la clase donde tengo todos los datos de las imagenes para trabajar con ellas:

Código: [Seleccionar]
package  {   
   public class Imagenes {
     
                private var nombre,tipo,pos_x,pos_y,vis,btn_ok,desaparecer_ok,desaparecer_ok_nombres,                                                                 desaparecer_ok_alfas,aparecer_ok,aparecer_ok_pos_x,aparecer_ok_pos_y,aparecer_ok_nombres,               aparecer_ok_alfas: Array;
     
      public var imagenes:Array;
     
      public function Imagenes() {
         
         desaparecer_ok_nombres = new Array("btn_ok","Profesor","Glb_Dialogo_Grande");
         desaparecer_ok_alfas = new Array(0,0,0);
         desaparecer_ok = new Array("desaparecer",desaparecer_ok_nombres,desaparecer_ok_alfas);
         aparecer_ok_nombres = new Array("Profesor","Glb_Dialogo_Grande");
         aparecer_ok_alfas = new Array(1,1);
         aparecer_ok_pos_x = new Array(900,650);
         aparecer_ok_pos_y = new Array(40,50);
         aparecer_ok = new Array("aparecer",aparecer_ok_nombres,aparecer_ok_alfas,
                           aparecer_ok_pos_x,aparecer_ok_pos_y);
         btn_ok = new Array("btn_ok",desaparecer_ok,aparecer_ok);

         nombre = new Array("Laboratorio_Principal","Caja_Negra","Profesor","Glb_Dialogo_Grande",btn_ok);         
         tipo   = new Array("img","spr","img","img","array");                       
         pos_x = new Array(0,0,220,380,500);         
         pos_y = new Array(0,0,90,100,230);         
         vis = new Array(true,true,true,true,true);         
         
         imagenes = new Array(nombre,tipo,pos_x,pos_y,vis);         
      }
   }   
}

La clase tutorial que es la cual se usa una sola vez para iniciar el tutorial a la primera ejecucion

Código: [Seleccionar]
package  {
   
   import Animaciones;
   import Boton;
   import flash.display.MovieClip;
   import flash.utils.Timer;
   import flash.events.TimerEvent;
   import flash.events.Event;
   
   public class Tutorial {

      public var anim:Animaciones;
      private var main:MovieClip;
      private var tutorial:uint;
      private var imagenes:Array;
      private var btn:Boton;
     
      public function Tutorial(Main:MovieClip) {
         tutorial = 0;
         anim = new Animaciones(Main);
         main = new MovieClip();
         main = Main;
         btn = new Boton(Main);
      }
     
      public function iniciarTutorial(imagenes:Array){
         
         this.imagenes = new Array();
         this.imagenes = imagenes;
         
         var nombres:Array = new Array("Caja_Negra","Profesor","Glb_Dialogo_Grande");
         var alfas:Array = new Array(0.5,1,1);
         var pos_x:Array = new Array(main.getChildByName(nombres[0]).x,main.getChildByName(nombres[1]).x,
                              main.getChildByName(nombres[2]).x);
         var pos_y:Array = new Array(main.getChildByName(nombres[0]).y,main.getChildByName(nombres[1]).y,
                              main.getChildByName(nombres[2]).y);
         tutorial ++;
         anim.addEventListener(Eventos.ANIMACION_TERMINADA ,continuar);
         anim.aparecer(nombres,alfas,pos_x,pos_y);
      }
     
      private function paso1(){
         tutorial ++;
         anim.addEventListener(Eventos.ANIMACION_TERMINADA ,continuar);
         btn.defBtn(imagenes[0][4]);
      }
     
      private function paso2(){
         tutorial ++;
      }

     
      public function continuar(e:Event){
         if (tutorial == 1){
            anim.removeEventListener(Eventos.ANIMACION_TERMINADA ,continuar);
            paso1();
         } else if (tutorial == 2){
            anim.removeEventListener(Eventos.ANIMACION_TERMINADA ,continuar);
            paso2();
         }
      }
   }   
}

La clase boton que es donde ve que pasa cuando se presiona un boton:

Código: [Seleccionar]
package  {
   import flash.display.MovieClip;
   import flash.events.MouseEvent;
   
   public class Boton {
     
      private var main:MovieClip;
      private var btn:Array;

      public function Boton(main:MovieClip) {
         // constructor code
         this.main = new MovieClip();
         this.main = main;
      }
     
      public function defBtn(btn:Array){
         this.btn = new Array();
         this.btn = btn;
         main.getChildByName(btn[0]).addEventListener(MouseEvent.MOUSE_OVER, sobre);
         main.getChildByName(btn[0]).addEventListener(MouseEvent.MOUSE_OUT, fuera);
         main.getChildByName(btn[0]).addEventListener(MouseEvent.CLICK, presiona);
      }
     
      private function sobre (e:MouseEvent):void{
         
      }
     
      private function fuera (e:MouseEvent):void{
         
      }
     
      private function presiona (e:MouseEvent):void{
         for (var i:uint = 1; i < btn.length; i++){
            switch (btn[i][0]){
               case "aparecer":               
               main.tutorial.anim.aparecer(btn[i][1],btn[i][2],btn[i][3],btn[i][4]);
               break;
               case "desaparecer":
               main.tutorial.anim.desaparecer(btn[i][1],btn[i][2]);
               break;
            }
         }
      }     
   }   
}

Y la clase animaciones donde se hacen las animaciones que quiero:

Código: [Seleccionar]
package  {
   import flash.display.MovieClip;
   import flash.utils.Timer;
   import flash.events.TimerEvent;
   
   public class Animaciones extends MovieClip {
     
      private var main:MovieClip;
      private var temporizador:Timer;
      private var currentCount:uint;
      private var nombres,alfas,pos_x,pos_y:Array;
     
      public function Animaciones(Main:MovieClip) {
         // constructor code
         nombres = new Array();
         alfas = new Array();
         pos_x = new Array();
         pos_y = new Array();
         
         main = new MovieClip();
         main = Main;
         currentCount = 7;

      }
     
     
      public function aparecer(nombres:Array,alfas:Array,pos_x:Array,pos_y:Array){
         
         this.nombres = nombres;
         this.alfas = alfas;
         this.pos_x = pos_x;
         this.pos_y = pos_y;
         
         for (var i:uint = 0; i < nombres.length; i++){
            main.getChildByName(nombres[i]).alpha = 0;
            main.getChildByName(nombres[i]).x = pos_x[i];
            main.getChildByName(nombres[i]).y = pos_y[i];
         }
         
         temporizador=new Timer(1,7);
         temporizador.addEventListener(TimerEvent.TIMER, fadeIn);
         temporizador.start();
      }
     
      public function desaparecer(nombres:Array,alfas:Array){
         
         this.nombres = nombres;
         this.alfas = alfas;
         
         temporizador=new Timer(1,7);
         temporizador.addEventListener(TimerEvent.TIMER, fadeOut);
         temporizador.start();
      }
     
      private function fadeIn(e:TimerEvent){
            temporizador.delay=50;
            for (var i:uint = 0; i < nombres.length; i++){
            if ((main.getChildByName(nombres[i]).alpha)<(alfas[i])){
               main.getChildByName(nombres[i]).alpha += 0.15;
            } else {
               temporizador.delay = 1;
            }
           
            }
                       
            if (temporizador.currentCount == currentCount){
               dispatchEvent(new Eventos("AnimacionTerminada"));
            }
           
            }
           
     
      private function fadeOut(e:TimerEvent){
            temporizador.delay=50;
            for (var i:uint = 0; i < nombres.length; i++){
               trace(alfas[i]);
            if ((main.getChildByName(nombres[i]).alpha)>(alfas[i])){
               trace(nombres[i]);
               main.getChildByName(nombres[i]).alpha -= 0.15;
            } else {
               temporizador.delay = 1;
            }
           
            }
                       
            if (temporizador.currentCount == currentCount){
               dispatchEvent(new Eventos("AnimacionTerminada"));
            }
           
            }

     
   }
   
}

Finalmente tengo una clase imgLoader que se encarga de cargar las imagenes pero no la pongo porque no viene al caso.

Ahora voy a intentar explicar el funcionamiento de esto siguiendo el flujo de ejecución de flash.

1) La clase Main crea el objeto imagenes
2) En imagenes esta toda la información de las imágenes a cargar y de las acciones que quiero de cada una.

Básicamente lo pensé así

nombre = new Array("Laboratorio_Principal","Caja_Negra","Profesor","Glb_Dialogo_Grande",btn_ok);   
tipo = new Array("img","spr","img","img","array");   
pos_x = new Array(0,0,220,380,500);   
pos_y = new Array(0,0,90,100,230);   
vis = new Array(true,true,true,true,true);   

imagenes = new Array(nombre,tipo,pos_x,pos_y,vis);   

el Array imagenes va a tener la forma (nombre,tipo,pos_x,pos_y,vis);
a) nombre = nombre de la imagen a cargar que es el mismo nombre que se le pondrá a la instancia.
b) el tipo de dato que es, si es de tipo "img" se carga sin problemas, si es "spr" la clase imgLoader se encarga de crear el sprite que quiero, y si es de tipo "array" quiere decir que es un boton.
c) pos_x, pos_y, vis que indican la posición en x, y, y si es visible o no respectivamente.

en el caso de que sea un boton tiene una estructura como esta

btn_ok = new Array("btn_ok",desaparecer_ok,aparecer_ok);

a) "btn_ok": es el nombre de la imagen que se carga y el nombre que se le pone a la instancia.
b) desaparecer_ok y aparecer_ok son arrays que tienen información de la animación a realizar cuando se la requiera.

sigamos
3) se crea una nuevo objeto tutorial y se llama a la función cargarImagenes(); que carga las imagenes
4) cuando se cargan las imagenes la clase imgLoader indica que se debe ir a la funcion continuar del Main.
5) en la funcion continuar se llama a la funcion ordenar(); que ordena los childrends visibles de manera que queden en orden en cuanto a profundidad.
6) se deja de mostrar una pantalla de "cargando" y se llama a la funcion iniciarTutorial() de la clase Tutorial.
7) En la clase tutorial primero hace que aparezca progresivamente las imagenes indicadas.
8 ) se pone un listener que va a escuchar cuando la animacion termina, pasa por la funcion continuar que indica que se debe ir a la funcion paso1();
9) en la funcion paso1() se llama a la funcion boton y se le pasa el array btn_ok.
10) dentro de la clase boton hace un for donde recoje todas las acciones y llama a animaciones para realizar las acciones (aparecer o desaparecer)

Bien cuales son mis problemas?

1) en el punto (10) hace el for pero no ejecuta las funciones fadeIn y fadeOut de la clase animaciones hasta que termina el for, como cree un solo objeto que se llama anim los datos que se pasan en fadeIn estan pisando a los datos del fadeOut (hablando del btn_ok) por lo que el boton ok no desaparece nunca y queda en pantalla.
2) cuando cargo las imagenes al principio creo un objeto imgLoader por cada imagen que tengo, creo que no estaría bien eso, o por lo menos luego tendria que eliminar cada objeto imgLoader que cree para que no queden cargados en memoria no?
3) Me parece que todo esto es una ensalada, pero sinceramente es la forma que lo pense, pero lo veo todo muy poco ordenado y muy enquilombado.

Nose si se entiende bien mis problemas o mi programa, por favor necesitaría alguien que tenga bien claro el tema que me oriente si esta bien pensado si esta mal pensado, como lo puedo resolver, o que estoy haciendo mal.

Dejo el código por si alguno prefiere descargarlo y verlo ya que capaz por acá este todo como medio confuso.

http://www.mediafire.com/download/f9x349hoxasrf4i/Pet%20Life.rar