10 de agosto de 2014

Movimento em 8 Direções

Existem diversas maneiras de fazer com que um objeto movimente-se no Game Maker, tudo depende do tipo de projeto que está sendo desenvolvido. Um jogo de plataforma terá movimentação diferenciada de um simulador de voo, por exemplo.

Este tutorial tem como objetivo explicar como criar movimento em 8 direções, geralmente utilizado no desenvolvimento de jogos Top-Down e Isométricos.

Atualização 19/04/2015

Após 6 meses da publicação deste artigo era de se esperar que eu aprendesse novas 'técnicas'. Melhorei um pouco o código de movimento em 8 direções (código abaixo). Sugiro também olharem meu novo tutorial: Tutorial sobre Movimento Radial, que é uma espécie de correção a esse tipo de movimento (válido para jogos Top Down).


vertical = (keyboard_check(ord('S')) - keyboard_check(ord('W')))
horizontal = (keyboard_check(ord('D')) - keyboard_check(ord('A')))

if !(vertical = 0 && horizontal = 0// Checa se há movimento na vertical ou na horizontal
{
    horizontal *= velocidade
    vertical *= velocidade
    if !place_meeting(x + horizontal, yobj_wall)
    {
        x += horizontal
    }
    if !place_meeting(xy + vertical, obj_wall)
    {
        y += vertical
    }
}


Método 1


Create Event:

velocidade = 3

Keyboard - Any Key Event:

if keyboard_check(ord('A'))
{
    x -= velocidade
}
if keyboard_check(ord('D'))
{
    x += velocidade
}
if keyboard_check(ord('W'))
{
    y -= velocidade
}
if keyboard_check(ord('S'))
{
    y += velocidade
}

Definimos a variável "velocidade" no Create Event pois este evento é checado apenas uma vez pelo Game Maker, que é quando o objeto é criado no jogo. Além disso, caso mudemos de ideia quanto a velocidade do personagem, não precisaremos mudá-la em todo lugar onde ela é usada, apenas alteramos o valor dela e todas operações que utilizem a variável "velocidade" passarão automaticamente a utilizar o novo valor.

Quando adicionamos ou subtraimos um valor às coordenadas X e Y no Game Maker, o programa faz com que o objeto "pule" aquele valor em pixels, sempre em relação à origem do objeto, que é definida no sprite. Portanto, caso esse valor seja maior que o tamanho do sprite, o pulo passará a ser perceptível como um movimento descontínuo.

O comando if keyboard_check confere se as teclas em vermelho estão sendo pressionadas e, no caso de estarem, executam a ação desejada. Se duas ou mais das teclas estiverem sendo pressionadas, o programa executará as ações e fará a soma das variações. Portanto, se A e D estiverem sendo pressionadas, o personagem estará se movimento -4 pixels em X e +4 pixel em X, o que faz com que o personagem fique parado. Se D e W estiverem sendo pressionadas, então o personagem se moverá na direção nordeste.

Método 2

Create Event:


velocidade = 3


Step Event:

seta_direita = keyboard_check(vk_right)
seta_esquerda = -keyboard_check(vk_left)
seta_baixo = keyboard_check(vk_down)
seta_cima = -keyboard_check(vk_up)

movimento_horizontal = seta_esquerda + seta_direita
movimento_vertical = seta_cima + seta_baixo
velocidade_horizontal = movimento_horizontal * velocidade
velocidade_vertical = movimento_vertical * velocidade

x += velocidade_horizontal
y += velocidade_vertical

Assim como no método 1, definimos a variável "velocidade" no Create Event pelos mesmos motivos. Para entender este método, primeiro é necessário entender como a função keyboard_check funciona. Caso a tecla definida na função keyboard_check(vk_anykey), que está em vermelho, esteja sendo pressionada, a função retorna o valor 1, que é o mesmo que true (verdadeiro). Caso contrário, o valor retornado será 0, que é o mesmo que false. O movimento horizontal resulta da soma das teclas direita e esquerda, sendo assim utilizamos o sinal de (-) antes da função da "tecla esquerda" (vk_left) para mudar o valor para -1 quando a tecla estiver sendo pressionada. O mesmo vale para a "tecla cima" visto que no Game Maker o eixo Y é negativo para cima e positivo para baixo.

Para X ou Y três situações são possíveis:

Nenhumas das teclas pressionadas: O Resultado da soma das teclas será 0, pois 0 + 0 = 0.
Uma das teclas pressionada: O resultado será 1 ou -1, dependendo de qual delas foi pressionada.
As duas teclas pressionadas: O resultado será 0, pois 1 + (-1) = 0.

A única situação em que haverá movimento, para X ou Y, será quando apenas uma tecla for pressionada. O resultado da operação será multiplicado pela velocidade do personagem, que resultará na movimentação do mesmo. No caso de uma tecla de X e uma de Y serem pressionadas simultâneamente, ocorrerá o movimento diagonal.

Nenhum comentário :

Postar um comentário