Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

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

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Muquirana
Novato
Novato
Reações: 0
Mensagens: 9

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

Mensagem por Muquirana » Sáb Ago 11, 2018 9:20 am

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;

Avatar do usuário
All-x
Administrador
Administrador
Reações: 8
Mensagens: 621
Localização: Dourados-MS

Contato:

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

Mensagem por All-x » Sáb Ago 11, 2018 3:43 pm

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
Começando com o Game Maker? Olhou para assinatura certa!

Imagem

Tutoriais e vídeo aulas de programação! Clique no Banner e confira!

Avatar do usuário
Muquirana
Novato
Novato
Reações: 0
Mensagens: 9

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

Mensagem por Muquirana » Sáb Ago 11, 2018 4:12 pm

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:

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes