Página 1 de 1

[GEN-TPD]#IAJ Aula 01 - Movimentação Top Down

Enviado: Sex Abr 29, 2016 3:25 pm
por All-x

INTRODUÇÃO A JOGOS

Aula 01 - Movimentação Top Down

(Atualizado 08/02/2015)



Depois de estudar a teoria (Introdução à GML), vamos começar a fazer nosso primeiro jogo. Mas antes de começar realmente, você precisa entender sobre o posicionamentos dos elementos na tela do jogo.

Em um plano bidimensional (2D) temos dois eixos (X e Y).

X: é a posição horizontal de algum elemento.

Y: é a posição vertical de algum elemento. OBS: Na matemática que nós estudamos na escola quando um elemento esta para cima o y é positivo e quando esta para baixo é negativo. Na computação isso é invertido, em cima é negativo e embaixo é positivo.

Imagem

Posição absoluta:

A posição absoluta no Game Maker quer dizer que as posições x e y estão em relação à room.

Exemplo: vamos criar um objeto na posição X = 10 e y = 10 na room:

Código: Selecionar todos

instance_create(10, 10, obj_player)
Posição relativa:

A posição relativa é a posição x e y em relação à outro valor.

Exemplo: Vamos criar um objeto balana posição  y: -10 em relação ao player. Para isso o código usado é:

Código: Selecionar todos

instance_create(x, y - 10, obj_player)
O x e o y presentes no código são as posições do objeto na room, em que o código foi colocado. Ou seja se o x do objeto na room é 32 é como se fosse 32+10.

Começando a movimentar:

Antes de tudo baixe esta engine:

[GM:S] DOWNLOAD DA ENGINE

[GM8] DOWNLOAD DA ENGINE

Guarde essa engine, usaremos ela nas próximas aulas.

Depois de baixar vamos começar a mover nosso player. Vamos ao step do player. Coloque o seguinte código:

Código: Selecionar todos

// Direita
if keyboard_check(vk_right)
{
    sprite_index = spr_direita;
    
    if place_free(x + 4, y) 
    {
        x += 4;
    }
}
Saiba mais sobre a função place_free, no tutorial abaixo:

Colisões simples

Tradução:

Código: Selecionar todos

// Direita
se tecla_estiver_sendo_pressionada(tecla_direita)
{
    sprite_atual = spr_direita
    
    se estiver_livre_de_colisão_com_sólidos(x + 4, y)
    {
        x += 4
    }
}
- A função keyboard_check, verifica se alguma tecla esta sendo pressionada constantemente.

- A variável local sprite_index, muda a sprite do objeto.

- A função place_free, verifica se tais posições x e y estão livres de colisões com objetos sólidos.

- A variável x guarda a posição horizontal do objeto em relação a room. e usamos a operação matemática de adição para move-lo para direita.

Se entendeu bem como funciona as posições x e y, não será problema fazer as outras movimentações. Então o código final do step será este:

Código: Selecionar todos

// Direita
if keyboard_check(vk_right)
{
    sprite_index = spr_direita;
    
    if place_free(x + 4, y) 
    {
        x += 4;
    }
}

// Esquerda
if keyboard_check(vk_left)
{
    sprite_index = spr_esquerda;
    
    if place_free(x - 4, y) 
    {
        x -= 4;
    }
}

// Cima
if keyboard_check(vk_down)
{
    sprite_index = cima;
    
    if place_free(x, y - 4) 
    {
        y -= 4;
    }
}

// Baixo
if keyboard_check(vk_down)
{
    sprite_index = baixo;
    
    if place_free(x, y + 4) 
    {
        y += 4;
    }
}
Engine completa:

[GM:S] DOWNLOAD DA ENGINE

[GM8] DOWNLOAD DA ENGINE

Agora entenda algo muito importante, o valor adicionado nas posições x e y é 4, pois ele é múltiplo de 32, que é a grade da room e a largura e altura de seus objetos. Tente mudar todos esse 4 para 5, dificilmente você passará nos cantos estreitos do jogo. Mas porque? Por que as mudanças de posição são como tele transportes, e como ele esta checando sempre o que esta em colisão ele pode parar um pouco antes do previsto. Mude todos esses 4 para 32, que você entenderá melhor o que eu quiz dizer com tele transporte.

Mas aí tu me pergunta: Não poderei usar outros valores além desse múltiplos?

Pode sim. Só teríamos que mudar nosso código usando um loop repeat:

Código: Selecionar todos

// Direita
if keyboard_check(vk_right)
{
    sprite_index = spr_direita;
       
    repeat(7)
    {
        if place_free(x + 1, y)
        {
            x += 1;
        }
    }
}
Repare que mudamos o valor de 4 para 1, logo ele teria velocidade 1. Mas o loop repeat ocorre 7 vezes, então no mesmo frame (step) o repeat faz nossa expressão ocorrer 7 vezes (Ou seja, velocidade vai ser 7). Assim temos uma checagem de colisão perfeita que checa pixel por pixel não importando o número de vezes que ocorra. Isso chama-se pixel perfect.

Mais sobre o loop repeat na aula abaixo:

#IEM Aula 06 - For, do, until e repeat

Até mais!!!

Próxima aula: Tiro Top Down

FLWS!

Re: [GEN-TPD]#IAJ Aula 01 - Movimentação Top Down

Enviado: Qui Out 27, 2016 5:40 pm
por dreamaster
Os links para baixar as engines estão fora do ar.

Re: [GEN-TPD]#IAJ Aula 01 - Movimentação Top Down

Enviado: Qui Fev 16, 2017 10:12 am
por chicoweb
Ressucitei esse post porque também tava precisando dessa engine.
Alguem tem ela aí por favor (Ou uma outra boa também)?
Os links do alex estão quebrados.

Re: [GEN-TPD]#IAJ Aula 01 - Movimentação Top Down

Enviado: Qui Fev 16, 2017 10:36 am
por gabrielsch
dreamaster escreveu:Os links para baixar as engines estão fora do ar.
chicoweb escreveu:Ressucitei esse post porque também tava precisando dessa engine.
Alguem tem ela aí por favor (Ou uma outra boa também)?
Os links do alex estão quebrados.
Provavelmente o exemplo está perdido, reservei um tempinho para fazer algo no mesmo estilo, veja se agrada os dois. https://goo.gl/PdjhfW

Re: [GEN-TPD]#IAJ Aula 01 - Movimentação Top Down

Enviado: Qui Fev 16, 2017 2:00 pm
por chicoweb
gabrielsch escreveu:
dreamaster escreveu:Os links para baixar as engines estão fora do ar.
chicoweb escreveu:Ressucitei esse post porque também tava precisando dessa engine.
Alguem tem ela aí por favor (Ou uma outra boa também)?
Os links do alex estão quebrados.
Provavelmente o exemplo está perdido, reservei um tempinho para fazer algo no mesmo estilo, veja se agrada os dois. https://goo.gl/PdjhfW
Seu link tá dando erro 404 aqui pelo menos.
Eu também fiz uma para GMS baseado no tutorial do Alex, so tive que fazer algumas correções.
Download engine movimento top down

Correções:

sprite_index substituido por image_index
O bloco que simula parede tem que ser solido.