Comunidad de diseño web y desarrollo en internet online

Mover Bitmap

Citar            
MensajeEscrito el 21 May 2009 11:47 pm
Hola amigos, para contarles que ya voy avanzando un poco en mi programa (un rompecabezas), primero debía cargar una imagen y luego dividirla, gracias a vuestra ayuda aprendí a hacerlo, aunque me parece que se puede hacer de una mejor manera, (ni modo estoy aprendiendo).
Este es mi codigo hasta ahora :P

var loader:Loader = new Loader();
loader.load(new URLRequest("imagen.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);

function onLoader (e:Event){

var bitmap:Bitmap = loader.content as Bitmap;

var figura1:BitmapData = new BitmapData(150, 120, false, 0x000000FF);
var figura2:BitmapData = new BitmapData(150, 120, false, 0x0000CCFF);
var figura3:BitmapData = new BitmapData(150, 120, false, 0x000000FF);
var figura4:BitmapData = new BitmapData(150, 120, false, 0x0000CCFF);

var punto:Point = new Point(0, 0);

var rectangulo1:Rectangle = new Rectangle(0,0, 150, 120);
var rectangulo2:Rectangle = new Rectangle(150, 0, 150, 120);
var rectangulo3:Rectangle = new Rectangle(0, 120, 150, 150);
var rectangulo4:Rectangle = new Rectangle(150, 120, 150, 150);

figura1.copyPixels(bitmap.bitmapData, rectangulo1, punto);
var mapaBits1:Bitmap = new Bitmap(figura1);
this.addChild(mapaBits1);

figura2.copyPixels(bitmap.bitmapData,rectangulo2, punto);
var mapaBits2:Bitmap = new Bitmap(figura2);
this.addChild(mapaBits2);
mapaBits2.x = 151;
addChild(mapaBits2)

figura3.copyPixels(bitmap.bitmapData,rectangulo3, punto);
var mapaBits3:Bitmap = new Bitmap(figura3);
this.addChild(mapaBits3);
mapaBits3.x = 0;
mapaBits3.y = 121;
addChild(mapaBits3)

figura4.copyPixels(bitmap.bitmapData,rectangulo4, punto);
var mapaBits4:Bitmap = new Bitmap(figura4);
this.addChild(mapaBits4);
mapaBits4.x = 151;
mapaBits4.y = 121;
addChild(mapaBits4)
}

Ahora quisiera saber como hago para mover cada pieza, intenté con esto pero me sale error

figura4.addEventListener(MouseEvent.CLICK,Llamar);
function Llamar(event:MouseEvent):void {
trace("presionaste sobre la figura 4")
}

¿Supongo que tengo que meter las imagenes en un movieClip verdad? denme una pista por favor.

Por kriptonitex

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 May 2009 01:22 am
La clase bitmap no responde a eventos efectivamente metelos a un movieclip y con el movieclip haras lo que quieras XD

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 May 2009 06:44 am
En lugar de en un MovieClip es preferibles meterlos objetos tipo Sprite (nuestros objetos no tienen línea de tiempo). Creo que si están dentro de Shapes no funcionaría.
En cualquier caso, el problema lo simplificas un poco usando un bucle y un array

Código ActionScript :

//creamos un array
var divisiones:Array=new Array();

//le añadimos los rectángulos
divisiones.push(new Rectangle(0,0, 150, 120));
divisiones.push(new Rectangle(150, 0, 150, 120));
divisiones.push(new Rectangle(0, 120, 150, 150));
divisiones.push(new Rectangle(150, 120, 150, 150));

var punto:Point = new Point(0, 0);

//creamos un bucle
for (var i:int=0;i<divisiones.lenght;i++){
  var ancho:int=divisiones[i].width;
  var alto:int=divisiones[i].height;
   var figura:BitmapData = new BitmapData(ancho, alto, false, 0x000000FF);
   figura.copyPixels(bitmap.bitmapData, divisiones[i], punto);
   var mapaBits:Bitmap = new Bitmap(figura);
   //aquí creamos un Sprite
   var sprite:Sprite=new Sprite();
   sprite.addChild(mapaBits);
   //aquí le creamos los eventos
   sprite.addEventListener(.....)

   //finalmente lo añadimos al Stage
  addChild(sprite)
}


Vemos cómo, con el uso de un array, no tenemos que repetir instrucciones. Además esto nos permitiría, por ejemplo, si le añadimos más rectángulos a nuestro array, hacer más divisiones, que los rectángulos tengan distintas dimensiones, etc, etc
Pero la principal ventaja es que, con sólo cambiar una línea en el bucle no tenemos que repetir ese cambio.
Por ejemplo, queremos que nuestro "Objeto" sprite sea en realidad un MovieClip para poderle dar "variables", (o queremos darle propiedad "name" para poder localizarlos mediante getChildByName), o ...

(NOTA:También se podría hacer que se calcularan los rectángulos simplemente sabiendo el número de filas y columnas en lugar de calcularlos nosotros)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 May 2009 11:06 pm
Gracias por responder Eliseo2 como siempre tu tan atento, me estas ayudando mucho con tu ultimo posteo ya que yo tambien vi que era mucho problema el estar repitiendo el mismo codigo para cada objeto, pero con tu ayuda estoy mejorando el codigo, ahora una pregunta, ¿hay forma de convertir este bloque dentro de algun bucle?

divisiones.push(new Rectangle(0,0, 150, 120));
divisiones.push(new Rectangle(150, 0, 150, 120));
divisiones.push(new Rectangle(0, 120, 150, 150));
divisiones.push(new Rectangle(150, 120, 150, 150));


es que si por ahi se me ocurre crear 100 divisiones, entonces tendria que hacerlo una a una??? :twisted:

Por kriptonitex

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 May 2009 01:31 am
Bueno todo se puede optimizar, por ejemplo esto hace lo mismo que tus 4 líneas de código con un bucle:

Código ActionScript :

var valores:Array = new Array(120, 150);
var i:uint;
var rect:Rectangle;

for(i = 0; i < 4; i++){   
   rect = (i < 2) ? new Rectangle(i * valores[1], 0, valores[1], valores[0]) : new Rectangle((i - 2) * valores[1], valores[0], valores[1], valores[1]);
   divisiones.push(rect);   
}


Pero como puedes ver es un código mucho más extenso que el tuyo, por lo tanto, en el caso que fueran 100 debes de tratar de crear un bucle, pero para sólo 4 no vale la pena.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 23 May 2009 09:58 pm
Gracias por responder chininet, tienes razón si el código fuera solo para cuatro piezas no tendría mucha utilidad el bucle, pero lo de las cuatro piezas fue para ir aprendiendo ya que en realidad mi programa tomará el numero de filas y columnas que el usuario elija.

Por kriptonitex

17 de clabLevel



 

chrome

 

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