O personagem está ficando preso aos poucos no chão, pois o
Alam 0 está em loop. A cada
300 steps ele é executado e o
y é acrescido em
+1, sem qualquer verificação.
Esse
Alarm 0 não faz sentido algum de existir. Não concorda? Remova-o.
No código tem uma redundância de expressões:
Código: Selecionar todos
if (place_meeting(x,y+1,oSand))
{
...
}
else if (!place_meeting(x,y+1,oSand))
{
...
}
Se uma coisa não é verdadeira, e você usar
else, quer dizer que a expressão anterior é falsa, então não faz sentido negar a mesma expressão com
else if, basta apenas o
else.
No primeiro pulo ele cai direto, pois já possui uma velocidade vertical acumulada. E dentro da sua condição você não checa em nenhum momento se ela está acima do permitido dentro da areia. Isso não acontece se já estiver nela, pois quando o player começar a cair novamente a gravidade vai ser menor.
Logo, o código mais próximo do correto seria assim:
Código: Selecionar todos
if place_meeting(x, y+1, oSand)
{
grv = 0.001;
walkspeed = 2;
jumpspeed = 0.5;
// Verifica e limita velocidade de queda
if vsp > 2
{
vsp = 2;
}
if(key_jump)
{
vsp = -jumpspeed;
}
}
else
{
grv = 0.3;
walkspeed = 4;
jumpspeed = 7;
}
Espero que ajude.
Abraços