Comunidad de diseño web y desarrollo en internet online

¿Por qué aparece la palabra MovieClip y no el nombre de los clips?

Citar            
MensajeEscrito el 19 Feb 2013 02:37 pm
Hola.
Mi pregunta es ¿por qué aparece en la función del código que les presento la palabra MovieClip y no lo que personalmente considero que debería aparecer (el nombre de los objetos que hay que pulsar) en la función que se crea para el addEventListener de cada clip?

No entiendo esto y me gustaría saber por qué

Gracias.

El código:
var circulo1:Circulo = new Circulo();
var circulo2:Circulo = new Circulo();
var circulo3:Circulo = new Circulo();
circulo1.x = 250;
circulo1.y = 175;
circulo2.x = 300;
circulo2.y = 175;
circulo3.x = 275;
circulo3.y = 225;
addChild(circulo1);
addChild(circulo2);
addChild(circulo3);
circulo1.addEventListener(MouseEvent.CLICK, pulsarCirculo);
circulo2.addEventListener(MouseEvent.CLICK, pulsarCirculo);
circulo3.addEventListener(MouseEvent.CLICK, pulsarCirculo);

function pulsarCirculo(event:MouseEvent) {
setChildIndex(MovieClip(event.currentTarget),numChildren-1);
}

Por estudiantedeflash

73 de clabLevel



 

msie8
Citar            
MensajeEscrito el 19 Feb 2013 03:13 pm
si lo que quieres es poner sobre todos los demás el objeto que has cliclado basta con :

addChild( event.currentTarget as MovieClip );

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Feb 2013 03:53 pm
Disculpame Lukanicos, pero creo que eso no contesta a la pregunta.

Quizá no me haya expresado bien.

Sigo con el mismo ejemplo:

al haber 3 circulos sobre los cuales pulsar para que se pongan uno encima del otro, según qué circulo pulsas ¿por qué aparece la palabra movieclip en lugar del nombre de cada uno de los 3 circulos a pulsar?

Gracias por tú tiempo, Lukanicos.
Si por cualquier motivo sigo sin expresarme adecuadamente, hazme saber qué es lo que no entiendes y trataré de expresarme mejor.

Muchas gracias.

Por estudiantedeflash

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Feb 2013 04:27 pm
BuenAS:

Sigo sin entenderte, por lo que disparo al azar, a ver si doy en la diana ;)

Por un lado, circulo1, circulo2 y circulo3 NO son los nombre de las instancias. Deberías hacer algo como

circulo1.name = "circulo1"; //repitelo para los otros circulos

Ahora, si en el listener haces:

trace(event.currentTarget.name);

debes obtener el nombre del círculo que has pulsado. Por defecto, Flash da nombres aleatorios a las distintas instancias (si no das nombres antes, obtendrías valores del tipo instance1, instance32, instance23)

Y podría ser más práctico que dijeras qué buscas conseguir con esto.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Feb 2013 04:52 pm
...esto... pudiera ser que te refieres a porqué hay que hacer

MovieClip(event.currentTarget).name;
(event.currentTarget as MovieClip).name;

los dos son equivalentes, aunque en el segundo caso no se hace conversión.

Esto se hace para que el compilador sepa de qué tipo es el objeto (en este caso currentTarget). A esto se le suele llamar "hacer un cast".

Y esto hay que hacerlo con el tipo del objeto que tenemos entre manos: de qué clase es el objeto
y NO con el nombre. En programación esto es equivalente a referirte a tí como a un ser humano, y no por tu nombre.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Feb 2013 08:51 pm
Lukanicos, te explico desde el principio a ver si así me entiendes y me puedes resolver la pregunta:

var circulo1:Circulo = new Circulo();
var circulo2:Circulo = new Circulo();
var circulo3:Circulo = new Circulo();
circulo1.x = 250;
circulo1.y = 175;
circulo2.x = 300;
circulo2.y = 175;
circulo3.x = 275;
circulo3.y = 225;
addChild(circulo1);
addChild(circulo2);
addChild(circulo3);
circulo1.addEventListener(MouseEvent.CLICK, pulsarCirculo);
circulo2.addEventListener(MouseEvent.CLICK, pulsarCirculo);
circulo3.addEventListener(MouseEvent.CLICK, pulsarCirculo);

function pulsarCirculo(event:MouseEvent) {
setChildIndex(MovieClip(event.currentTarget),numChildren-1);
}

Te comento:

este código está creado para poder mover los círculos a diferente profundidad, cuando se clicka sobre ellos.

Los círculos son instancias de la clase círculo que se ha creado.

Entonces, lo que no entiendo es por qué en la función pulsarCirculo aparece entre paréntesis la palabra MovieClip.

Es decir: setChildIndex(MovieClip(event.currentTarget), numChildren-1);

¿Me entiendes mejor ahora?

Por estudiantedeflash

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Feb 2013 09:56 pm
BuenAS:

Es necesario hacer eso por lo que te comentaba antes, hay que decirle al compilador que event.currentTarget es un MovieClip. De hecho bastaría decirle que es un DisplayObject, ya que es lo que espera el método setChildIndex que le pases como primer parámetro, y un MovieClip hereda de DisplayObject. Por tanto podrías poner tanto MovieClip como DisplayObject.

Y esto se hace porque ActionScript es un lenguaje tipificado, o sea los objetos son de un determinado tipo (Sprite, MovieClip, DisplayObject...) y a los métodos se le han de pasar valores de determinado tipo. Esto sirve, lo de tipificar, para evitar errores en tiempo de compilación; o sea, que llames a un método que espera un MovieClip pasándole, por ejemplo, un número.

Por tanto, si setChildIndex espera como primer argumento un DisplayObject (como dije antes MovieClip hereda de DisplayObject, y puedes utilizarlo en su lugar) y como segundo un número, tienes que asegurarte de que le estás pasando eso. Y como event.currentTarget es un objeto genérico debes tipificarlo; o sea, decirle al compilador que 'dentro de event.currentTarget va realmente un DisplayObject.

Poniendo un símil real, es algo parecido a un portero de discoteca: debe asegurarse de que todos los que entren tengan más de 18 años (nuestro DisplayObject) independientemente de cómo se llamen, por eso pide el carné y no deja entrar al que no cumple con este requisito. No sé si me explico o lo he liado aún más.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Feb 2013 10:03 pm
...de hecho, y aunque no lo he comprobado, si no lo tipificas, el compilador te dará un error indicando que el primer parámetro del método setChildIndex es un objeto y debe ser un DisplayObject.

Por otro lado, no se si ya conoces el significado de la herencia en programación orientada a objetos (ActionScript es un lenguaje de POO): si la clase MovieClip hereda de DisplayObject, en cualquier lugar donde sea necesario un DisplayObject puedes utilizar un MovieClip, ya que un MovieClip A TODOS LOS EFECTOS es un DisplayObject (cuidado que lo contrario NO ES CIERTO,).

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 19 Feb 2013 10:23 pm
O sea, que hay que indicarle que es un Objeto Moviclip para que funcione adecuadamente?

Y no puede ser otro objeto que no sea movieclip ¿esto es así?

Gracias lukanicos.

Entiendo el esfuerzo enorme que te supone una pregunta como la que hice anteriormente.
Soy una persona que necesita entender las cosas.

Te pido disculpas si en algún momento te molestó la pregunta.

Gracias de nuevo.

Por estudiantedeflash

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Feb 2013 08:22 am
BuenAS:

Te paso un enlace a la API de ActionScript MovieClip

Verás que en la tercera línea habla de la Herencia y muestra una cadena: MovieClip - Sprite - ... - DisplayObject

Esto quiere decir que, como hereda de estas clases, MovieClip ES un Sprite, ... , DisplayObject a TODOS LOS EFECTOS. O sea, si un método, como es el que hablas setChildIndex, espera que le pases un DisplayObject podráis pasarle (como haces en este caso) un MovieClip, ya que, como digo, un MovieClip ES un DisplayObject.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Feb 2013 10:26 am
¿Qué tal Lukanicos? :D

En primer lugar, no sé cómo agradecerte mejor el interés que te has tomado para que pudiera entender este tema más a fondo. Muchas gracias.

En segundo lugar, te quería hacer una pregunta acerca de cómo profundizar más sobre lo que hay dando vueltas por internet acerca de as3 y creo que en esta última respuesta está la contestación, con lo cual te estoy doblemente agradecido.

No obstante, como quiera que buscando en internet la posibilidad de poder profundizar más, me encontré en un foro un planteamiento que me hizo preguntarme acerca de la profundización en el conocimiento de as3.

El tema se planteaba desde el punto de vista de que únicamente se puede aprender de verdad acudiendo a la formación que da la universidad, como solución a muchos problemas que, normalmente (al menos yo no he encontrado cómo profundizar más) no se encuentran en internet.

Como me he propuesto formarme a fondo con as3, la pregunta es:
Aparte de los manuales de adobe sobre as3 (me refiero a los manuales de referencia y formación), o los libros de O'reilly ¿hay algo más que permita profundizar en este tema de as3?

Gracias por anticipado. Y muy agradecido por tu interés.

:)

Por estudiantedeflash

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Feb 2013 10:48 am
BuenAS:

El libro clave para ActionScript 3 es el famoso Essential ActionScript 3.0, que, si puedes, leelo en inglés (la traducción, como en muchos libros técnicos, no es muy buena).

Encontrarás una introducción a la POO, las clases, interfaces, herencia, etc, y un capítulo dedicado a cada tema importante: trabajar con textos, imágenes, cargar assets, seguridad, trabajar con xml's, etc.

Otra cosa que te recomendaría es que también empezaras a utilizar algún framework MVC como Robotlegs -este es muy fácil de utilizar y la curva de aprendizaje es muy buena-, que puedes utilizar indistintamente para proyectos Flex o ActionScript, tiene inyección de dependencias e inversión de control; PureMVC, similar a Robotlegs, pero sin inyección de dependencias ni inversión de control, hay que escribir bastante más codigo; Parsley -es más potente, pero su curva de aprendizaje es más acentuada, y tienes versiones para Flex y ActionScript puro-.

Estos frameworks te permiten hacer aplicaciones bastante ordenadas y estructuradas ya que aplican el patron MVC (Modelo, Vista, Controlador).

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 20 Feb 2013 07:25 pm
Otra vez con las preguntitas Lukanicos.

¿Qué significa inversión de control e inyección de dependencias?

En cuanto al Essential Actionscript 3.0 lo tengo en español. También le eché un vistazo al inglés pero no había manera de pillarlo.

Gracias, una vez más.
:)

Por estudiantedeflash

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Feb 2013 07:25 am
BuenAS:

Lo primero, por si hago referencia, las 'vistas' son las partes visuales de tu aplicación: los botones de un menú, una galería de imágenes, los botones de un reproductor de vídeo, la pantalla del reproductor...

La inyección de dependencias es lo que se hace cuando se pasan datos a una determinada clase, por ejemplo:

Código ActionScript :

var objeto:MiClase = new MiClase();

var instancia:MiClaseConInyeccion = new MiClaseConInyeccion(objeto); 


Cuando hemos instanciado MiClaseConInyeccion le hemos pasado una referencia de objeto. Esto es a lo que se llama inyección de dependencias.

Un Framework como Robotlegs se encarga de realizar esta inyección de dependencias. No tienes que pasar datos a la clase en el constructor cuando la instancias. En Robotlegs verás código como este:

Código ActionScript :

[Inyect]
public var dato:ITipoDato;

Si quieres que una clase reciba el dato de tipo ITipoDato, basta con que le añadas ese código y el framework se encarga.

La inversión de control (IoC) consiste en que es el framework el que comunica las vistas; o sea en un proyecto que utilice Robotlegs (o Parsley) tus vistas NO CONOCEN el resto de vistas. Esto, Robotlegs lo soluciona con los mediadores: cada vista tiene asociado un mediador que se encarga de escuchar los eventos que distribuye la vista e informar al resto de actores de tu aplicación (modelo, otras vistas).

Con un framework con inyección de dependencias e IoC consigues fácilmente crear aplicaciones 'desacopladas': que una vista no conozca al resto de vistas. Esto ¿qué ventajas tiene? pues que puedes modificar una determinada vista sin que afecte al resto, o puedes reutilizarla en una aplicación totalmente distinta.

Si miras aquí mismo, en Cristalab, verás muchísimas preguntas sobre el tema de cómo comunicar clases. Esto te lo soluciona de forma casi mágica ;)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 21 Feb 2013 07:28 am

Código ActionScript :

[Inject]
public var dato:ITipoDato;

... perdón, quería haber puesto Inject en lugar de Inyect O:)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 21 Feb 2013 09:49 am
No lo entiendo, la verdad. Pero no te preocupes Lukanicos. Porque sé que es cosa de que por mi parte profundice más para comprender mejor lo que me dices.

Muchas gracias Lukanicos.

:)

Por estudiantedeflash

73 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Feb 2013 10:20 am
BuenAS:

Aquí tienes un ejemplo en GitHub de utilización de Robotlegs HelloWorld. Te puedes bajar el código y verlo tranquilamente en casa.

Si miras la clase ReadoutMediator

Código ActionScript :

package org.robotlegs.demos.helloflash.view
{
   import org.robotlegs.demos.helloflash.controller.HelloFlashEvent;
   import org.robotlegs.demos.helloflash.model.StatsModel;
   import org.robotlegs.mvcs.Mediator;

   public class ReadoutMediator extends Mediator
   {
      [Inject]
      public var view:Readout;

      [Inject]
      public var statsModel:StatsModel;

      public function ReadoutMediator()
      {
         // Avoid doing work in your constructors!
         // Mediators are only ready to be used when onRegister gets called
      }

      override public function onRegister():void
      {
         // Listen to the context
         eventMap.mapListener(eventDispatcher, HelloFlashEvent.BALL_CLICKED, onBallClicked);
      }

      protected function onBallClicked(e:HelloFlashEvent):void
      {
         // Manipulate the view
         view.setText('Click count: ' + statsModel.ballClickCount);
      }
   }
}


Verás que el framework inyecta los metadatos, view y statModel colocando [Inject] delante de las variables.

Esta clase es el mediador de la vista (la clase) Readout

Que el framework se ocupe de la inyección de dependencias y IoC, hace que tus vistas, en este caso Readout, NO CONOZCAN NADA del resto de la aplicación. Esta clase no sabe quién le dice que muestre un texto, no sabe que utilizas la clase modelo StatsModel en la applicacion, etc. No sabe NADA, pero sin embargo funciona. Esta es la ventaja de estos frameworks.

Que no te despiste la simplicidad de este ejemplo, es un simple HelloWorl. Este concepto es válido en aplicaciones tremendamente complejas con decenas de vistas interactuando entre sí, Y SIN ENTERARSE la una de la existencia de las otras.

Un saludo, y espero no liar mucho el tema, de verdad, este tipo de frameworks te facilitan muchisimo la labor de programar.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 21 Feb 2013 12:10 pm
Te estoy muy agradecido en el interés que tienes porque pueda comprender tus palabras. Lo iré viendo de a poco.

:) :D

Muchas gracias, Lukanicos.

Por estudiantedeflash

73 de clabLevel



 

firefox

 

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