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
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]
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]