Comunidad de diseño web y desarrollo en internet online

Ayuda - Problema extraño con colisiones.

Citar            
MensajeEscrito el 03 Jun 2012 09:26 am
Saludos a todos. Bueno soy principiante en ActionScript3 y me gustaría poder terminar un minijuego que estoy haciendo, pero me da problemas solamente en un momento en la comprobación de colisiones, que evita que pueda jugarse bien.

Os pongo el código y os explico.

Código ActionScript :

private function comprobarColisonesPersonaje (ev:EventoMovimiento):void
{
         var obstaculoTemporal:MovieClip;
         var s:int;
         var d;
         d=personaje.getdirect();


for (s=0; s<arrayObstaculos.length;s++)
{
            
            obstaculoTemporal=arrayObstaculos[s];
            
            while(HitTest.complexHitTestObject(personaje,obstaculoTemporal,1))
            {
               
                  if(obstaculoTemporal.hitTestPoint(personaje.x+personaje.width/2, personaje.y,true) )
                  {
                               personaje.y--;
                  }
                  
                  /*if(obstaculoTemporal.hitTestObject(personaje) )
                  {
                     
                               personaje.y--;
                  }*/
                  
                  else
                  {
                     if(d==1)
                          this.personaje.x --;
                  
                           if(d==-1)
                            this.personaje.x ++;
                  }
                     
                  
         }
               
}
         
}



Básicamente el juego consiste en generar varios obstáculos y enemigos "random" que te impiden llegar una meta, la cual debes alcanzar lo antes posible.

Esta parte del código controla las colisiones con los obstáculos con al condición de que mientras toque con alguno haga y--, si es por arriba o x-- e x++, si es por izquierda y derecha atendiendo a la dirección del personaje, dejándolo siempre fuera del obstáculo.

El problema se me plantea es en la condición del y--, pues x me lo hace bien. No pilla bien la condición o algo porque siempre me deja al personaje medio hundido, por lo que siempre colisiona y no me hace bien las otras dos condiciones, ni saltar, etc. Pero lo extraño es que no solo me ocurra con hitTestPoint . Si activo la prueba comentada (aunque le faltarían condiciones faltarían condiciones pero sirve para probar), que lo hace con hitTestObject también ocurre lo mismo y si pusiese con complexHitTestObject igual.

Por último indicar que la x e y del personaje está abajo a la izquierda pero me ocurre lo mismo si lo paso al centro o arriba y cambio un poco las condiciones.

Bueno de antemano muchas gracias por vuestra ayuda.

Por Amnoon

13 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Jun 2012 12:18 pm
No entiendo muy bien, pero asumo que no lo reposiciona bien. Dos cosas veo mal:

- Usar un while en un hitTest, riesgo de cuelgue !!
- Corregir en un solo pixel te deja dentro del hitTest, la correción debería ser suficiente como para que no se siga siendo true el hitTest

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Jun 2012 10:38 pm
Si, lo del while fue una prueba fruto de la desesperación, en verdad sería un if.

Pero es que no solo falla con el hitpoint si uso el hit test normal, que coge todo el stage, también falla, me deja al personaje medio dentro de el obstáculo y eso si que no tiene sentido por que debería detectar la colisión en cualquier pixel del personaje y hacerle el y-- ... Pero cuando toca por arriba no lo hace, lo deja medio hundido.

Por Amnoon

13 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Jun 2012 01:25 am
¿Ambos MovieClips se encuentran en la misma línea de tiempo?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Jun 2012 08:04 am
No, los obstáculos forman parte de una clase distinta al personaje. No comparten linea de tiempo.

Por Amnoon

13 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Jun 2012 08:19 am
hitTest solo se puede hacer entre elementos que están en la misma línea de tiempo, es decir, mas allá de la clase a la que pertenezcan, tienes que haber hecho un addChild sobre el mismo timeline.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Jun 2012 08:45 am
Voy a probar, pero yo tengo addchilds de cada variable que quiero que se vea (es decir de cada variable de cada clase), ¿Como las meto todas en la misma timeline?

Por Amnoon

13 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Jun 2012 08:51 am
Además ahora que releo veo que no estás usando el hitTestObject habitual, sino un método optimizado basado en Rectangle que tomaste creo de acá: http://www.foxarc.com/blog/article/106.htm
Para saber si estan en el mismo timeline, usa un simple trace

trace(obstaculoTemporal+" / "+personaje)

Si ninguno de los dos aparece como undefined, entonces comparten el timeline

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Jun 2012 09:06 am
Pues si, están en el mismo timeline. Y con respecto al complexhittextobject me sirve porque tengo formas no del todo rectangulares pero si cambio ese while con un hit test normal me sucede el mismo problema. Adjunto una imagen del error en concreto.



Como ves si choco por la derecha (lo he probado también en objetos irregulares) choca bien y lo saca del objeto. Pero cuando salta encima de alguno de ellos y se activa la opción de la y, no. Lo deja medio hundido.

Por Amnoon

13 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Jun 2012 09:28 am
Mira donde tienes el punto de registro del personaje, por ejemplo esto

if(obstaculoTemporal.hitTestPoint(personaje.x+personaje.width/2, personaje.y,true)

Chequea contra el y del personaje que posiblemente no esté abajo sino arriba o en el centro. Si vas a hacer un plataformero, pon el punto de registro en los pies

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Jun 2012 09:38 am
Ahora mismo está en los pies. Concretamente hago el hitpoint en la mitad del stage del pj pero con la y en los pies.

Por Amnoon

13 de clabLevel



 

chrome

 

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