Comunidad de diseño web y desarrollo en internet online

ayuda BitmapData y attachBitmap

Citar            
MensajeEscrito el 30 Ene 2009 09:23 pm
antes de nada que sepais que el codigo no es mio, es el de un ejemplo de esta web. a ver, quiero coger una imagen de la libreria ( ya esta la opcion marcada para exportar a actionscript) y virtualmente convertirla en una matriz de cuadrados, es decir, quiero llevarla al escenario como un puzzle pero ordenado. de tal forma que luego pueda jugar con los cuadraditos y moverlos a mi antojo, aunque de momento solo quiero eso, dividir la imagen en cuadrados y colocarlos en el escenario ordenadamente de tal forma que al final se vea la imagen en el escenario correctamente. En principio esto es lo que quiero hacer, luego cuando resuelva esto ya movere y animare los clips ( cada clip contiene un cuadrado de la imagen) etc, pero lo que pasa es que no me funciona no se por que. tengo nociones de actionscript pero tampoco soy un experto asi ke haber si me podeis ayudar. espero haberme explicado claramente, si no entendeis lo que quiero hacer preguntarme. aki os dejo el codigo:

Una cosa el ejemplo original lo que hacia aparte de este codigo llamaba a una función que utilizaba setInterval para ir bajando, girando, escalando poco a poco los cuadraditos de la imagen hasta que desaparecian uno a uno

import flash.display.*;
import flash.geom.*;
import flash.filters.*;

var bmpImage:BitmapData;
var thumb_image:BitmapData;
var i:Number;
var j:Number;
var imgWidth:Number;
var imgHeight:Number;
var thumbSize:Number;
var _curLevel:Number;

bmpImage = BitmapData.loadBitmap("Pattern");
imgWidth = bmpImage.width;
imgHeight = bmpImage.height;
thumbSize = 50;
blurIntense = 10;
_curLevel = 0;

for(j=0; j<imgHeight; j+=thumbSize){
for(i=0; i<imgWidth; i+=thumbSize){
thumb_image = new BitmapData(thumbSize, thumbSize, false);
thumb_image.copyPixels(bmpImage, new Rectangle(i, j, i+thumbSize, j+thumbSize), new Point(0, 0));
nueClip = createEmptyMovieClip("image_holder" + _curLevel, _curLevel);
nueClip._x = i;
nueClip._y = j;
nueClip.attachBitmap(thumb_image, 0);
_curLevel++;
}
}

SALUDOS!!

Por jorio01

16 de clabLevel



 

msie7
Citar            
MensajeEscrito el 31 Ene 2009 04:13 am
Hola aqui te dejo un nuevo codigo basado en tu script, como puedes ver, al final todos los clips se quedan en un array multidimencional, y el codigo esta dentro de una funcion llamada seccionar, asi podrias seccionar varios BitmapData, recuerda que un MovieClip exportado para actionscript, NO es igual que un Mapa de Bits, exportado para ActionScript. Importa una imagen a la biblioteca para que puedas ver el ejemplo funcionando, y llamalo "Pattern", el simbolo de un mapa de bits es como un arbolito. Suerte.

Código ActionScript :

import flash.display.*;
import flash.geom.*;
import flash.filters.*;

var clips_arr:Array = seccionar(BitmapData.loadBitmap("Pattern"), 50, _root);

for(var i in clips_arr)
 for(var j in clips_arr[i])
  trace(i+"::"+j+" -> "+clips_arr[i][j]._name+" "+clips_arr[i][j]._width+"x"+clips_arr[i][j]._height);

function seccionar( bmpImage:BitmapData, thumbSize:Number, scope:MovieClip ):Array
{
   thumbSize = ( thumbSize == undefined )? 50 : thumbSize ;
   scope = (scope == undefined )? _root : scope ;
   var clips_arr:Array = new Array();
   var imgW_nmb:Number = bmpImage.width;
   var imgH_nmb:Number = bmpImage.height;
   var level_nmb:Number = scope.getNextHighestDepth();
   
   for(var j:Number = 0; j < imgH_nmb / thumbSize; j++ ){
      clips_arr[j] = new Array();
      for(var i:Number = 0; i < imgW_nmb / thumbSize; i++ ){
         var nueClip:MovieClip = scope.createEmptyMovieClip("BMPclip_" + level_nmb, level_nmb);
         clips_arr[j][i] = nueClip;
         var aux:BitmapData = new BitmapData(thumbSize, thumbSize, false);
         aux.copyPixels(bmpImage, new Rectangle(i * thumbSize , j * thumbSize, (i+1) * thumbSize, (j+1) * thumbSize), new Point(0, 0));
         nueClip._x = i * thumbSize;
         nueClip._y = j * thumbSize;
         nueClip.attachBitmap(aux, 0);
         level_nmb++;
      }
   }
   return clips_arr;
}

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 31 Ene 2009 09:57 am
Muchas gracias por responder. pero podrías decir que fallaba en el mío?

Por jorio01

16 de clabLevel



 

msie7
Citar            
MensajeEscrito el 31 Ene 2009 10:37 am
x cierto he estasdo haciendo pruebas. y hay una cosa que no entiendo. si pongo tu código sin la función tampoco funciona, y si pongo el que puse yo en una funcion si que funciona. a que es debido esto?

Respecto a los arrays porque hay que utilizarlo? al utilizar esto:

nueClip = _root.createEmptyMovieClip("image_holder" + _curLevel, _curLevel);

una vez seccionada la imagen y terminada la función, no se puede acceder luego para modificar la posición de los cuadradito mediante:
image_holder24._x=80;

bueno te dejo el codigo que funciona mediante una función. otra cosa ahora me tarda en cargar la imagen ni idea por que sera

import flash.display.*;
import flash.geom.*;
import flash.filters.*;

var bmpImage:BitmapData;
var thumb_image:BitmapData;
var i:Number;
var j:Number;
var imgWidth:Number;
var imgHeight:Number;
var thumbSize:Number;
var _curLevel:Number;

bmpImage = BitmapData.loadBitmap("Pattern");
imgWidth = bmpImage.width;
imgHeight = bmpImage.height;
_curLevel = 0;

seccionar(bmpImage, 10);


function seccionar( bmpImage:BitmapData, thumbSize:Number ):Void {
for(j=0; j<imgHeight; j+=thumbSize){
for(i=0; i<imgWidth; i+=thumbSize){
thumb_image = new BitmapData(thumbSize, thumbSize, false);
thumb_image.copyPixels(bmpImage, new Rectangle(i, j, i+thumbSize, j+thumbSize), new Point(0, 0));
nueClip = _root.createEmptyMovieClip("image_holder" + _curLevel, _curLevel);
nueClip._x = i;
nueClip._y = j;
nueClip.attachBitmap(thumb_image, 0);
_curLevel++;
}
}
}

Por jorio01

16 de clabLevel



 

msie7
Citar            
MensajeEscrito el 03 Feb 2009 04:29 am

jorio01 escribió:

x cierto he estasdo haciendo pruebas. y hay una cosa que no entiendo. si pongo tu código sin la función tampoco funciona


XD no pues si lo pones sin la funcion, pues no funciona, jejeje, al igual que usar un automovil sin motor, el codigo que escribi, esta completamente basado en el que tu tienes y en mi opinion, es mejor, porque no usa variables que estan fuera de la funcion; basta con invocar a la funcion seccionar de este modo:

En el array clips_arr, guarda todos los movieclips resultado de seccionar el mapadebits, cargado desde la biblioteca con id "Pattern", en cuadrados de 50x50, y cargalos en el _root o en cualquier otro MovieClip

Código ActionScript :

var clips_arr:Array = seccionar(BitmapData.loadBitmap("Pattern"), 50, _root);


Esto te puede hacer la vida mas facil, ya tienes todos los movieclips en un Array, osea puedes acceder a ellos de forma mas "ordenada", clips_arr[0][0]._x = 80, no tengas miedo de usarlo, funciona, pero esta bien, tu codigo funciona a la perfeccion, no le faltaba nada, me funciono a la primera, pense que lo que hiciste mal fue a la hora de vincular el mapa de bits desde la biblioteca, puede que vincularas un MovieClip y no un Mapa de Bits. Sobre tu codigo del segundo post, al acceder al movieclip, accede de este modo: _root.image_holder1._x = 80; y si se tarda en cargar puede ser porque esta muy pesada y tenga mucha resolucion, la imagen que estas seccionando. Suerte.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 03 Feb 2009 01:12 pm
ok. gracias por responder.
sin la función tambien me funciono ayer despues de intentarlo mucho. era porque no habia inicializado thumbSize en donde no tenia función. voy aclarando mis dudas. estoy contigo en que es mejor tenerlo en un array. una vez que lo tengas en el array lo manejas a tu antojo.

pero aun me keda una duda, en el caso de que no quisiera un array, y sabiendo que puedo acceder mediante "image_holder"
como podria acceder a todas ellas mediante un for
seria asi?

image_holder+i._x=80 // siendo i la variable del for.

Por jorio01

16 de clabLevel



 

msie7
Citar            
MensajeEscrito el 03 Feb 2009 05:22 pm
Hola

Suponiendo que todas las image_holder estan en el _root

Código ActionScript :

_root["image_holder" + i]._x = 80


Suponiendo que todas las image_holder estan en el mismo MovieClip, donde estas escribiendo este codigo

Código ActionScript :

this["image_holder" + i]._x = 80


Suponiendo que haces un for

Código ActionScript :

var index:Number;
for(var i in this){
   //SI los primeros 12 caracteres del nombre del MovieClip son "image_holder"
   if( i.substr(0,12) == "image_holder" ){
   //El index sera igual a la conversion a numero de los restantes caracteres del nombre
   index = Number( i.substr(12) );
      //Si la conversion anterior, NO es un NAN(Not a Number), osea, SI es un numero
      //Sin esta validacion pude que te encuentres con problemas de undefined misteriosos
      if(!isNaN(index)){
         this[i]._x = 5 * index;
         trace(i +"::"+ index +"::"+ this[i]);
      }
   }
}


Suerte.

Por LongeVie

Claber

1741 de clabLevel

1 tutorial

Genero:Masculino  

En un lugar, re moto.

firefox
Citar            
MensajeEscrito el 04 Feb 2009 06:35 pm
ok. gracias

Por jorio01

16 de clabLevel



 

msie7

 

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