Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: lorenzo en Junio 21, 2017, 05:28:58 AM

Título: Ayuda con colision
Publicado por: lorenzo en Junio 21, 2017, 05:28:58 AM
Quiero hacer que el personaje colisione en la paredvertical "pv" a alta velocidad pero el personaje se queda atorado en la pared o aveces la traspasa

en el evento create del player tengo
sp=20
sp1=sp//velocidad a la  derecha
sp2=sp// velocidad a la izquierda
col=0



evento step del player

//detecta a cada pixel antes de moverse 20 pixeles por delante
for(i=0;i<sp;i+=1)
{
if place_meeting(bbox_right+i,y,pv)
{ x+=i sp1=0  }

if place_meeting(bbox_left-i,y,pv)
{x-=i sp2=0   }
}


//al apretas izquierda va para la izquierda a la velocidad de "sp"
if keyboard_check(vk_left)
{
x-=sp2
sp1=sp
}
//al apretas derecha va para la derecha a la velocidad de "sp"
if keyboard_check(vk_right)
{
x+=sp1
sp2=sp
}

//gravedad
if !place_meeting(x,y+1,ph)
{
y+=0.5
}

//si no colisiono co la pared vertical se reinicia la velocidades
if !place_meeting(x,y,pv)
{
sp1=sp
sp2=sp
}










Les adjunto el juego
Título: Re:Ayuda con colision
Publicado por: bygdle en Junio 21, 2017, 06:40:30 AM
No tiene mucho sentido el código: Aunque intentes hacer colisiones perfectas, justo abajo mueves la posición sp pixeles. Intenta arreglarlo así:
[gml]
///Evento create
sp = 20; //La velocidad
gr = 1; //La gravedad
vv = 0; //la velocidad vertical
[/gml]
[gml]
///Evento step
if(keyboard_check(vk_left))
{
   repeat(sp)
   {
      if(!place_meeting(x - 1, y, muro))
         x--;
      else break;
   }
}
if(keyboard_check(vk_right))
{
   repeat(sp)
   {
      if(!place_meeting(x + 1, y, muro))
         x++;
      else break;
   }
}

repeat(abs(vv))
{
   if(!place_meeting(x, y + 1, muro))
      y++;
   else
   {
      vv = 0;
      break;
   }
}
vv += gr;
[/gml]
Título: Re:Ayuda con colision
Publicado por: 3dgeminis en Junio 21, 2017, 06:48:55 AM
Otra forma:
[gml]
mx=( keyboard_check(vk_right)-keyboard_check(vk_left) )

if abs(mx)
    {
     repeat(sp) { if !place_meeting(x+mx ,y ,pv) {x+=mx} }
    }
[/gml]