Comunidad de diseño web y desarrollo en internet online

AS3 - Clase - Variable - Textbox.

Citar            
MensajeEscrito el 27 Mar 2009 03:42 am
Hola buenas noches, resulta que tengo una clase llamada perro y dentro de ella tengo una variable llamada vida, cree un objeto movieclip llamado pluto y le vincule la clase perro, ademas tengo un textbox dinamico llamado textovida.
Quiero que en textovida muestre la variable vida del objeto pluto.
En el primer fotograma de la linea de tiempo puse.

Código :

pluto.vida.toString();
textovida.text = String (pluto.vida)


Creo que tengo un error de concepto... como puedo hacer que muestre la vida de pluto que esta dentro de la clase perro?
Espero me entiendan y muchas gracias por la molestia de haber leido.

Por katze

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Mar 2009 05:27 am
que tal
textovida.text = pluto.vida.toString(); ?
saludos

Por aggust

26 de clabLevel



 

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2009 07:30 am
No, al parecer es como yo puse
textovida.text = String (pluto.vida);

Al final cree un evento en el codigo del primer frame

this.addEventListener(MouseEvent.CLICK, mostrar);

function mostrar(e:MouseEvent):void{
trace(this.vida);
textovida.text = String (pluto.vida);
}

Pero me dice Undefined en el trace, la clase esta como publica, no deberia tomar el valor de la variable de la clase perro y que cuando clikee en el textbox me aparezca la vida del objeto vinculado a la clase?

Por katze

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2009 04:39 pm
Si estás vinculando la clase al MC, olvídate de la línea de tiempo, ahora tienes la clase para moverte.
¿Le estás dando algún valor a vida? Por ejemplo en la clase lo declaras:

private var vida:Number = 5

Luego lo trazas en el constructor:

Código ActionScript :

public function perro(){
   trace("Vida "+vida)
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2009 05:24 pm
el valor de la vida ya esta declarado y claro que me funciona el trace en la clase, pero yo lo que quiero es justamente esto... que calcule en la linea de tiempo, porque he hecho dos mc uno pluto y otro lassie, entonces cuando clikee en cada uno de ellos deberia mostrar en el textbox la vida de cada uno.

Por katze

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Mar 2009 05:55 pm
Agregas esto en el constructor

Código ActionScript :

public function perro(){ 
  this.addEventListener(MouseEvent.CLIK, muestraVidas)
   .....
}
private function muestraVidas(evt:Event):void{
     trace("Vida "+vida)
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 28 Mar 2009 06:50 pm
creo que no se entendio lo que quise decir. :shock:

Tengo esto en mi clase perro.

Código :

package {
 import flash.display.MovieClip;
 import flash.events.MouseEvent;

 public class Perro extends MovieClip{
 var Vida:Number=Math.floor(Math.random()*10)+1;
public function Perro() :void{
   this.buttonMode = true;
    

   this.addEventListener(MouseEvent.MOUSE_DOWN, arrastrar);
   this.addEventListener(MouseEvent.MOUSE_UP, parar);
}
        private function arrastrar(e:MouseEvent):void{
            this.startDrag();
         trace(this.Vida);
        }
       private function parar(e:MouseEvent):void{
            this.stopDrag();
        }
 }
}


A dos mc uno llamado pluto y otro llamado lassie les puse el vinculo de esa clase.
El trace funciona correctamente (si esta dentro de la clase) pero yo quiero que me muestre la vida en un textbox llamado textoVida de cada uno cuando clikeo.
entonces en el primer fotograma escribi esto:

Código :

this.addEventListener(MouseEvent.CLICK, mostrar);

         function mostrar(e:MouseEvent):void{
            
         trace(this.maxVida);
         textovida.text = String(humano.maxVida);
}


El problema es que me dice undefined en el textbox... la razon es porque no le llega el parametro de la vida al textbox.
La pregunta es.. como hago para que la vida de cada perro aparezca en el textbox sin meterle codigo a la clase Perro?

Por katze

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 29 Mar 2009 09:30 am
y claro si maxVida no existe, tu variable se llama Vida...asi seria...

Código :

 this.addEventListener(MouseEvent.CLICK, mostrar);

 function mostrar(e:MouseEvent):void{
            
         trace(this.Vida);
         textovida.text = String(humano.Vida);
}

Por aggust

26 de clabLevel



 

Argentina

firefox
Citar            
MensajeEscrito el 29 Mar 2009 04:03 pm
perdon lo tengo asi en el primer fotograma

Código :

import perro;
this.addEventListener(MouseEvent.CLICK, mostrar);

         function mostrar(e:MouseEvent):void{
            
         trace(this.Vida);
         textovida.text = String(pluto.Vida);
}


pero sigue diciendome undefined.

Por katze

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Mar 2009 11:58 am
Las variables de clase por defecto son privadas, ponla como pública:

public var Vida:Number=Math.floor(Math.random()*10)+1;

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 30 Mar 2009 12:39 pm
:shock: ajlsfjalsjfalñfjaljlñajflqewoiufapfmoeqowhfojasñfjslf
Me quiero morir, perdi todo el finde por culpa de esta tonteria, la verdad lamento mucho haberles hecho ver el codigo para esto.
Muchas gracias por la ayuda

Por katze

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 31 Mar 2009 01:43 am
acabo de llegar a casa y probe el codigo y funcionaaaaaaa espectacular! el problema es...

que solo muestra la vida de pluto :S

Código :

this.addEventListener(MouseEvent.CLICK, mostrar);

         function mostrar(e:MouseEvent):void{
            
         trace(this.Vida);
         textovida.text = String(pluto.Vida);
}


textovida.text = String(this.Vida); no funciona y tampoco funciona textovida.text = String(Perro.Vida); ni textovida.text = String(this.Perro.Vida);

Por katze

23 de clabLevel



 

firefox
Citar            
MensajeEscrito el 31 Mar 2009 11:41 am
¿Donde está puesto ese código? Si es en la línea de tiempo, this.Vida no existe, Perro es el nombre de la clase (no de una instancia) Crea una segunda instancia Lassie y prueba a copiar su vida
Por cierto, ya que te gusta lo de los perros, te vendría muy bien el libro de Moock, que tiene como ejemplo principal .... un zoológico ;) http://www.after-hours.org/foro/viewtopic.php?t=13934

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 Mar 2009 12:37 pm
El codigo esta en el primer frame, y tiene el evento click entonces por eso pense que cuando clickeo lasie o pluto deberia mostrar en el textbox la vida de cada uno. (si clikeo lassie muestra la vida de lassie y si clickeo pluto muestra la vida de pluto) por eso ponia algo como perro.vida o this.vida.
Obviamente si pongo Lassie.vida me muestra la vida de lassie en el textbox pero aunque haga click en el pluto me seguiria mostrando la vida de lassie y no de pluto, se entiende?

Parece un buen libro el de Moock, la verdad es que camino mucho desde mi casa hasta el subte/metro, y de ahi como 12 cuadras/manzanas hasta el trabajo.. despues del trabajo otras 12 cuadras hasta el metro para ir a la universidad para despues de ahi irme a mi casa... si lo consigo en pdf y lo puedo meter en la psp seria ideal, ya que kilo y medio de aca para alla seria una autentica tortura. Asi mismo estoy averiguando si esta en la empresa xD.

Por katze

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 31 Mar 2009 12:57 pm
Si en el frame tienes una instancia de Lassie y una de Pluto, cuando pones esto:

this.addEventListener(xxxxx)

Lo estás agregando al escenario, no a las instancias, es decir this no tiene sentido en el contexto de vida (scope), por eso solo puedes acceder a través del nombre de instancia. En AS3 no puedes poner code asignado a un MC, entonces la forma de asignarse un click a si mismo es a través de la clase (en donde this si tiene sentido) Si quieres hacerlo desde la línea de tiempo, tienes que asignarle un click a cada instancia

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 Mar 2009 01:24 pm
Entonces en la linea de tiempo por cada objeto hay que crear un evento click para que pueda mostrarse en el textbox la vida de cada uno O meter en el codigo de la clase textbox.text= this.vida?
hummmm necesito ese libro del zoologico.

Por katze

23 de clabLevel



 

chrome
Citar            
MensajeEscrito el 31 Mar 2009 01:36 pm
Katze, entiendo que tu caja de texto "textovida" está en la película principal (donde están a su vez "lasie" y "pluto")
Al escribir en la película principal

Código ActionScript :

this.addEventListener(MouseEvent.CLICK, mostrar);
function mostrar(e:MouseEvent):void{
         trace(this.Vida); //<--ESTE se refiere a una variable "Vida" de la película principal
         textovida.text = String(pluto.Vida);  //<--lógicamente muestra la vida de pluto
}

Si lo que quieres es que, al pulsar a "lasie" o a "pluto" te muestre la "vida" deberíamos hacer algo como

Código ActionScript :

pluto.addEventListener(MouseEvent.CLICK, mostrar); //<--el "listener" se lo aplico a "pluto"
lasie.addEventListener(MouseEvent.CLICK, mostrar); //<--OTRO "listener" para "lasie"
function mostrar(e:MouseEvent):void{
         var perro:Perro=Perro(e.target);  //<--usamos e.target para saber a quién se ha pulsado
                                             //le tenemos que hacer una "conversión de cast" para decirle al compilador
                                             //que e.target es de la Clase "Perro"
         trace(perro.Vida); //<--Ahora sí
         textovida.text = String(perro.Vida);
}

Vamos, el único modo de que la función "mostrar" conozca a quién se ha pulsado es a través de alguna propiedad del argumento "e" (que es de la clase MouseEvent)

Si no queremos añadir el listener a los perros podríamos añadirlo, tal y como lo tienes tú, a la película principal. En este caso, debemos
1.-comprobar que se ha clicado a un perro
2.-saber qué perro es

Código ActionScript :

this.addEventListener(MouseEvent.CLICK, mostrar); //<--el "listener" se lo aplico a la película principal
function mostrar(e:MouseEvent):void{
         if (e.target is Perro){  //<--sólo si se ha pulsado a un perro
           var perro:Perro=Perro(e.target);  //<--usamos e.target para saber a quién se ha pulsado
           trace(perro.Vida); //<--Ahora sí
           textovida.text = String(perro.Vida);
         }
}


Existe otro modo de hacerlo y es que sea la propia clase Perro quien se añada el listener y que refleje la vida en una caja de texto sobre la película principal. En ese caso deberíamos modificar el método "arrastrar" de la clase Perro

Código ActionScript :

private function arrastrar(e:MouseEvent):void{
         this.startDrag();
         trace(this.Vida);
         MovieClip(parent).textovida.txt=String(this.Vida)
}

Vamos, nos referimos a la película principal como "parent". Como Flash no sabe si el Padre es un MovieClip o no, debemos (otra vez) hacer una "conversión de cast"

NOTA:Acostumbraté a
1.-Definir las Clases empezando la primera por Mayúscuas. Así es mejor el nombre de clase de "Perro" que el de "perro"
2.-Definir las variables empezando la primera por minúsculas. Así es mejor el nombre de "vida" que de "Vida"
El motivo es simplemente por costumbre, pero facilita mucho a la hora de leer código

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 31 Mar 2009 01:45 pm
Eliseo2 Te AMO! :love:

No sabes lo importante que es para mi esto que has hecho, igualmente para Solis

Esto me ha quedado mucho mas claro y seguramente para otras personas tambien.
Cuando llegue a casa modifico todo y sigo con mi "juego" que aunque parezca muy lejos e imposible poco a poco estoy mas cerca.

Por katze

23 de clabLevel



 

chrome

 

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