Comunidad de diseño web y desarrollo en internet online

ayuda cambio de MC... urgente!

Citar            
MensajeEscrito el 29 Abr 2009 10:28 pm
buen dia clab

quisiera saber si me pudiesen ayudar con el siguiente problema que se me presento:

estoy desarrollando un juego tipo rompecabezas en el cual existen 5 partes y por medio de arrastre llevarlas a cierta posicion..... esto basicamente: Funciona!

el problema es, que la persona que valla a usar esto tiene la opcion de cambiar el color de las partes y estas tienen que tener las mismas funciones de arrastre....

la unica opcion que vi fue, declarar todas las partes (son 3 posibles colores, asi que son 15 partes en total), la que voy a usar darles visible en true y las que no en false, se puede decir que el cambio lo estoy haciendo usando 5 temporales para guardar las posiciones, el problema es que no esta haciendo el arrastre.....

coloco es codigo de solo dos partes y dos colores, estoy solamente probando con la primera parte el cambio total pero no funciona...

yo se que se puede reducir un poco el codigo, pero no veo como...


Código :

var Parte11:parte11 = new parte11();
//posiciones iniciales 
Parte11.x = 413.3;
Parte11.y = 100.5;
Parte11.name = "parteActiva1";

var Parte12:parte12 = new parte12();
Parte12.x = 418;
Parte12.y = 195;
Parte12.name = "parteActiva2";

var Parte21:parte31 = new parte31();
Parte21.x = 413.3;
Parte21.y = 100.5;
Parte21.visible = false;
addChild(Parte21);


var Parte22:parte32 = new parte32();

Parte22.x = 418;
Parte22.y = 195;
Parte22.visible = false;
addChild(Parte22);


var parteActiva1:MovieClip = Parte11;
addChild(parteActiva1);

var parteActiva2:MovieClip = Parte12;
addChild(parteActiva2);

// las coordenadas correctas de las piezas en el eje x
var posX:Array=[]; 
// y y.
var posY:Array=[]; 
// los estados de cada pieza (true=activa/false=colocada)
var piezasActivas:Array=[]; 
// numero de piezas colocadas correctamente
var piezasEnPosicion:int=0;

var numeroPiezas:int = 2;

var colorActivo = 1;



for (var i=0; i<numeroPiezas; i++){
   var nombre:String = "parteActiva"+(i+1);
   // trabajamos una pieza a la vez
   var unaPieza:DisplayObject = getChildByName(nombre);
   // grabamos coordenadas iniciales
   posX.push(unaPieza.x);
   //trace(nombre +": "+ posX[i]);
   posY.push(unaPieza.y);
   // la piezas empiezan inactivas (se activarán al mezclarse)
   piezasActivas.push(false);
   // al clicarse, empieza el arrastre
   unaPieza.addEventListener(MouseEvent.MOUSE_DOWN, empiezaArrastre);
   // al soltar el botón del mouse, termina el arrastre
   unaPieza.addEventListener(MouseEvent.MOUSE_UP, paraArrastre);
   // mostramos cursor de mano
   //unaPieza.buttonMode=true;
}

   mezclarPiezas();

function empiezaArrastre(e){

   setChildIndex(DisplayObject(e.target),(numChildren-1));
   // recuperamos numero de la pieza
   var miNum = Number(e.target.name.substr(11) - 1);
   // si es activa, empezar el arrastre
      trace(miNum);
      trace(piezasActivas[miNum]);
      trace(e.target);
   if (piezasActivas[miNum] == true){
      e.target.startDrag();
      //al cambio de color pasa por ACA PERO NO LO HACE
   }
}

function paraArrastre(e){
   var laPieza:MovieClip = e.target;
   var miNum = Number(e.target.name.substr(11))-1;
   
   //paramos el arrastre
   laPieza.stopDrag();   
   // estamos en la posición correcta?
   var distX = Math.abs(laPieza.x - posX[miNum]);
   var distY = Math.abs(laPieza.y - posY[miNum]);

   // si la distancia en ambos ejes es menor que 10, esta bien colocada
   if ( (distX < 150) && (distY < 150) ){
      // posicionamos en la posicion correcta
      laPieza.x= posX[miNum];
      laPieza.y= posY[miNum];
      // opacidad al 100%
      laPieza.alpha=1;
      // desactivamos la pieza
      piezasActivas[miNum]=false;
      // aumentamos el contador de piezas colocadas
      piezasEnPosicion++

      //trace(laPieza.name + ": "+ laPieza.x);
   }
}


// La funcion de la mezcla mueve las piezas aleatoriamente y establece
// las condiciones del inicio del juego de nuevo.

function mezclarPiezas(){
   for (var i=0; i<numeroPiezas; i++){
      var nombre:String = "parteActiva"+(i+1);
      // accedemos a cada pieza
      var unaPieza:DisplayObject = getChildByName(nombre);
      // situamos aleatoriamente
      unaPieza.x = Math.random() * 400 + 50;
      unaPieza.y = Math.random() * 250 + 50;
      // transparencia hacia abajo
      unaPieza.alpha=0.6
      // y vuelve a estar activa
      piezasActivas[i]=true;   
   }   
}



color2.addEventListener(MouseEvent.CLICK, selectColor2);

function selectColor2(e:MouseEvent)
{   
   for (var i=0; i<numeroPiezas; i++){
      var nombre:String = "parteActiva"+(i+1);
      // accedemos a cada pieza
      var unaPieza:DisplayObject = getChildByName(nombre);
      
      unaPieza.visible = false;
      unaPieza.name = "parte" + (i+1);

   }
   
   var temp1:MovieClip = parteActiva1;
   var temp2:MovieClip = parteActiva2;
   
   
   parteActiva1 = Parte21;
   parteActiva2 = Parte22;
   
   parteActiva1.x = temp1.x;
   parteActiva1.y = temp1.y;
   parteActiva1.name = "parteActiva1";
   parteActiva1.visible = true;
   
   //no se para que se usa el enabled ?????
   parteActiva1.enabled = true;
   piezasActivas[0]=true;   
   
   parteActiva1.addEventListener(MouseEvent.MOUSE_DOWN, empiezaArrastre);
   parteActiva1.addEventListener(MouseEvent.MOUSE_DOWN, paraArrastre);
   
   
   parteActiva2.x = temp2.x;
   parteActiva2.y = temp2.y;
   parteActiva2.name = "parteActiva2";
   parteActiva2.visible = true;

   
}



ahh y dos cosas mas:
1) como estoy haciendo un cambio del index...... al cambiar de frame los objetos me van a quedar .... como hago para borrarlos??
2) como borro todo lo referente a l MC, con el fin de liberar memoria


gracias por todo

Por tintin

26 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Abr 2009 10:40 am
la unica opcion que vi fue, declarar todas las partes (son 3 posibles colores, asi que son 15 partes en total),


Arrancas mal. Usa el objeto color para cambiar el color a las 5 partes, luego simplificas tus problemas
¿Y si mañana te piden dos colores mas?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 30 Abr 2009 01:32 pm
mmmm ps es que si uso color.... se me piede el detalle de las partes, ya que no tienen un solo color.....

Por tintin

26 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Abr 2009 02:04 pm
Tintin, debes usar los Arrays sin miedo. Además hay una instrucción getDefinitionByName que puede ayudarte a simplificar el problema.

Realmente tienes "n" piezas. Así que vamos a meterlas en un array. Como queremos relacionar esas piezas con una posición y queremos saber si está activa o no, deberemos usar un array de objetos. No te preocupes por la palabrería

Digamos que una pieza tiene
1.-un MC asociado
2.-una variable "activa"
3.-una posición a donde tiene que llegar.
Además tenemos, como variable accesible un "color". imaginemos que tenemos algo como

Código ActionScript :

color=1
var piezas=new Array()
for (var i:int=0;i<5;i++){
     var ClassReference:Class = getDefinitionByName("pieza"+i.toString()+color.toString()) as Class;
     var instance:Object = new ClassReference();
     piezas.push({mc:instance,posx:posX[i],posy:posY[i],x:0,y:0,active:true});
}
//tendremos así un array de objetos, Y, p.e.
//piezas[0].mc=...un Mc de la clase "pieza01"
//piezas[0].posx=30
//piezas[0].posy=60
//piezas[0].active=true

//piezas[1].mc=...un Mc de la clase "pieza11"
//piezas[1].posx=300
//piezas[1].posy=50
//piezas[1].active=true

//Añadiremos a la displayList los MCs y les daremos la posibilidad de draguearse
for (var i:int=0;i<piezas.length;i++){
   piezas.mc.addEventListener(MouseEvent.MOUSE_DOWN, empiezaArrastre);
   piezas.mc.addEventListener(MouseEvent.MOUSE_DOWN, paraArrastre);
   addChild(piezas.mc)
}

Así, cuando cambiemos de color lo único que hay que hacer es

Código ActionScript :

color=2;
for (var i:int=0;i<piezas.length;i++){
    //guardamos en unas variables la posición actual
    var xx:Number=piezas[i].mc.x
    var yy:Number=piezas[i].mc.y
   //quitamos el "mc"
   piezas[i].mc.removeListener(MouseEvent.MOUSE_DOWN, empiezaArrastre);
   piezas[i].mc..removeListener(MouseEvent.MOUSE_DOWN, paraArrastre);
   removeChild(piezas[i].mc)
   //y le asignamos un nuevo valor
     var ClassReference:Class = getDefinitionByName("pieza"+i.toString()+color.toString()) as Class;
    piezas[i].mc= new ClassReference();
    //y lo añadimos en la posición que tenía
    piezas[i].mc.x=xx
    piezas[i].mc.y=yy
    addChild(piezas[i].mc)
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Abr 2009 10:00 pm
gracias por tu ayuda eliseo2, pero se presento un problema

el codigo hace esto

Código :

for (var i:int=1;i<7;i++){ 
     var ClassReference:Class = getDefinitionByName("parte" +color.toString()+i.toString()) as Class; 
     var instance:Object = new ClassReference(); 
     piezas.push({mc:instance,posx:posX[i],posy:posY[i],x:0,y:0,active:true}); 
} 


pero al intentar hacer esto

Código :

for (var j:int=0;j<piezas.length;j++){ 
   piezas.mc.addEventListener(MouseEvent.MOUSE_DOWN, empiezaArrastre); 
   piezas.mc.addEventListener(MouseEvent.MOUSE_DOWN, paraArrastre); 
   addChild(piezas.mc) 
} 


me coloca el siguiente error

Código :

TypeError: Error #1010: Un término no está definido y no tiene propiedades.
   at probandoayuda_fla::MainTimeline/probandoayuda_fla::frame1()


no se, no tocara decirle como el indice, la verdad nunca habia manejado ese metodo (getDefinitionByName)??


gracias por todo y eres muy bueno en esto....
espero me ayudes con este problema

Por tintin

26 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 May 2009 10:40 pm
como lo sospechaba tocaba colocarle el indice....
gracias por la ayuda, esto quedaria asi:

Código :

for (var j:int=0;j<piezas.length;j++){ 
   piezas[j].mc.addEventListener(MouseEvent.MOUSE_DOWN, empiezaArrastre); 
   piezas[j].mc.addEventListener(MouseEvent.MOUSE_UP, paraArrastre); 
   addChild(piezas[j].mc) 
} 


muchas gracias

Por tintin

26 de clabLevel



 

firefox

 

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