Comunidad de diseño web y desarrollo en internet online

Problema con clase y subclase

Citar            
MensajeEscrito el 15 Oct 2018 11:06 am
Muy buenas

Se que lo que voy a pedir será muy evidente para muchos pero aún estoy aprendiendo y un empujón me vendría bien para no frustrarme totalmente :(

Quiero comunicar dos clases, desde la clase principal envio unos datos a la suclase pero me salen un montón de errores y no se que estoy haciendo mal. Gracias!

CLASE PRINCIPAL

Código ActionScript :

package {

   import flash.display.MovieClip;
   import clases.Timerbar;


   public class Main extends MovieClip {


      public function Main() {

         colocarTemp(70, 100, 0, 0);

      }

      private function colocarTemp(tiempo: Number, tamaño: Number, xPos: Number, yPos: Number): void {
         var temp: Timerbar = new Timerbar();
         temp.nCount = tiempo;
         temp.totalBarWidth = tamaño;
         temp.timerxpos = xPos;
         temp.timerypos = yPos;
         addChild(temp);

      }



   }

}


SUBCLASE

Código ActionScript :

package clases {
   import flash.display.MovieClip;
   import flash.events.TimerEvent;
   import fl.transitions.Tween;
   import fl.transitions.easing.None;
   import flash.text.TextField;
   import flash.display.Shape;
   import flash.utils.Timer;


   public class Timerbar extends MovieClip {

      public var nCount;
      public var totalBarWidth;
      public var timerxpos;
      public var timerypos;
      private var myTimer: Timer = new Timer(1000, nCount);
      private var bar: Shape = new Shape();
      private var timtxt: TextField = new TextField();

      public function Timerbar() {

         addChild(timtxt);
         addChild(bar);
         updateBar();
         myTimer.start();
         myTimer.addEventListener(TimerEvent.TIMER, countdown);
         myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, fadeOut);

         function countdown(e: TimerEvent): void {
            nCount--;
            if (nCount == 10) {
               timtxt.textColor = 0xFF0000;
            }
            updateBar(); 
            var segundos = nCount % 60 + "s";

            var minutos = Math.floor(nCount / 60) + "m";
            if (nCount > 59) {
               trad = minutos + " " + segundos;
            }
            if (nCount < 60) {
               var trad = segundos;
            }
            if (nCount == 60) {
               trad = "60" + "s";
            }
            timtxt.text = trad.toString();
         }
         function updateBar(): void {
            bar.graphics.clear();
            bar.graphics.beginFill(nCount > 10 ? 0x00FF00 : 0xFF0000);
            bar.graphics.drawRect(timerxpos, timerypos, totalBarWidth * (nCount / myTimer.repeatCount), 20);
            bar.graphics.endFill();
         }
         function fadeOut(e: TimerEvent): void {
            var t: Tween = new Tween(timtxt, "alpha", None.easeNone, 1, 0, .5, true);
         }
      }

   }

}

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Oct 2018 11:12 am
Creo que está relaccionado con el texto que quiero colocar en escenario, ¿puede ser?

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Oct 2018 11:17 am
[SWF] Pruebas.swf - 5436 bytes tras la descompresión
ArgumentError: Error #2004: One of the parameters is invalid.
at flash.display::Graphics/drawRect()
at Function/clases:Timerbar/$construct/clases:updateBar()[C:\Users\Azureus\Desktop\Pruebas\clases\Timerbar.as:62]
at clases::Timerbar()[C:\Users\Azureus\Desktop\Pruebas\clases\Timerbar.as:26]
at Main/colocarTemp()[C:\Users\Azureus\Desktop\Pruebas\Main.as:17]
at Main()[C:\Users\Azureus\Desktop\Pruebas\Main.as:12]
at runtime::ContentPlayer/loadInitialContent()
at runtime::ContentPlayer/playRawContent()
at runtime::ContentPlayer/playContent()
at runtime::AppRunner/run()
at ADLAppEntry/run()
at global/runtime::ADLEntry()
Prueba de película finalizada.

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Oct 2018 01:07 pm
Hace facil un par de años que no escribo clases de AS3, pero alli vamos. Lo primero olvidaste la llave que cierra el constructor, con lo que todo queda metido en el:

Código ActionScript :

   public function Timerbar() {
     (....)
   }
   function countdown(e: TimerEvent): void {
     (...)
   }
etc ..


Agrega eso y probablemente los errores cambien

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 15 Oct 2018 01:37 pm
Muy buenas Jorge

He cerrado el constructor, se me habia pasado, pero sigue tirando errores...

Por lo que veo el problema está en la barra:

bar.graphics.drawRect(timerxpos, timerypos, totalBarWidth * (nCount / myTimer.repeatCount), 20);

Al eliminarlo no se dibuja la barra pero tira sin ningún error con el timer, ¿me puedes orientar? ¿estoy pasando mal las variables desde la clase principal?

Muchísimas gracias por tu tiempo

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Oct 2018 01:41 pm
Bueno el problema no se, pero al no dibujar el bar no salen errores. La verdad es que me hago un lio con las subclases y pasar variables pero quiero intentarlo ya que desarrollar todo el codigo en el main...

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Oct 2018 02:49 pm
Ok, al cerrar el constructor cambiaron los errores, puedes postearlos ahora ... o son los mismos?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 15 Oct 2018 03:10 pm
Los mismos. Han cambiado los numeros de linea que refieren a TimeBar.as pero porque he quitado algunas lineas vacias

Código ActionScript :

[SWF] Pruebas.swf - 5347 bytes tras la descompresión
ArgumentError: Error #2004: One of the parameters is invalid.
   at flash.display::Graphics/drawRect()
   at clases::Timerbar/updateBar()[C:\Users\Azureus\Desktop\Pruebas\clases\Timerbar.as:57]
   at clases::Timerbar()[C:\Users\Azureus\Desktop\Pruebas\clases\Timerbar.as:25]
   at Main/colocarTemp()[C:\Users\Azureus\Desktop\Pruebas\Main.as:17]
   at Main()[C:\Users\Azureus\Desktop\Pruebas\Main.as:12]
   at runtime::ContentPlayer/loadInitialContent()
   at runtime::ContentPlayer/playRawContent()
   at runtime::ContentPlayer/playContent()
   at runtime::AppRunner/run()
   at ADLAppEntry/run()
   at global/runtime::ADLEntry()
[UnloadSWF] Pruebas.swf
Prueba de película finalizada.


MAIN

Código ActionScript :

package {

   import flash.display.MovieClip;
   import clases.Timerbar;


   public class Main extends MovieClip {


      public function Main() {

         colocarTemp(80, 480, 0, 0);

      }

      private function colocarTemp(tiempo: Number, tamaño: Number, xPos: Number, yPos: Number): void {
         var temp: Timerbar = new Timerbar();
         temp.nCount = tiempo;
         temp.totalBarWidth = tamaño;
         temp.timerxpos = xPos;
         temp.timerypos = yPos;
         addChild(temp);

      }



   }

}


TIMERBAR

Código ActionScript :

package clases {
   import flash.display.MovieClip;
   import flash.events.TimerEvent;
   import fl.transitions.Tween;
   import fl.transitions.easing.None;
   import flash.text.TextField;
   import flash.display.Shape;
   import flash.utils.Timer;


   public class Timerbar extends MovieClip {

      public var nCount;
      public var totalBarWidth;
      public var timerxpos;
      public var timerypos;
      private var myTimer: Timer = new Timer(1000, nCount);
      private var bar: Shape = new Shape();
      private var timtxt: TextField = new TextField();

      public function Timerbar() {

         addChild(timtxt);
         addChild(bar);
         updateBar();
         myTimer.start();
         myTimer.addEventListener(TimerEvent.TIMER, countdown);
         myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, fadeOut);
      }

      function countdown(e: TimerEvent): void {
         nCount--;
         if (nCount == 10) {
            timtxt.textColor = 0xFF0000;
         }
         updateBar();
         
         var segundos = nCount % 60 + "s";
            var minutos = Math.floor(nCount / 60) + "m";
         if (nCount > 59) {
            trad = minutos + " " + segundos;
         }
         if (nCount < 60) {
            var trad = segundos;
         }
         if (nCount == 60) {
            trad = "60" + "s";
         }


         timtxt.text = trad.toString();
      }

      function updateBar(): void {
         bar.graphics.clear();
         bar.graphics.beginFill(nCount > 10 ? 0x00FF00 : 0xFF0000);
         bar.graphics.drawRect(timerxpos, timerypos, totalBarWidth * (nCount / myTimer.repeatCount), 20);
         bar.graphics.endFill();
      }

      function fadeOut(e: TimerEvent): void {
         var t: Tween = new Tween(timtxt, "alpha", None.easeNone, 1, 0, .5, true);
      }


   }

}

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Oct 2018 07:50 pm
En principio el error es bastante simple: ejecutas updateBar antes que countdown, con lo cual en la linea 57 no tienes casi ninguna variable inicializada

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 15 Oct 2018 09:43 pm
Cierto, lo que pasa es que si no hago la llamada a updateBar desde el constructor entonces no funciona correctamente la barra que está dentro esa función..

bar.graphics.drawRect(timerxpos, timerypos, totalBarWidth * (nCount / myTimer.repeatCount), 20);

Exactamente: myTimer.repeatCount

Todo el codigo me funcionaba bien desde la clase principal, no entiendo la diferencia al pasarlo a una subclase para que deje de funcionar.

Muchas gracias por todo Jorge, me has ayudado mucho. No te quito mas tiempo, un placer.

Por Arthur Drake

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Oct 2018 12:15 pm
Hacer subclases implica planificar dependencias y aislar funcionalidad, y en el caso de AS a diferencia de otros lenguajes, hay que tener en cuenta el DisplayList.
En fin, suerte con eso

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Nov 2019 02:55 am

Arthur Drake escribió:

Muy buenas

Se que lo que voy a pedir será muy evidente para muchos pero aún estoy aprendiendo y un empujón me vendría bien para no frustrarme totalmente :(

Quiero comunicar dos clases, desde la clase principal envio unos datos a la suclase pero me salen un montón de errores y no se que estoy haciendo mal. Gracias!

CLASE PRINCIPAL

Código ActionScript :

package {

   import flash.display.MovieClip;
   import clases.Timerbar;


   public class Main extends MovieClip {


      public function Main() {

         colocarTemp(70, 100, 0, 0);

      }

      private function colocarTemp(tiempo: Number, tamaño: Number, xPos: Number, yPos: Number): void {
         var temp: Timerbar = new Timerbar();
         temp.nCount = tiempo;
         temp.totalBarWidth = tamaño;
         temp.timerxpos = xPos;
         temp.timerypos = yPos;
         addChild(temp);

      }



   }

}


SUBCLASE

Código ActionScript :

package clases {
   import flash [url=https://onlinesbi.tips/][color=#000000]Onlinesbi[/color][/url] [url=https://sudoku.kim/ ][color=#000000]sudoku[/color][/url] [url=https://taxwow.in/incometaxindiaefiling/][color=#000000]incometaxindiaefiling[/color][/url] .display.MovieClip;
   import flash.events.TimerEvent;
   import fl.transitions.Tween;
   import fl.transitions.easing.None;
   import flash.text.TextField;
   import flash.display.Shape;
   import flash.utils.Timer;


   public class Timerbar extends MovieClip {

      public var nCount;
      public var totalBarWidth;
      public var timerxpos;
      public var timerypos;
      private var myTimer: Timer = new Timer(1000, nCount);
      private var bar: Shape = new Shape();
      private var timtxt: TextField = new TextField();

      public function Timerbar() {

         addChild(timtxt);
         addChild(bar);
         updateBar();
         myTimer.start();
         myTimer.addEventListener(TimerEvent.TIMER, countdown);
         myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, fadeOut);

         function countdown(e: TimerEvent): void {
            nCount--;
            if (nCount == 10) {
               timtxt.textColor = 0xFF0000;
            }
            updateBar(); 
            var segundos = nCount % 60 + "s";

            var minutos = Math.floor(nCount / 60) + "m";
            if (nCount > 59) {
               trad = minutos + " " + segundos;
            }
            if (nCount < 60) {
               var trad = segundos;
            }
            if (nCount == 60) {
               trad = "60" + "s";
            }
            timtxt.text = trad.toString();
         }
         function updateBar(): void {
            bar.graphics.clear();
            bar.graphics.beginFill(nCount > 10 ? 0x00FF00 : 0xFF0000);
            bar.graphics .drawRect(timerxpos, timerypos, totalBarWidth * (nCount / myTimer.repeatCount), 20);
            bar.graphics.endFill();
         }
         function fadeOut(e: TimerEvent): void {
            var t: Tween = new Tween(timtxt, "alpha", None.easeNone, 1, 0, .5, true);
         }
      }

   }
 
}
y en el caso de AS a diferencia de otros lenguajes, hay que tener en cuenta el DisplayList.

Por tayeadil

6 de clabLevel



 

chrome

 

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