Esta 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
un ejemplo práctico y todo. Vamos que me hizo una "Clase" particular (sí, hay un estúpido doble sentido
)
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:
-
import flash.display.BitmapData;
-
import flash.display.Bitmap;
-
var bmpData:BitmapData = new BitmapData(100, 100, false, 0xFF0000FF);
-
var bmp:Bitmap = new Bitmap(bmpData);
-
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: sí
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: sí
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
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:
-
cosa.onPress=function () {
-
//asdads
-
}
(en los frames)
Zguillez: aha
Bleend: o bien:
-
on(press) {
-
//asdf
-
}
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
-
this.onEnterFrame=function(){
-
duplicateMovieClip(_parent,i,this.getNextHighestDepth());
-
i._x=Math.round(Math.random()*400)
-
i._y=Math.round(Math.random()*400)
-
i++;
-
}
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
Zguillez: ok ese aviso no es nada...
Bleend: ActionScript file, no?
Zguillez: sip
Bleend: ya
Zguillez: copy and paste:
-
package
-
{
-
import flash.display.MovieClip;
-
import flash.utils.Timer;
-
import flash.events.TimerEvent;
-
public class Bola extends MovieClip
-
{
-
private var _clip:MovieClip;
-
private var _timer:Timer;
-
//
-
public function Bola(qX:int,qY:int)
-
{
-
// Bola_Mc es un grafico de la libreria
-
_clip = new Bola_Mc();
-
_clip.x = qX
-
_clip.y = qY
-
addChild(_clip);
-
//
-
_timer = new Timer(10);
-
_timer.addEventListener("timer", movimiento);
-
_timer.start();
-
}
-
public function movimiento(e:TimerEvent):void
-
{
-
_clip.x -= 1;
-
_clip.y -= 1;
-
}
-
}
-
}
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:
-
import Bola
-
var bola1:Bola = new Bola(400,300);
-
var bola2:Bola = new Bola(450,350);
-
var bola3:Bola = new Bola(500,300);
-
var bola4:Bola = new Bola(550,350);
-
addChild(bola1);
-
addChild(bola2);
-
addChild(bola3);
-
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
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:
-
package
-
{
-
import flash.display.MovieClip;
-
import flash.utils.Timer;
-
import flash.events.TimerEvent;
-
public class Bola extends MovieClip
-
{
-
private var _clip:MovieClip;
-
private var _timer:Timer;
-
private var a:Number;
-
private var b:Number;
-
//
-
public function Bola(qX:int,qY:int)
-
{
-
// Bola_Mc es un grafico de la libreria
-
_clip = new Bola_Mc();
-
_clip.x = qX
-
_clip.y = qY
-
addChild(_clip);
-
//
-
_timer = new Timer(10);
-
_timer.addEventListener("timer", movimiento);
-
_timer.start();
-
}
-
public function movimiento(e:TimerEvent):void
-
{
-
a=(stage.width/2)- _clip.x;
-
b=(stage.height/2)- _clip.y;
-
_clip.x+=a/100;
-
_clip.y+=b/100;
-
}
-
}
-
}
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:
-
a=(stage.stageWidth/2)- _clip.x;
-
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:
-
// Bola_Mc es un grafico de la libreria
-
_clip = new Bola_Mc();
-
_clip.x = qX - _clip.width/2
-
_clip.y = qY - _clip.height/2
-
addChild(_clip);
(Código no válido)
Zguillez: no
-
_clip = new Bola_Mc();
-
_clip.x = qX;
-
_clip.y = qY;
-
this.x = - _clip.width/2
-
this.y = - _clip.height/2
-
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?
-
import Bola
-
for (i=0; i<15;i++){
-
var _root["bola"+i]:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
-
addChild(_root["bola"+i]);
-
}
para no tener que meter los 15 manualmente....
Sent at 1:33 AM on Saturday
Zguillez: for (var i=0; i<15; i++) {
-
var bola:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
-
bola.name = "bola"+i
-
addChild(bola);
-
}
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
-
import Bola;
-
stage.addEventListener(onEnterFrame, creabolas);
-
-
function creabolas() {
-
var i:Number;
-
if (i<15) {
-
var bola:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
-
bola.name = "bola"+i;
-
addChild(bola);
-
i++;
-
} else{
-
stage.removeListener();
-
}
-
}
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:
-
import Bola;
-
var timer2:Timer;
-
var i:Number;
-
-
timer2 = new Timer(200);
-
timer2.addEventListener("timer", creabolas);
-
timer2.start();
-
-
function creabolas()
-
{
-
var bola:Bola = new Bola(Math.round(Math.random()*400),Math.round(Math.random()*400));
-
bola.name = "bola"+i;
-
addChild(bola);
-
i++;
-
}
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: ^^

*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: Sí
^^
Descargar Archivos originales:
Bola.zip
PD: Si les resulta muy confuso, ya lo redactaré de nuevo en forma de tip.

Moooooooola, menuda charla del profesor zguillez. Me lo apunto.
Creo que es la primera vez que leo un post tan largo sin aburrirme ni un poquito
Si ya decía yo que tu talento se limitada a hacer avatares parlanchines XD
Peaso conversacion, si señor muy esclarecedora. Muy buena clase.
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