Comunidad de diseño web y desarrollo en internet online

error llamando metodos de diferentes clases

Citar            
MensajeEscrito el 23 Nov 2011 01:00 am
Hola gente, estoy en un proyectito en el que involucra algunas clases muy simples, para realizar eventos simples.

La clase Main, es la madre e importa a las otras 2 importantes: Screengame y Controller

Main.as

Código ActionScript :

public class Main extends Sprite 
   {      
      private var screenOfGame:Screengame;
      private var controlOfGame:Controller;
      
      public function Main():void 
      {       
         screenOfGame = new Screengame();
         screenOfGame.startAnimation();
         this.addChild(screenOfGame);
         
         controlOfGame = new Controller();
      }
}


La clases Screengame es la encargada de crear la interfaz del proyecto:
Screengame.as

Código ActionScript :

public function Screengame() 
      {
         this.addChild(screenContainer);
      }
      
      public function startGame():void {
         trace("EMPIZA LA ANIMACION");
         screenContainer.addChild(coinsAdded);
         screenContainer.addChild(coinsTotal);         
         
         valuesCoins.defaultTextFormat = coinsAdded.textFormatCoin
         valuesCoins.text = coinsAdded.getValueCoins() + " / " + coinsTotal.getValueCoins();
         
         screenContainer.addChild(timer);
         
         screenContainer.addChild(player1);
         screenContainer.addChild(player2);
         
         this.stopAnimation();
      }

Esta clase tiene a su vez algunos metodos publicos que me permiten mostrar o esconder algunos elementos.

Para setear los valores se usa la clase Controller, la cual tiene los botones e inputs que definen los datos y que al hacer click, deberian llamar a los metodos de Screengame para que la aplicacion se actualice:

Código ActionScript :

public class Controller
   {
      private var gameMode:Screengame;
   
      public function Controller()
      {
         gameMode = new Screengame();
      }
      
      public function showCoin(value:uint):void
      {
         gameMode.coinsAdded.setValue(value);
      }
      
      public function totalCoin(value:uint):void
      {
         gameMode.coinsTotal.setValue(value);
      }
      
      public function startGame(value:uint):void
      {
         gameMode.timer.setTimeGame(value);
         gameMode.startGame();
         gameMode.timer.startTimer();
      }
}


El problema es que yo he agregado un boton en el controller que me permitiese llamar y ejecutar, como prueba, a los metodos de Screengame

Código ActionScript :

private function menuTemporario():void
      {
         
         var mc:cuadradito = new cuadradito();
           mc.addEventListener(MouseEvent.CLICK, traceSomething);
           mc.x = 100;
           mc.y = 100;
           this.addChild(mc);
      }
      
      public function traceSomething(evt:MouseEvent):void {
         trace("HIZO CLICK");
         this.startGame(5);
      }


la cuestion es que cuando lo hago, el flash me tira un error:

escribió:

ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
at flash.display::DisplayObjectContainer/removeChild()
at uielements::Screengame/stopAnimation()
at uielements::Screengame/startGame()
at Controller/startGame()
at Main/traceSomething()


Entonces, mi pregunta (finalment :D) es como puedo hacer para que la clase Controller pueda ejecutar y setear los metodos que se encuntren en Screengame, de forma que pueda utilizarlo para modificar los valores y refrescar la pantalla????


Desde ya muchas gracias.

Saludos

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

chrome
Citar            
MensajeEscrito el 24 Nov 2011 02:19 pm
El problema está en stopAnimation de la clase ScreenGame, no en que lo llame tu botoncito ... allí tienes un removeChild que no le gusta ... ¿está tratando de quitar algún elemento derango superior en el DisplayList?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Nov 2011 03:07 am
Jorge,
Ante todo muchas gracias por tu rápida y como siempre, util respuesta.

Te comento, que estuve debuguenado y hay algo q debo estar haciendo mal, porque no puedo ejecutar o, mejor dicho, no puedo visualizar los cambios como yo quiero.

la idea de la clase Screengame es que cambie entre 2 vistas, en realidad, entre 2 sprites, cada uno de los cuales tiene varias cosas

El screenAnimation es un simple sprite que carga una animacion (mc) que esta en la libreria [ library.IntroAnimation]
El screenGame es otro sprite, pero esto a su vez tiene varias cosas, entre ellas mc, textfields y cosas de ese estilo.

La idea, es que al iniciar, se ejecute startAnimation, y que al hacer click en el botoncito se ejecute startGame. Al mismo tiempo, para q se ejecute el game, se tiene q ejecutar stopAnimation donde se frena la animacion actual y se reemplaza el sprite por el sprite del game por lo q le perita al usario interactuar.

La cosa es q no se porque, pero no nada... o sea, los trace se ejecutan, se ve q entra pero no se ejecuta nada y sigue tirando el error y no se por donde arrancar para mejorar.

Les dejo la clase para ver si hay algo mal:


Código ActionScript :

package uielements 
{
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.geom.Point;
   import flash.text.TextField;
   
   import library.IntroAnimation;
   /**
    * ...
    * @author Perretta Marcelo
    */
   public class Screengame extends Sprite
   {
      private var screenContainer:Sprite = new Sprite();
      private var screenAnimation:Sprite = new Sprite();
      private var screenGame:Sprite = new Sprite();
      
      public var coinsAdded:Coins = new Coins();
      public var coinsTotal:Coins = new Coins();
      
      public var timer:Timegame = new Timegame();
      
      public var player1:Playergame = new Playergame();
      public var player2:Playergame = new Playergame();
      
      public var animation:IntroAnimation = new IntroAnimation();
      
      private var valuesCoins:TextField = new TextField();
      
      public function Screengame() 
      {
         this.addChild(screenContainer);
      }
      
      public function startGame():void {
         this.stopAnimation();
         
         screenGame.addChild(coinsAdded);
         screenGame.addChild(coinsTotal);         
         
         valuesCoins.defaultTextFormat = coinsAdded.textFormatCoin
         valuesCoins.text = coinsAdded.getValueCoins() + " / " + coinsTotal.getValueCoins();
         
         screenGame.addChild(timer);
         
         screenGame.addChild(player1);
         screenGame.addChild(player2);
         
         screenContainer.addChild(screenGame);
      }
      
      public function endGame():void {
         this.removeChild(coinsAdded);
         this.removeChild(coinsTotal);
         
         this.removeChild(timer);
         
         this.removeChild(player1);
         this.removeChild(player2);
         
         this.startAnimation();
      }
      
      public function startAnimation():void {
         animation.gotoAndPlay(1);         
         screenAnimation.addChild(animation);
         screenContainer.addChild(screenAnimation);
      }
      
      public function stopAnimation():void {
         trace("STOP ANIMATION");
         animation.stop();
         screenContainer.removeChild(screenAnimation);
      }
   }

}


Desde ya muchas gracias.
Saludos

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

firefox
Citar            
MensajeEscrito el 25 Nov 2011 02:12 pm
Ok, no se puede remover a si mismo

screenContainer.removeChild(screenAnimation);

Alguien tiene que removerlo. Como idea general, conviene usar un manager de screens (usualmente es una especie de array donde haces push de las distintas pantallas) que es el que se encarga de poner/sacar, no pones la responsabilidad de quitarse a la misma pantalla

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 25 Nov 2011 05:29 pm
Jorge,

Desde ya muchas gracias.
Entiendo lo que me decis, y buscando llegue a esto:
http://www.emanueleferonato.com/2010/04/20/as3-quick-movieclip-manager-class/

sin embargo quería saber si conocias alguna situacion mas simple, dado que solo manejaría 2 vistas y para no hacerlo tan engorroso de agregar clases solo para esto.

Pero desde ya muchas gracias por tu ayuda.

Saludos

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

chrome
Citar            
MensajeEscrito el 25 Nov 2011 06:29 pm
En realidad un screenmanager está mas orientado a manejar varios niveles, es decir a medida que el héroe avanza, va cambiando de pantalla. En tu caso parece que es solo el splash screen y la pantalla principal, con lo cual podrías simplemente usar un document class y user addChild y removeChild a partir de algún evento que genere el screen. De todas formas mi idea va mas bien alrededor de algo así: http://www.filipesilvestrim.com/blog/page/2/ , en donde verás que mas bien se trata de una pila en donde vas poniendo pantallas, el ejemplo de feronato va mas bien en el sentido de manejar MovieClips

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 27 Nov 2011 01:13 am
jorge, como siempre impecable lo tuyo.
Me sirvio mucho el link que me pasaste, sobre todo para entender la idea de como manejar los addChild y removeChild, asi que he creado mi propia clase Screenmanager con los eventos que necesito.

Muchas gracias por tu ayuda.

Saludos

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

chrome

 

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