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!