Tutorial Game Maker - Movimentação plataforma
04/05/2013 17:26
Neste tutorial comentarei como fazer um movimento em plataforma. Não é usado VSPEED, HSPEED nem SOLID.
Crie um objeto o_chao (mas não o marque como sólido).
Crie o objeto do seu jogador, e no evento Create coloque:
// Valores
veloc = 8; // Velocidade
forcaPulo = 10;
grav = 0.5; // Gravidade
hsp = 0; // Velocidade horizontal
vsp = 0;// Velocidade vertical
// Etiquetas
aereo = false;
// Ordens
dir = false;
esq = false;
pular = false;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Altere os valores como desejar e coloque o seguinte no evento Step para definir seu comportmento:
// Está no chão?
if (place_meeting(x,y+1,o_chao)) { // Se estiver,
aereo = false; // Esta etiqueta é falsa (não está aéreo)
vsp = 0; // Não há força vertical
}
// Se não estiver, está no ar
else {
aereo = true; // Esta etiqueta é verdadeira (está aéreo)
vsp += grav; // Força da gravidade é aplicada na vertical
}
// Alterar velocidade baseado na direção
if (dir)
hsp = veloc;
else if (esq)
hsp = -veloc;
else
hsp = 0;
// Ao pular
if (pular) {
pular = false; // Parar de dar a ordem de pulo
vsp = -forcaPulo; // Pular
}
// Velocidade horizontal
repeat (ceil(abs(hsp))) // Tentar andar de 1 em 1 por vez, num total de vezes igual a hsp
{
if (place_meeting(x + sign(hsp), y, o_chao)) { // Se o caminho estiver bloqueado
hsp = 0; // Parar
} else { // Se não
x+= sign(hsp); // Mover horizontalmente 1
}
}
// Velocidade vertical
repeat (ceil(abs(vsp))) // Tentar mexer de 1 em 1 por vez, num total de vezes igual a vsp
{
if (place_meeting(x, y + sign(vsp), o_chao)) { // Se o objeto estiver logo acima/abaixo de um o_chao
vsp = 0; // Parar
} else if (vsp != 0) { // Se não
y+= sign(vsp); // Mover verticalmente 1
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Depois temos na colisão com o objeto "sólido" (mesmo se não estiver marcado como sólido):
// Refazer movimento horizontal, desfeito por voltar 1 quadro antes da colisão pelo Game Maker
if ((hsp > 0 && place_free(x+1,y)) || (hsp < 0 && place_free(x-1,y)))
x += hsp;
// Encaixar verticalmente no chão se tiver colidido num "chão abaixo do player"
if (y < other.y) {
while (!place_meeting(x,y+1,o_chao))
y += 1;
}
// Em todos os casos, parar verticalmente
vsp = 0;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Coloque o evento press left:
esq = true;
dir = false;
Coloque o evento Coloque o evento release left::
esq = false;
Faça o mesmo para o evento press right mas usando as variáveis adequadas.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Por fim coloque em um evento press space:
if (!aereo) // Só pular se não estiver no ar
pular = true;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Não esqueça de ler bem os comentários para entender a lógica de como isso acontece!