Comunidad de diseño web y desarrollo en internet online

la deteccion de la colision

Citar            
MensajeEscrito el 22 Feb 2011 03:28 am
Muy buenas.. estoy haciendo un jueguito de autos y me trabe en una parte con respecto al hittestObject.

Posteo el codigo

Código :

import flash.events.KeyboardEvent;

var coches:coche;
var rivaleses:rivales;
// abajo amigo ,var rivaleses:rivales= new rivales();
var velocidadJuego:uint;
var crearIDenemigo:uint;
var izquierda:Boolean;
var derecha:Boolean;
var arriba:Boolean;
var abajo:Boolean;
var timer:Timer = new Timer(1000,1);
var numerodevidas:Number= 3
////////////////////////////////////////////////////////////////////////
/*               BLOQUEADORES PARA QUE TUERZA Y NO RUEDE               */           

var inclinadoIzq:Boolean;
var inclinadoDer:Boolean;
//  PARA SABER CUANDO SUELTO TECLA Y NO ESTA PULSADA
var pulsadoLeft:Boolean;
var pulsadoRight:Boolean;
//PARA IMPEDIR QUE CUANDO YO QUIERA
//QUE AL SOLTAR LA TECLA LA RANA VUELVA A SU POSICION 
//ESTA SE PONGA A ROTAR PARA EL OTRO LADO SIN PARAR
//EN TRUE ESTA ACTIVADO
var bloqueadorRight:Boolean=true;
var bloqueadorLeft:Boolean=true;

////////////////////////////////////////////////////////////////////////

function iniciarJuego():void {
   //SPAWNEO A MI PERSONAJE
   coches=new coche();
   //LA POSICION DE MI PERSONAJE
   coches.x=300;
   coches.y=370;
   
   addChild(coches);
   coches.chispasizq.visible=false;
   coches.chispasder.visible=false;
   
   velocidadJuego=500;
   crearIDenemigo=setInterval(crearID,velocidadJuego);
   Mouse.hide();
   
   stage.stageFocusRect=false;
   stage.focus=stage;
   
   //YA ESTAMOS SOBRE EL TECLADO EN SI
   stage.addEventListener(KeyboardEvent.KEY_DOWN, presionoTecla, false, 0, true);
   stage.addEventListener(KeyboardEvent.KEY_UP, sueltoTecla, false, 0, true);
   //EL LISTENER PARA LA FUNCION MOVER QUE VA A ESCUCHAR A CADA FRAME
   stage.addEventListener(Event.ENTER_FRAME, mover, false, 0, true);
}
   
   function mover(e:Event):void {
      
   if (derecha&&inclinadoDer==false) {
      coches.rotation+=20;
      //CON inclinadoDer Y EN TRUE YA SE MARCA QUE SE HIZO  
      //Y NO VUELVA A HACERSE GRACIAS QUE EL IF LO PIDE
      //EN FALSE
      inclinadoDer=true;
   }   
      
      if (derecha) {
      coches.x+=9;
      //MUEVE EN X Y AL ESCALAR CON +1 ES LO CONTRARIO AL -1
      //QUE SUCEDE CON LA IZQUIERDA QUE ES COMO HACER FLIP
      //coches.scaleX=+1;
      //QUIERO QUE LA POSICION SE ARREGLE CUANDO SUELTO (DERECHA)
      pulsadoRight=true;
      //SACO EL BLOQUEO
      bloqueadorRight=false;
   } else {
      pulsadoRight=false;
   }
      
      //CUANDO ESTA SIN EL BLOQUEO Y LA TECLA DESPULSADO {
   if (pulsadoRight==false&&bloqueadorRight==false) {
      //ES ROTACION -10 PORQUE AL HACER (derecha) LE SUME +10
      coches.rotation-=20;
      //Y LUEGO DE QUE ARREGLE LA POSCION PONGO A
      //bloqueadorRight EN TRUE PARA QUE NO SIGA HACIENDO -10  
      //GRACIAS A LA CONDICION DEL IF,QUE LO PIDE EN FALSE
      bloqueadorRight=true;
      inclinadoDer=false;
   }
   
      //////////////////////TODO LO MISMO PARA LA IZQUIERDA AHORA
   //////////////////////AL REVES EL MOV. EN X Y LA ROTACION
      
      if (izquierda) {
      coches.x-=9;
      pulsadoLeft=true;
      //SCALE EN -1 PORQUE LA RANA 
      //DE POR SI YA VIENE DE LADO DERECHO
      //coches.scaleX=-1;
      bloqueadorLeft=false;
   } else {
      pulsadoLeft=false;
      }
      
      if (izquierda&&inclinadoIzq==false) {
      coches.rotation-=20;
      inclinadoIzq=true;
   }
   
   if (pulsadoLeft==false&&bloqueadorLeft==false) {
      coches.rotation+=20;
      bloqueadorLeft=true;
      inclinadoIzq=false;
   }

      
      if (arriba) {
      coches.y-=5;
      }
      if(abajo) {
      coches.y+=4;
      }
      
      //PA QUE NO SE LAS PIQUE DEL STAGE
      
   if (coches.x>stage.stageWidth-coches.width/2 - 95) {
      coches.x-=10;
      coches.chispasder.visible=true;
   }else{
      coches.chispasder.visible=false;
   }
   
   if (coches.x<coches.width/2 + 95) {
      coches.x+=10;
      coches.chispasizq.visible=true;
   }else{
      coches.chispasizq.visible=false;
   }
   
   if (coches.y>stage.stageHeight-coches.height/2) {
      coches.y-=4;
   }
   
   if (coches.y<0 + coches.height/2) {
      coches.y+=5;
   }
}
   
   function sueltoTecla(event:KeyboardEvent):void {
   switch (event.keyCode) {
      case Keyboard.LEFT :
         izquierda=false;
         break;
      case Keyboard.RIGHT :
         derecha=false;
         break;
      case Keyboard.UP :
         arriba=false;
         break;
      case Keyboard.DOWN :
         abajo=false;
         break;
      default :
         break;
   }
}

function presionoTecla(event:KeyboardEvent):void {
   switch (event.keyCode) {
      case Keyboard.LEFT :
         izquierda=true;
         break;
      case Keyboard.RIGHT :
         derecha=true;
         break;
      case Keyboard.UP :
         arriba=true;
         break;
      case Keyboard.DOWN :
         abajo=true;
         break;
      default :
         break;
   }
}

function crearID():void {
   rivaleses=new rivales();
   var espacioalaizq:int= 0 + pasto1.width + borde1.width + rivaleses.width/2;
   var espacioalader:int= stage.stageWidth - (pasto2.width + borde2.width + rivaleses.width/2);
   var num:int = Math.floor(Math.random() * (espacioalader - espacioalaizq + 1)) + espacioalaizq;
   //QUE ESTE EN Y FUERA DE LA PANTALLA Y ALEATORIAMENTE EN X
   rivaleses.y=10;
   rivaleses.x= num;
   rivaleses.addEventListener(Event.ENTER_FRAME,dropEnemy);
   //rivaleses.addEventListener(Event.ENTER_FRAME,dropEnemy);
   // ESTO ES PARA AGREGARLOA  LA DISPLAY LIST Y QUE APAREZCA SINO NO CAE
   miniauto.addEventListener(Event.ENTER_FRAME,avanzaMini);
   addChild(rivaleses);
   //rivaleses.addEventListener(Event.ENTER_FRAME, vidas);
   //coches.addEventListener(Event.ENTER_FRAME, vidas);
   //stage.addEventListener(Event.ENTER_FRAME, vidas);
}

function dropEnemy(e:Event):void {
   //esto es para hacer mas facil la caida y que caiga de a 10 x frame
   //y se le podria agregar cosas de hit detection
   // CADA movieclip clase CAYENDO esta observado por el enterframe
   var caer:rivales=rivales(e.target);
   //PARA LA VELOCIDAD DE LA CAIDA DE LOS ENEMIGOS
   //A MAYOR VALOR MAS RAPIDO CAEN
   caer.y+=10;   
   if (caer.hitTestObject(coches) && coches.alpha== 1) {
      //coches.visible=false;
      coches.alpha= 0
      numerodevidas-=1;
      //trace(numerodevidas);
      vidas();
   }
}

function avanzaMini(e:Event):void {
   if(miniauto.hitTestObject(bandera.bandera_llegada)) {
   miniauto.removeEventListener(Event.ENTER_FRAME,avanzaMini);
   clearInterval(crearIDenemigo);
   timer.addEventListener(TimerEvent.TIMER,llamame_a_la_otra);
   timer.start();
   }else{
   miniauto.y-=0.5;
   }
}
function llamame_a_la_otra(e:TimerEvent):void{
   llegada_grande.addEventListener(Event.ENTER_FRAME,banderaCuadros);
   

}

function banderaCuadros(e:Event):void {
   llegada_grande.y+=17;
   if(coches.hitTestObject(llegada_grande.llegada)) {
      llegada_grande.removeEventListener(Event.ENTER_FRAME,banderaCuadros);
      rivaleses.removeEventListener(Event.ENTER_FRAME,dropEnemy);
      removeChild(rivaleses);
      stage.removeEventListener(Event.ENTER_FRAME, mover);
      rayas.stop();
      coches.chispasder.visible=false;
      coches.chispasizq.visible=false;
      
   }
}

function vidas():void {
   coches.x=300;
   coches.y=300;
   ///////ACA //TENGO //MI //PROBLEMA///////////////////////////////////////////
   if(coches.alpha<1){
      coches.alpha+=0.1;
   }
   ///////ACA //ESTABA //MI //PROBLEMA////////////////////////////////////////////
   if (numerodevidas== 2){
      vida3.visible=false;
   }
if (numerodevidas== 1){
   vida2.visible=false;
}
if (numerodevidas== 0) {
   vida1.visible=false;
}
   //coches.alpha=0.3;
      
   /*var trasparentandose:Array=new Array("0.1","0.9","0.1","0.9","0.1","0.9","0.1","0.9");
for(var i = 0; i < trasparentandose.length; i++){
   var numeros = trasparentandose;
coches.alpha= numeros;   
}
   */
}

iniciarJuego()
El problema yo lo tengo en la funcion Vidas, lo que esta marcado entre /////////////




porque no me lo hace funcionar mas de una vez, o sea detecta UNA SOLA VEZ la colision y hace el truquito de la transparencia pero con las demas vidas nada.. y quise hacerlo mediante un listener en la funcion dropenemy pero me da peor resultado. Puede tambien ser que el problema este en otro lado '???

Gracias, Lio

Por lio89

18 de clabLevel



 

msie7
Citar            
MensajeEscrito el 22 Feb 2011 11:30 am
Generalmente cuando postean código entero, nadie responde. Es muy pesado tener que leer todo tu código.

Intenta aislar el problema y solicitar guía más enfocado.

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

chrome
Citar            
MensajeEscrito el 22 Feb 2011 08:02 pm

Código ActionScript :

function dropEnemy(e:Event):void {
var caer:rivales=rivales(e.target);
caer.y+=10; 
if (caer.hitTestObject(coches) && coches.alpha== 1) {
coches.alpha= 0
numerodevidas-=1;
vidas();
}
}

function vidas():void {
coches.x=300;
coches.y=300;
///////ACA //TENGO //MI //PROBLEMA///////////////////////////////////////////
if(coches.alpha<1){
coches.alpha+=0.1;
}
///////ACA //ESTABA //MI //PROBLEMA////////////////////////////////////////////
if (numerodevidas== 2){
vida3.visible=false;
}
if (numerodevidas== 1){
vida2.visible=false;
}
if (numerodevidas== 0) {
vida1.visible=false;
}
}


Gracias hernan este es el problema aislado, mira que corto. Tenes razon
Lionel

Por lio89

18 de clabLevel



 

msie7
Citar            
MensajeEscrito el 23 Feb 2011 01:19 am
Bien veamos, primero que nada, me parece trabajar un poco más prolijo a nivel código para no liar mucho las instancias de código.

Código ActionScript :

function vidas():void { 
   coches.x = coches.y = 300; 
   if(coches.alpha<1){ 
       deleteCar(coches);
   } 
   this["vida"+(numerodevidas+1)].visible = false;
}


Nueva función:

Código ActionScript :

function deleteCar(Car:MovieClip):void{
   // new Tween(... bla bla bla);
}


Para animar usa la clase: http://www.greensock.com/tweenlite/

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

chrome
Citar            
MensajeEscrito el 23 Feb 2011 06:12 am
Te molesto con una pregunta mas, por favor si serias tan amable ?

Me es imposible aplicar tus cambios al codigo a mi archivo, porque este .fla esta destinado a ser un final de materia de escuela terciaria de diseño , y la profesora a cargo no nos permite que el archivo tenga cosas que no nos enseño aun , y que lamento por ende yo tampoco poder entender su uso. Hablo po la funcion deleteCar , lo otro lo entendi ^^



yo lo que busco lograr con

Código :

function vidas():void { 
    coches.x = coches.y = 300;  
   if(coches.alpha<1){        
 //una funcion//   
}   
  this["vida"+(numerodevidas+1)].visible = false; 
}


es que la funcion luego del if(coches.alpha<1)
haga que "coches" vaya recuperando su opacidad de a poco.

A modo de "invulnerabilidad temporal" para ponerme a salvo de los obstaculos del juego sin perder rapidamente otra vida como en el juego de sega "Sonic the Hedgehod" cuando perdes tus anillos.


Por eso nesesitaba pedirte, si no es abusar de tu tiempo, otro tipo de solucion sencilla o explicacion para poder yo resolverlo. Agradezco tu ayuda

Entiendo a lo que ibas con solicitar guia mas enfocado.
Estas cosas olvide mencionarlas antes..

Saludos, Lionel.

Por lio89

18 de clabLevel



 

msie7
Citar            
MensajeEscrito el 23 Feb 2011 08:55 am
deleteCar es una función, como las otras que tienes. Nada más. No es nada "nuevo", solo eso.

Sino quieres usar la claseTween, tendrás que invocar la función deleteCar dentro de un onEnterFrame.

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

chrome
Citar            
MensajeEscrito el 24 Feb 2011 04:38 am
Uso un Enter_Frame pero no consigo el resultado.

function dropEnemy(e:Event):void {
var caer:rivales=rivales(e.target);
caer.y+=10;
if (caer.hitTestObject(coches) && coches.alpha== 1) {
coches.alpha= 0
numerodevidas-=1;
vidas();
}
}

function vidas():void {
coches.x = coches.y = 300;
stage.addEventListener(Event.ENTER_FRAME, transparencia, false, 0, true);
}
this["vida"+(numerodevidas+1)].visible = false;
}


function transparencia(e:Event):void{
if(coches.alpha<1){
coches.alpha+=0.1;
}

}


Probe con un timer, probe de otras formas. Estoy estancadisimo me quiero matar

Por lio89

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Feb 2011 05:02 am
Prueba así:

Código ActionScript :

function dropEnemy(e:Event):void {
   var caer:rivales = rivales(e.target);
   caer.y+=10;
   if (caer.hitTestObject(coches) && coches.alpha== 1) {
      coches.alpha= 0;
      numerodevidas-=1;
      vidas();
   }
}

function vidas():void { 
   coches.x = coches.y = 300; 
   stage.addEventListener(Event.ENTER_FRAME, transparencia, false, 0, true); 
} 
   this["vida"+(numerodevidas+1)].visible = false; 
}


function transparencia(e:Event):void{
   if(coches.alpha<1){
      coches.alpha+=0.1;
   }else{
      stage.removeEventListener(Event.ENTER_FRAME, transparencia);
   }
}


Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

chrome
Citar            
MensajeEscrito el 24 Feb 2011 05:45 am
Hola Hernan, gracias. Aun asi no funciona.

Correccion: funciona solo cuando a "coches.alpha+=0.1; " le asigno un valor mayor a 0.4

¿?
Saludos, Lionel

Por lio89

18 de clabLevel



 

msie7
Citar            
MensajeEscrito el 24 Feb 2011 06:25 am
Tendría que ver todo el código y el proyecto para saber exacto dónde esta el problema... Pero si funciona a .4, ponlo en .4 y ya.

Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

chrome
Citar            
MensajeEscrito el 24 Feb 2011 11:48 pm
Te agradezco por el tiempo y la ayuda, me fue muy pero muy util. Porque ya lo solucione le puse un timer asi tengo el tiempo suficiente por mas que lo tenga que dejar en .5

Gracias Hernan, por la ayuda ahora ya tengo todo casi listo
Mucha suerte
=)

Saludos Lionel

Por lio89

18 de clabLevel



 

chrome

 

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