“Clases” de AS3, Profesor: Zguillez

Posted on Friday 1 February 2008

Zguillez avatarEsta tarde estaba mirando una página web que hablaba de Flash, ahí andaba yo mirando las cosas c00l que hace la gente con las clases Bitmap y BitmapData. Como acostumbra a pasar, pues no lo pillo todo, así que pregunté a Zguillez, el gran evangelizador de AS3.

Inicialmente la cosa era una duda puntual, pero para suerte mía terminamos haciendo Zip un ejemplo práctico y todo. Vamos que me hizo una "Clase" particular (sí, hay un estúpido doble sentido :P )

Para mi fue muy útil, tanto que les voy a poner la conversación íntegra (manteniendo las erratas y todo)


Zguillez is online.
Bleend: Zeta

Zguillez:tell me

Bleend: oye una pregunta
en este código:

Actionscript:
  1. import flash.display.BitmapData;
  2. import flash.display.Bitmap;
  3. var bmpData:BitmapData = new BitmapData(100, 100, false, 0xFF0000FF);
  4. var bmp:Bitmap = new Bitmap(bmpData);
  5. addChild(bmp);

el addChild porque lo usa?
es decir, se que lo que hace es algo parecido al attach movie
pero eso no lo define en la penúltima lenea?
*linea

Zguillez: para añadir el objeto bitmap al lista de visualización
var bmp:Bitmap = new Bitmap(bmpData);

eso

Zguillez: esto crea el objeto
addChild(bmp);
esto hace que se visualice

Bleend: ah
es decir, new Bitmap(bmpData);
lo que va entre parentesis solo dice como debe ser el objeto, no que lo muestre
ok

Zguillez: new loquesea() crea un objeto

Bleend:

Zguillez: si no lo addChileas no estas creando su instancia visual

Bleend: ¿Y si pones algo entre los p'aréntesis al crearlo?

Zguillez: no
siempre que crees un objeto que sea visual (movieclip, sprite,scape) has de hacer un addchild

Bleend: sí, ok

Zguillez: es la orden que dice que estas añadiendo una instancia de ese objeto a la pelicula

Bleend: eso lo muestra en pantalla?

Zguillez: si no, lo mantienes en memoria pero no lo visualizas
puedes hacer varios addchilds de un mismo objeto

Bleend: ¿es el attachMovie de AS3?

Zguillez: no exactamente, pero algo parecido

Bleend: ok, eso tenía entendido

Zguillez: attachMovie era para añadir de la libreria
addchild es para visualizar cualquier objeto
lo usaras siempre que quieras visualizar algo

Bleend: lo que no acabo de entender es que cuando haces new llloquesea(), pero pones alguna cosa dentro los paréntesis, como el caso este:

var bmp:Bitmap = new Bitmap(bmpData);

Que hace eso...?

Zguillez: te genera un objeto bitmap con los datos de bmpdata

Bleend: y el bitmapdata es algo como el "alma" del bitmap?
lo que dice como es?

Zguillez: el bmpData?

Bleend:

Zguillez: esos son los parametros que le pasas al constructor de la clase bitmap

Bleend: mm eso último ya es demasiado para mí ..

Zguillez: juas!
a ver...

Bleend: demasiadas palabras raras por centímetro XD

Zguillez: tienes la clase BitmapData ();

Bleend: solo me viene a la cabeza un montón de código

Zguillez: mm recapitulemos... U_U
tu quieres generar un bitmap
para eso creas un objeto de la clase Bitmap()

Bleend: ahá
eso sí está claro

Zguillez: para eso en el constructor del objeto Bitmap le has de pasar un BitmapData, que son los datos que contiene el bitmap

Bleend: el constructor es cuando haces eso de var algo:Bitmap = new Bitmap(); ?

Zguillez: ese bitmapdata podria ser una imagen .jpg que tuvieses en la libreria o la cargases externa
si el constructor el el new loquesea()

Bleend: okkk!
una clase, en resumen es algo que define una serie de funciones y propiedades de un objeto. ¿eso es correcto?

Zguillez: si
te ganaste un caramelo...

Bleend: vale, vamos entendiendolo..
*se emociona

Zguillez: entonces...
si queires generar un bitmap desde cero
entonces has de crear un bitmapdata tambien desde cero
para pasarselo al objeto bitmap
ok?
para eso está la clase BitamapData()

Bleend: pero cuando creas un MC no tienes que crear nada de MCData..
:S

Zguillez: claro que no.. ¬_¬

Bleend: eso es lo que me resulta extraño
que para crear algo, antes tengas que crear otra cosa
por eso ter digo, que el BitmapData, lo veo como el "alma" del bitmap
*te

Zguillez: has de mirarlo como si el bitmap es la imagen jpg, y el bitmapdata su información en pixeles

Bleend: ahá
ok, ese es un ejemplo muy bueno
nunca he usado clases, por eso pregunto, es que veo que todo dios usa clases...
y eso del bitmap lo veo como lo mas c00l de flash :P

Zguillez: si, el bitmap de as3 da bastante juego

Bleend: Tese da fe de ello

Zguillez: total...

Bleend: *Teseo

Zguillez: que creas un bitmapdata con el que creas un bitmap

Bleend: ahá

Zguillez: y para visualizarlo lo añades con un addchild
y listo ^^

Bleend: ese addChild donde lo añade
?
al _root?

Zguillez: lo añade a la ruta que tu le estes indicando

Bleend: en ese código es el root entonces
ok
Pues muchas gracias
igual pongo esto en el blog... mira que te digo
me resultó muy útil
^^

Zguillez: juas
haz experimentos con el bitmapdata y la imagen de tu loro, a ver que sale

Bleend: seguro hay muchos mas que andan tan perdidos como yo..
XD veremos , no se que funciones tiene
loro.DesintegrarEnMillonesDeParticulasYSalirVolando =true ;

Zguillez: XDD
si consigues esa funcion posteala como tip ;)

Bleend: dios
XD
lo posteo como un dios XD
si consigo eso..
XD

Zguillez: XD
pues manos a la obra

Bleend: http://llops.com/lab/luz/
eso es bitmap, no?

Zguillez: mmm pues no se
puede que sea una mexcla
*mezcla
el fondo si

Bleend: mmm
ni idea, pero está c00l

Zguillez: los puntos de luz parecen clips..

Bleend: pero como los maneja a todos a la vez?
desde AS3 no se le puede poner código individual a un MC..

Zguillez: errr?
a que te refieres?

Bleend: en as2
puedes poner código en los frames
o en elos mimos MC
*mismos
es decir:

Actionscript:
  1. cosa.onPress=function () {
  2. //asdads
  3. }

(en los frames)

Zguillez: aha

Bleend: o bien:

Actionscript:
  1. on(press) {
  2. //asdf
  3. }

en el MC

Zguillez: y?

Bleend: bueno, pues que si creas un MC que tenga una funcion de que se vaya moviendo hacia el centro del mapa y luego desaparezca pues bien, se puede lograr algo así
pero si lo tienes que controlar desde los frames es ... imposible?
no se si me explico...
un seg

Zguillez: errr imposible? *patea al loro hasta el infinito

Bleend: XDDDDDDDDDDDDDDDD

Zguillez: es mucho mas facil
tu tendrás una clase "estrella" (por ejemplo)

Bleend: clases...

Zguillez: que generará un circulito blanco

Bleend: debe ser eso..

Zguillez: bueno, clases o sin clases tambien puedes hacerlo... ¬_¬
te creas una funcion que mueva un objeto desde la posición actual hasta el centro
y esa funcion se la aplicas a todos los clips de estrellas que tengas en el lienzo
y listo
pero si lo haces con clases, esa funcion seria una funcion interna de la clase

Bleend: lo que no se es como aplicarlo a todos
si teines 300 mc?
haces 300 veces es función aplicada a cada MC?

Zguillez: una funcion con un for()
pero por eso es mejor opcion trabajar con clases y objetos
en ese caso la accion de moverse hasta el centro es un comportamiento del objeto
con lo que lo unico que has de hacer es crear instancias de ese objeto sobre el escenario

Bleend: eso es lo que te decía con lo de poner el código de forma individual a cada MC

Zguillez: y autometicamente se dirigiran al centro

Bleend: exacto
esa es la idea
así es realmente sencillo
la cosa es esa, que no se como definir el código a cada MC en particular
Con clases...
ahí está la cosa

Zguillez: y te gustaria saberlo?
es eso?
te sientes muy freak si no?

Bleend: claro, pero eso es bastante complicado
wtf?
XD
es sería un ejemplo clarísimo del uso de una clase para mí
pero...

Zguillez: a ver, dame unos minutos

Bleend: es laaargo
no quiero robarte tu tiempo, si andas ocupado haz lo que tengas que hacer eh?

Sent at 12:36 AM on Saturday
Zguillez: listo ^^

Bleend: a mi no me sale

Actionscript:
  1. this.onEnterFrame=function(){
  2. duplicateMovieClip(_parent,i,this.getNextHighestDepth());
  3. i._x=Math.round(Math.random()*400)
  4. i._y=Math.round(Math.random()*400)
  5. i++;
  6. }

para poner mc aleatoriamente por el mapa no es correcto?
Este código apesta de cojones, ni lo miren

Zguillez: T_T

Bleend: *stage
(es AS2)

Zguillez: *pats

Bleend: mierda
_parent???!
es mc
XD

Aquí empieza lo bueno
Zguillez: a ver....
nueva pelicula de AS3
genera un movieclip que sea una bolita de color

Bleend: ya

Zguillez: en propiedades de exportacion dale a exportar para AS
en nombre de clase dale "Bola_Mc"
por ejemplo..
ok?

Bleend: me dijo que no podia encontrar la clase en el classpath
que haria una automaticamente

Zguillez: ein?
donde pone "Clase:" escribe el nombre

Bleend: no, que dice que la Clase "Bola_Mc" no existe
(lo cual es logico)

Zguillez: donde pone "Clase base:" deja flash.display.MovieClip

Bleend: ya está hecho
sí eso lo dejé
ya esta

Zguillez: entonces donde te da error?

Bleend: un seg
pero no e sun error
es solo un aviso

Zguillez: okk sigamos U_U
ahora te creas una nuevo archivo de clase

Bleend: ok

AVISO

Zguillez: ok ese aviso no es nada...

Bleend: ActionScript file, no?

Zguillez: sip

Bleend: ya

Zguillez: copy and paste:

Actionscript:
  1. package
  2. {
  3. import flash.display.MovieClip;
  4. import flash.utils.Timer;
  5. import flash.events.TimerEvent;
  6. public class Bola extends MovieClip
  7. {
  8. private var _clip:MovieClip;
  9. private var _timer:Timer;
  10. //
  11. public function Bola(qX:int,qY:int)
  12. {
  13. // Bola_Mc es un grafico de la libreria
  14. _clip = new Bola_Mc();
  15. _clip.x = qX
  16. _clip.y = qY
  17. addChild(_clip);
  18. //
  19. _timer = new Timer(10);
  20. _timer.addEventListener("timer", movimiento);
  21. _timer.start();
  22. }
  23. public function movimiento(e:TimerEvent):void
  24. {
  25. _clip.x -= 1;
  26. _clip.y -= 1;
  27. }
  28. }
  29. }

listo?

Bleend: aha

Zguillez: esta clase crea un objeto "Bola"
que lo que hace es colocar una instancia de la clase "Bola_Mc", que es el clip de la libreria
ok?
por eso hace _clip = new Bola_Mc();
addChild(_clip);
ok?

Bleend: con "colocar una instancia" te refieres a meterlo en el stage, no?

Zguillez: no
ese addChild no o coloca en el stage
lo coloca dentro de la clase Bola
osea colocas Bola_Mc dentro de Bola
pero en el stage no vas a visualizar nada

Bleend: ok

Zguillez: cuando visualices Bola en el stage visualizaras Bola_Mc
comprendes?

Bleend: Bola es un MC
al cual le metemos el MC bola_Mc dentro?
no?

Zguillez: si

Bleend: ok

Zguillez: si te fijas Bola tambien genera un timer
que cada 10 milisegundos ejecuta una funcion interna
como si fuese un enterframe

Bleend: ok

Zguillez: cada 10 milisegundos cambia la x y del clip

Bleend: sí, ya veo

Zguillez: esta función habria que trabajarla más
osea que calculase la posición actual y buscase un punto central concreto...
pero para no liarla de momento es un simple -= 1

Bleend: ponle esto en la funcion moviemiento:
a=200- _clip._x;
b =200- _clip._y;
_clip._x+=a/10;
_clip._y+=b/10;
_clip._alpha-=5;
y aya está

Zguillez: ok lo que sea

Bleend: lo que no se es si hay que definir las variables a y b
y puse 200 como la mitad del stage, pero igual cambia (stage._width/2) ?

Zguillez: de momento dejalo tal cual... que aun te liarás ¬_¬
sigamos U_U

Bleend: ok

Zguillez: ahora en el frame de la pelicula pon:

Actionscript:
  1. import Bola
  2. var bola1:Bola = new Bola(400,300);
  3. var bola2:Bola = new Bola(450,350);
  4. var bola3:Bola = new Bola(500,300);
  5. var bola4:Bola = new Bola(550,350);
  6. addChild(bola1);
  7. addChild(bola2);
  8. addChild(bola3);
  9. addChild(bola4);

Bleend: espera

Zguillez: esto te genera 4 bolitas que se posicionan en las coordenadas indicadas y se mueven -= 1

Bleend: al fichero *.as le pongo el nombre de Bola.as ?

Zguillez: si claro

Bleend: ok
es que tenía otro :P

Zguillez: y lo guardas junto al .fla

Bleend: sí, si
funciona c00l

Zguillez: pues ya lo tienes
ahora solo tendrias que crear una funcion que generase "Bolas"
y las posicionase aleatoriamente en los margenes de la pelicula

Bleend: con eso estaba intentando hacer con el AS2
pero no lo logré
XD
:ownz:

Zguillez: XD que gañan

Bleend: ya
: /

Zguillez: luego modificando correctamente la funcion interior de Bola para que busque el punto central del stage y listo

Bleend: hay que declarar las variables en la calse veo
(intento poner eso de antes, pero me dice que a y b están sin declarar)

Zguillez: siempre has de declarar una variable
var a

Bleend: ¿como encuento el ancho del fla desde el as?
stage._widh no lo reconoce

Zguillez: stage.widh?

Bleend: nop
no se pone azul
ah
ya
XD
lo escribí mal
:ownz:

Zguillez: ¬_¬

Sent at 1:16 AM on Saturday
Bleend: ya está
auqnue hay un par de cosillas....

Zguillez: el que?

Bleend:

Actionscript:
  1. package
  2. {
  3. import flash.display.MovieClip;
  4. import flash.utils.Timer;
  5. import flash.events.TimerEvent;
  6. public class Bola extends MovieClip
  7. {
  8. private var _clip:MovieClip;
  9. private var _timer:Timer;
  10. private var a:Number;
  11. private var b:Number;
  12. //
  13. public function Bola(qX:int,qY:int)
  14. {
  15. // Bola_Mc es un grafico de la libreria
  16. _clip = new Bola_Mc();
  17. _clip.x = qX
  18. _clip.y = qY
  19. addChild(_clip);
  20. //
  21. _timer = new Timer(10);
  22. _timer.addEventListener("timer", movimiento);
  23. _timer.start();
  24. }
  25. public function movimiento(e:TimerEvent):void
  26. {
  27. a=(stage.width/2)- _clip.x;
  28. b=(stage.height/2)- _clip.y;
  29. _clip.x+=a/100;
  30. _clip.y+=b/100;
  31. }
  32. }
  33. }

Estra es la clase
lo que no se es porque no los lleva al centro del stage
sino a la eskina superior izquierda
y luego si es posible cambiarle el punto de anclaje del contenedor "bola" para que esté centrado...?

Zguillez: si
tendiras que poner:
this.x = - _clip.x /2
y la y igual

Bleend: a ver... aver
no sería
- _clip.width/2
?

Zguillez: err si eso

Bleend: ok

Zguillez: cambia esto:

Actionscript:
  1. a=(stage.stageWidth/2)- _clip.x;
  2. b=(stage.stageHeight/2)- _clip.y;

Bleend: pero eso es el vector entre la posición y el centro del stage

Zguillez: asi se dirige al centro no a la esquina

Bleend: ah
ostias
no lo vi
que raro
2 veces stage?

Zguillez: para el stage el "width" es "stageWidth"...

Bleend: ok
para el anclaje le puse esto:

Actionscript:
  1. // Bola_Mc es un grafico de la libreria
  2. _clip = new Bola_Mc();
  3. _clip.x = qX - _clip.width/2
  4. _clip.y = qY - _clip.height/2
  5. addChild(_clip);

(Código no válido)

Zguillez: no

Actionscript:
  1. _clip = new Bola_Mc();
  2. _clip.x = qX;
  3. _clip.y = qY;
  4. this.x = - _clip.width/2
  5. this.y = - _clip.height/2
  6. addChild(_clip);

Bleend: ok

Zguillez: eso, o centra el punto de regitro del movieclip Bola_Mc desde la libreria

Bleend: mierdas
esto no se puede hacer, no?

Actionscript:
  1. import Bola
  2. for (i=0; i<15;i++){
  3. var _root["bola"+i]:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
  4. addChild(_root["bola"+i]);
  5. }

para no tener que meter los 15 manualmente....

Sent at 1:33 AM on Saturday
Zguillez: for (var i=0; i<15; i++) {

Actionscript:
  1. var bola:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
  2. bola.name = "bola"+i
  3. addChild(bola);
  4. }

Bleend: wow
eso si que me ha pillado en pelotas
bola.name
:O

Zguillez: le das nombre de instancia

Bleend: ok, me parece que ya lo pillé
muy bueno

Sent at 1:39 AM on Saturday
Bleend: como se hace para eliminar un listener?

Zguillez: con un removeListener

Bleend: mmm

Actionscript:
  1. import Bola;
  2. stage.addEventListener(onEnterFrame, creabolas);
  3.  
  4. function creabolas() {
  5. var i:Number;
  6. if (i<15) {
  7. var bola:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
  8. bola.name = "bola"+i;
  9. addChild(bola);
  10. i++;
  11. } else{
  12. stage.removeListener();
  13. }
  14. }

no rula
(código no válido)

Zguillez: nooo
a ver

Bleend: herejía de 1r grado? XD
lo que intento hacer es que ponga las bolitas cada un tiempo
no de golpe
aunque mejor un timer, no?

Zguillez: si claro...

Sent at 1:47 AM on Saturday
Bleend: mm ahora peta por otro lado

Zguillez: por cual?

Bleend:

Actionscript:
  1. import Bola;
  2. var timer2:Timer;
  3. var i:Number;
  4.  
  5. timer2 = new Timer(200);
  6. timer2.addEventListener("timer", creabolas);
  7. timer2.start();
  8.  
  9. function creabolas()
  10. {
  11. var bola:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
  12. bola.name = "bola"+i;
  13. addChild(bola);
  14. i++;
  15. }

ArgumentError: Error #1063: Discordancia del recuento de argumentos en Bola_fla::MainTimeline/creabolas(). Se esperaba 0 y se obtuvo 1.
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()
at flash.utils::Timer/flash.utils:Timer::tick()

Zguillez: "Se esperaba 0 y se obtuvo 1."
eso lo dice todo U_U

Bleend: pero no le estoy pasando ningun parametro a la función creabolas()
: /
solo le digo que la haga

Zguillez: creabolas(e:TimerEvent)
todas las funciones que ejecutas desde un listener han de pasar el parametro del evento

Bleend: mmm
ok

Sent at 1:54 AM on Saturday
Bleend: ^^
Bola.swf
*le entrega el trabajo al maestro

Descárgatelo en el PC, no lo abras en el navegador, que se ve mal.
Notese además que el flash no elimina los MC que añadimos continuamente, lo cual generará un aumento continuado del consumo de memoria del PC, así que no lo tengan abierto mucho rato

Sent at 1:59 AM on Saturday
Bleend: lo que no se porque se quedan agrupadas de 4 en 4
: /

Zguillez: quedó bien

Bleend:
^^


Descargar Archivos originales: ZipBola.zip

PD: Si les resulta muy confuso, ya lo redactaré de nuevo en forma de tip.




4 Comments for '“Clases” de AS3, Profesor: Zguillez'

  1.  
    One
    February 2, 2008 | 4:24 am
     

    Moooooooola, menuda charla del profesor zguillez. Me lo apunto. :wink:

  2.  
    February 3, 2008 | 6:02 pm
     

    Creo que es la primera vez que leo un post tan largo sin aburrirme ni un poquito :D Si ya decía yo que tu talento se limitada a hacer avatares parlanchines XD

  3.  
    Pericles
    February 13, 2008 | 6:45 pm
     

    Peaso conversacion, si señor muy esclarecedora. Muy buena clase.

  4.  
    July 23, 2008 | 9:10 pm
     

    me encanto el tutorial, fresco como la vida misma
    gracias al maestro por su paciencia y al alumno por su sinceridad y curiosidad
    salut
    al

Leave a comment

(required)

(required)


Information for comment users
Line and paragraph breaks are implemented automatically. Your e-mail address is never displayed. Please consider what you're posting.

Use the buttons below to customise your comment.


:smile: :grin: :razz: :lol: :wink: :mrgreen: :neutral: :roll: :shock: :???: :cool: :oops: :twisted: :evil: :eek: :mad: :sad: :cry: :!: :idea: :arrow:

RSS feed for comments on this post | TrackBack URI