Página 1 de 1

[GMS2][Duvida] Problemas com areia movediça

Enviado: Sáb Ago 11, 2018 9:20 am
por Muquirana
Bom dia pessoal, bom, estava tentando fazer um efeito de areia movediça no jogo que estou fazendo e estou com alguns problemas criando um efeito de areia movediça:
1-Quando eu pulo com o meu personagem na areia, ele cai direto, mas se eu pular enquanto estiver dentro da areia, ele sobe direto e depois cai devagar.
2-Ao sair da areia, o personagem vai entrando no chão aos poucos e acaba ficando preso.

Aqui estao os codigos:
Step event:

Código: Selecionar todos

if(place_meeting(x,y+1,oSand))
{
grv = 0.001;
walkspeed = 2;
jumpspeed = 0.5;
alarm[0] = 300;
if(key_jump){
 vsp = -jumpspeed;
}
}
else if (!place_meeting(x,y+1,oSand)){
 grv = 0.3;
 walkspeed = 4;
 jumpspeed = 7;
}
E o Alarm Event:

Código: Selecionar todos

y += 1;

alarm[0] = 300;

Re: [GMS2][Duvida] Problemas com areia movediça

Enviado: Sáb Ago 11, 2018 3:43 pm
por All-x
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.

Código: Selecionar todos

if (place_meeting(x,y+1,oSand))
{
...
}
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

Re: [GMS2][Duvida] Problemas com areia movediça

Enviado: Sáb Ago 11, 2018 4:12 pm
por Muquirana
Alex FC escreveu: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.

Código: Selecionar todos

if (place_meeting(x,y+1,oSand))
{
...
}
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
Tudo bom Alex, então, fucei a manhã toda e tinha removido o alarm e deu tudo certo, agora sobre a redundancia do codigo me ajudou bastante também e agora esta resolvido, Obrigado :blz: