Comunidad de diseño web y desarrollo en internet online

problema al evaluar dos funciones dentro de la sentencia if

Citar            
MensajeEscrito el 20 Oct 2012 11:58 pm
tengo un problema con la sentencia if, que al introducir dos veces la misma funcion con diferentes parametros dentro de los parentesis de if, las funciones se ejecutan mal.


este es el codigo:

Código ActionScript :

var d=1;
_root.createEmptyMovieClip("esenario",d++);
var juego=new Object();
juego.clip=_root.esenario;
juego.X=0;
juego.Y=0;
juego.velocidad=10;
juego.distanciaMaxima=200;
juego.distanciaMinima=20;

juego.clip.attachMovie("riku","riku",d++);

juego.clip.attachMovie("sora","sora",d++);
juego.sora=new Object();
juego.sora.clip=juego.clip.sora;
juego.sora.clip._x=100;
juego.sora.clip._y=100;
juego.sora.X=300;
juego.sora.Y=200;
juego.sora.velocidad=10;

_root.onEnterFrame=function(){
   var ratonX=_xmouse-juego.X;
   var ratonY=_ymouse-juego.Y;
   ///////////
   // parte problematica
      mover2(juego.sora,juego,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X",true);
      mover2(juego.sora,juego,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y",true);
      mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X"); 
      mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y");
   
   /*
   if(mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X") && mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y") ){
      trace(true);
   }*/
   
   
   //////////////////
      juego.clip._x=juego.X;
      juego.clip._y=juego.Y;
      juego.sora.clip._x=juego.sora.X-25;
      juego.sora.clip._y=juego.sora.Y-30;
}


function mover(objeto:Object,DX:Number,DY:Number,distanciaMaxima:Number,distanciaMinima:Number,eje:String,invertido:Boolean){
   if(invertido){
      var distanciaX=-(DX-objeto.X);
      var distanciaY=-(DY-objeto.Y);
   }else{
   var distanciaX= DX - objeto.X;
   var distanciaY= DY - objeto.Y;
   }
   if(Math.abs(distanciaX)< distanciaMaxima/3){
      var cambio=6;
   }
   else if(Math.abs(distanciaX)< 2*distanciaMaxima/3 && Math.abs(distanciaX)> distanciaMaxima/3){
      var cambio=4;
   }
   else if(Math.abs(distanciaX)> 2*distanciaMaxima/3){
      var cambio=1;
   }
   var direccion=distanciaX/Math.abs(distanciaX);
   if(eje=="X"){
      if(Math.abs(distanciaX)>distanciaMinima){
      objeto.X+=direccion*objeto.velocidad/cambio;
      }
      else{return(true);}
   }
   ///////
   if(Math.abs(distanciaY)< distanciaMaxima/3){
      var cambio=6;
   }
   else if(Math.abs(distanciaY)< 2*distanciaMaxima/3 && Math.abs(distanciaY)> distanciaMaxima/3){
      var cambio=4;
   }
   else if(Math.abs(distanciaY)> 2*distanciaMaxima/3){
      var cambio=1;
   }
   var direccion=distanciaY/Math.abs(distanciaY);

   if(eje=="Y"){
      if(Math.abs(distanciaY)>distanciaMinima){
      objeto.Y+=direccion*objeto.velocidad/cambio;
      }
      else{return(true);}
   }
}


function mover2(objeto:Object,objeto2:Object,DX:Number,DY:Number,distanciaMaxima:Number,distanciaMinima:Number,eje:String,invertido:Boolean){
   if(invertido){
      var distanciaX=-(DX-objeto.X);
      var distanciaY=-(DY-objeto.Y);
   }else{
   var distanciaX= DX - objeto.X;
   var distanciaY= DY - objeto.Y;
   }
   if(eje=="X"){
   if(Math.abs(distanciaX)< distanciaMaxima/3){
      var cambio=6;
   }
   else if(Math.abs(distanciaX)< 2*distanciaMaxima/3 && Math.abs(distanciaX)> distanciaMaxima/3){
      var cambio=4;
   }
   else if(Math.abs(distanciaX)> 2*distanciaMaxima/3){
      var cambio=1;
   }
   var direccion=distanciaX/Math.abs(distanciaX);
   
      if(Math.abs(distanciaX)>distanciaMinima){
      objeto2.X+=direccion*objeto.velocidad/cambio;
      }
      else{return(true);}
   }
   ///////
   if(eje=="Y"){
   if(Math.abs(distanciaY)< distanciaMaxima/3){
      var cambio=6;
   }
   else if(Math.abs(distanciaY)< 2*distanciaMaxima/3 && Math.abs(distanciaY)> distanciaMaxima/3){
      var cambio=4;
   }
   else if(Math.abs(distanciaY)> 2*distanciaMaxima/3){
      var cambio=1;
   }
   var direccion=distanciaY/Math.abs(distanciaY);

   
      if(Math.abs(distanciaY)>distanciaMinima){
      objeto2.Y+=direccion*objeto.velocidad/cambio;
      }
      else{return(true);}
   }
}


le codigo es parte de un juego y se encarga de mover al personaje "sora" tomando como referencia al mouse. pero en realidad "sora" no se mueve sino que se mueve "riku" (que representa el esenario) al contrario de "sora"

el codigo funciona bien hasta ahora, pero si cambio esta parte:

Código ActionScript :


mover2(juego.sora,juego,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X",true);
mover2(juego.sora,juego,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y",true);
mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X"); 
mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y");



por esta otra:

Código ActionScript :

mover2(juego.sora,juego,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X",true);
mover2(juego.sora,juego,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y",true);

if(mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"X") && mover(juego.sora,ratonX,ratonY,juego.distanciaMaxima,juego.distanciaMinima,"Y") ){
      trace(true);
}



entonces "sora" y "riku" se mueven de manera extraña

que estoy haciendo mal?

gracias de antemano.

nota: el codigo esta completo y si lo copian y vinculan dos clip en la biblioteca con los nombres de "sora" y de "riku" el codigo debería funcionar justo como a mi.

Por kirec1

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Oct 2012 12:39 pm
Poner dos funciones que hacen casi lo mismo porque introducen mínimas diferencias es un síntoma de que tu código le falta un golpe de horno. Si el código no es conciso y eficiente, solucionar bugs es muy complicado. Antes de ver por que se mueven extraño, te sugiero busques de que forma puedes usar una sola función de movimiento .
Una vez que logres una sola función mira si tener más de 10 if dentro de ella es necesario. Denomino a esta programación casuística, es decir a medida que me doy cuenta que algo no funciona bien, agrego un if para solucionar esa condición y así sucesivamente ... como resultante, el código es un compendio de if de toda índole.
Los juegos demandan la mayor pericia en el código, sino te quedas en mas o menos logrado ejercicio

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 23 Oct 2012 03:36 am
el problema es que necesito mover el eje de las "x" y el de las "y" en funciones diferentes porque el juego es a base de tiles y cuando el personaje, por ejemplo, chocaba de una pared debajo de el, y lo movias en un agulo derecha-abajo o izquierda-abajo aunque la funcion detectaba que no se podia mover hacia abajo, si podia hacia la izquierda o derecha, y el personaje se metia en la pared y luego quedaba varado. por eso separe el movimiento x del y.

aun asi revisare y tratare de cambiar algo. estaria agradecido de cualquier consejo.

Por kirec1

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Oct 2012 12:34 pm
Los movimientos permitidos son en base a un lookup del mapa pasando las coordenadas del personaje, no veo que eso amerite separar movimiento

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

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