Comunidad de diseño web y desarrollo en internet online

Rompecabezas en ActionScript 3

Citar            
MensajeEscrito el 29 May 2009 03:38 pm
Hola amigos, aquí regreso después de un tiempo para contarles que mi rompecabezas ya esta casi terminado, :lol: tengo que agradecerles mucho a este foro, ya que fueron ustedes los que me guiaban en cada duda que tenia, pero ante todo quiero dejar bien claro que el merito de este rompecabezas es para Teseo, quien escribió este post: http://www.cristalab.com/tips/rompecabezas-y-puzzles-con-imagenes-en-actionscript-c35392l/
donde indicaba como hacer un puzzle en AS 2, yo solo he adecuado el código a AS 3, y le agregué una que otra pequeña cosilla.
Pues bien amigos, mi puzzle esta casi listo, pero hay un error que me esta volviendo loco ya que no se como solucionarlo, se trata que al presionar por segunda vez el botón de reinicio, me sale el siguiente error: :shock:

Código :

ArgumentError: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador.
   at flash.display::DisplayObjectContainer/removeChild()
   at MethodInfo-247()

El programa reinicia el juego a pesar de este mensaje de error, pero quisiera saber como hago para arreglar este detallito, les adjunto el archivo .Fla aqui: http://rapidshare.com/files/238568843/puzzleas3.rar.html por si quieren darle una ojeadita a mi programa, aclarando que hay 4 objetos en el escenario:
2 numericSteeper llamados: numStepF y numStepC
1 cuadro de texto dinamico llamado txtFaltan
1 button de nombre btnReiniciar
Bueno y para los que no quieren descargarse el archivo, les adjunto el código, perdonen si anda medio desordenado, pero como dije anteriormente, recién estoy aprendiendo. :cool:

Código :

import flash.filters.BevelFilter;
var loader:Loader = new Loader();
loader.load(new URLRequest("flores.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, alCargar);
var mapaBits:Bitmap;
function alCargar(e:Event) {
   var bitmap:Bitmap = loader.content as Bitmap;
   var rect:Rectangle = new Rectangle(0,0, bitmap.width,bitmap.height);
   var punto:Point= new Point(0,0);
   var figura:BitmapData=new BitmapData(bitmap.width,bitmap.height,false,0x000000FF);
   figura.copyPixels(bitmap.bitmapData,rect,punto);
   mapaBits=new Bitmap(figura);
   puzzle(mapaBits,numStepF.value,numStepC.value,false);
}
function puzzle(imagen,f,c,lin) {
   for (var hg=0; hg<4*tpz; hg++) {
      removeChild(pz[hg]);
   }
   var a=new Array(1,12,0,.35,2,12,1,.15,3,2,4,.2,5,4,6,.5,7,6,8,.5,10,12,2,.15,9,8,10,.4,11,12,10,.15);
   var tpz=f*c;
   var j;
   c>f?j=20/c:j=20/f;
   var bF=new BevelFilter(1,45);
   var img=imagen.bitmapData;
   var w=img.width;
   var h=img.height;
   var m1=w/(3*c);
   var m2=h/(3*f);   
   var p=[];
   var d=0;
   var m;
   for (m=0; m<4*tpz; m+=4) {
      p[m+7] = p[m+1] = d++;
      if ((d-1)%(2*c) == 2*(c-1)) {
         p[m+1]=p[(m+4)%(4*tpz) +3]=2*tpz-2;
      }
      p[m+4*c] = p[m+2] = d++;
      if (d>2*(tpz-c) && d%2 == 0) {
         p[m+2]=p[(m+4*c)%(4*tpz)]=2*tpz-1;
      }
   }
   var g;
   var b:Array=new Array();
   var alea;
   var sig;
   for (g=0; g<2*tpz; g++) {
      b[g]=[];
      b[g][0] = new Point(m1, m2);
      (.1 - Math.random() / 5)<0 ? sig=-1 : sig=1;
      if (g%2 == 0) {
         b[g][12] = new Point(m1, 4*m2);
         b[g][4] = new Point(m1-m1*sig*.6, m2*(2+(.1 - Math.random() / 5)));
         b[g][6] = new Point(m1-m1*sig*.9, m2*(2.5+(.1 - Math.random() / 5)));
         b[g][8] = new Point(m1-m1*sig*.6, m2*(3+(.1 - Math.random() / 5)));
      } else {
         b[g][12] = new Point(4*m1, m2);
         b[g][4] = new Point(m1*(2+(.1 - Math.random() / 5)), m2-m2*sig*.6);
         b[g][6] = new Point(m1*(2.5+(.1 - Math.random() / 5)), m2-m2*sig*.9);
         b[g][8] = new Point(m1*(3+(.1 - Math.random() / 5)), m2-m2*sig*.6);
      }
      var r;
      for (r=0; r<29; r+=4) {
         b[g][a[r]] = Point.interpolate(b[g][a[r+1]],b[g][a[r+2]],a[r+3]+(.1 - Math.random() / 5));
      }
   }
   var pz:Array =new Array();
   var pt:Array=new Array();
   var n;
   var miX=25;
   var miY=25;
   var cont=0;   
   var child:Shape = new Shape();
   child.graphics.beginFill(0xffffff);
   child.graphics.lineStyle(2, 0xcccccc);
   child.graphics.drawRect(25+m1,25+m2,w,h);
   child.graphics.endFill();
   addChild(child);
   txtFaltan.text="Faltan: "+f*c;
   btnReiniciar.label="Reiniciair";   
   for (n=0; n<f*c; n++) {
      pz[n]=new MovieClip();      
      pz[n].x=miX;
      pz[n].y=miY;
      cont++;
      if (cont %c==0) {
         miX=25;
         miY+=h/f;
      } else {
         miX+=w/c;
      }
      var tmp2 = new BitmapData(5*m1, 5*m2, true, 0);
      var punto:Point= new Point(0,0);
      pt[n] = new Point((n%c)*3*m1-m1, Math.floor(n/c)*3*m2-m2);
      tmp2.copyPixels(img,new Rectangle(pt[n].x,pt[n].y,5*m1,5*m2),punto);      
      var z;
      var sy;
      var sx;
      for (z=0; z<4; z++) {
         z == 2 ? sy=3*m2 : sy=0;
         z == 1 ? sx=3*m1 : sx=0;
         g = p[4*n+z];
         pz[n].graphics.beginBitmapFill(tmp2);
         pz[n].graphics.moveTo(5*m1/2, 5*m2/2);
         pz[n].graphics.lineTo(b[g][0].x+sx, b[g][0].y+sy);
         if (g>(2*tpz-3) || lin) {
            pz[n].graphics.lineTo(b[g][12].x+sx, b[g][12].y+sy);
         } else {
            pz[n].graphics.lineTo(b[g][1].x+sx, b[g][1].y+sy);
            for (j=2; j<12; j+=2) {
               pz[n].graphics.curveTo(b[g][j].x+sx, b[g][j].y+sy,b[g][j+1].x+sx,b[g][j+1].y+sy);
            }
            pz[n].graphics.lineTo(b[g][12].x+sx, b[g][12].y+sy);
         }
         pz[n].graphics.lineTo(5*m1/2, 5*m2/2);
         pz[n].graphics.endFill();
      }      
      pt[n].x = pz[n].x;      
      pt[n].y = pz[n].y;
      pz[n].filters = [bF];
      pz[n].v = n;      
      pz[n].x=Math.round(Math.random()*(w-m1));
      pz[n].y=Math.round(Math.random()*(h-m2));
      addChild(pz[n]);
   }
   for (var i:int=0; i<cont; i++) {
      pz[i].addEventListener(MouseEvent.MOUSE_DOWN, mover);
      pz[i].addEventListener(MouseEvent.MOUSE_UP,detener);
   }   
   function mover(event:MouseEvent):void {
      for (var i:int=0; i<cont; i++) {
         if (pz[i].name==event.currentTarget.name) {
            pz[i].startDrag();
            addChild(pz[i]);
         }
      }
   }   
   function detener(event:MouseEvent):void {
      for (var i:int=0; i<cont; i++) {
         if (pz[i].name==event.currentTarget.name) {
            pz[i].stopDrag();            
            if (iman(pz[i].x,pt[i].x,pz[i].y,pt[i].y)) {
               pz[i].x=pt[i].x;
               pz[i].y=pt[i].y;
            }
         }
      }
      var pfl=f*c;
      for (var pf:int=0; pf<c*f; pf++) {
         if (pz[pf].x==pt[pf].x && pz[pf].y==pt[pf].y) {
            pfl--;
         }
      }
      if (pfl==0) {
         txtFaltan.text="Buen trabajo";         
         for (var pel:int=0; pel<c*f; pel++) {
            pz[pel].filters=null;
         }
      } else {
         txtFaltan.text="Faltan: "+pfl;
      }
   }
   function iman(puntoA1:int,puntoA2:int,puntoB1:int,puntoB2:int):Boolean {      
      var fi:Number=8;
      if (puntoA1>puntoA2-fi && puntoA1<puntoA2+fi && (puntoB1>puntoB2-fi && puntoB1<puntoB2+fi)) {
         return true;
      } else {
         return false;
      }
   }
   btnReiniciar.addEventListener(MouseEvent.MOUSE_DOWN, reinicia);
   function reinicia(event:MouseEvent):void {      
      for (var count=0; count<f*c; count++) {
         removeChild(pz[count]);
      }
      removeChild(child);
      puzzle(mapaBits,numStepF.value,numStepC.value,false);
   }
}

Por kriptonitex

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Jun 2009 09:37 am
No veo nada que sea llame "child" :(, por tanto debería darte el error con sólo pulsar el botón "btnReiniciar"
Vale, sí se que hay un "child" pero, al haber definido la variable DENTRO de la función "puzzle" no es "accesible" salvo en esa misma función. Para que sea accesible desde cualquier función, debemos añadir la variable al principio de todo

Código ActionScript :

var child:Shape
....luego todo tu código...

Y, en tu función puzzle

Código ActionScript :

//cambia la línea
//var child:Shape = new Shape();
//por
child=new Shape()

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Jun 2009 04:25 pm
Gracias por responder Eliseo2, voy a cambiar el código como me indicaste y te cuento ^^

Por kriptonitex

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Jun 2009 09:14 pm
Hice lo que me indicaste, y aun asi me salia error, entonces moví esta parte de codigo
var pz:Array =new Array();
arriba en las declaraciones generales y asi dejo de salirme el dichoso mensaje de error, pero cuando pulso el boton de reiniciar el programa demora cada vez mas en mezclar las piezas, y a la cuarta o quinta vez se demora que da miedo, ¿a que crees que se deba?

Por kriptonitex

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Jun 2009 06:18 am
Cuando elimines un Mc (o un DisplayObject en general), debemos eliminar ANTES sus listeners y luego igualarlo a null.
Vamos, un removeChild SÓLO elimina de la DisplayList (vamos que no se ven), pero siguen ocupando memoria.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Jun 2009 04:00 pm
ok Eliseo2, gracias por la aclaración, quisiera decirte que estoy aprendiendo ActionScript 3 por mi cuenta, por eso es que me trabo en cosas como esta que a mi parecer son cosas tan simples, pero bueno como se dice "echando a perder se aprende" :lol: asi que voy a seguir machacando el codigo hasta que salga correcto :evil:

Por kriptonitex

17 de clabLevel



 

msie8
Citar            
MensajeEscrito el 14 Jul 2009 06:43 pm
Buenoo pues yo he tenido que hacer algo similar.... y buenoo aca dejo un ejemplo en AS3 funcionando de como funciona...y gracias al tuto... muy bueno eso de CopyPixels OMG Descarga Rompecabezas AS3...

Por hackjasl

72 de clabLevel



 

firefox

 

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