Escolar Documentos
Profissional Documentos
Cultura Documentos
Este documento ou qualquer parte dele não pode ser reproduzido ou usado de forma alguma
sem autorização expressa, por escrito, do autor ou editor.
Tópicos
1. Introdução
a. Como criar um jogo?
b. O que é programar?
c. O que iremos aprender nesse curso
d. Introdução ao Game Maker
2. Movimentação e Colisão
a. Movimentação Básica e Projéteis (Coordenadas e Direções)
b. Movimentação Melhorada e Colisão Perfeita (Cálculo de Direção e Loops)
c. Inimigos (States e Scripts)
d. Câmera Suave (Camera e Views)
e. Orientação de Sprite para o Mouse/Teclado (Sprites e Switch)
f. Vida e receber dano (Draw GUI e States do jogador)
g. Novos inimigos/Adicionando Sprites (Parents)
h. Placas (Textos)
i. Status e Level Up (Definir dano, vida e outros status)
j. Nova arma para o jogador (Hitbox e Ataque ‘melee’)
k. Mostrar Dano causado
l. Roll/Dash (Invunerabilidade)
m. Npcs (Diálogo e Paths)
n. Ciclo Dia e Noite
o. Inventário e Drop de Inimigos
p. Craft
q. Plantação
r. Construção
s. Bosses
Introdução
O que é programar?
Durante o curso, nós iremos abordar muitas das áreas envolvidas no
desenvolvimento do jogo, algumas delas são:
● Programação
● Game Design
● Pixel Art
● SFX (Efeitos sonoros)
● VFX (Efeitos visuais)
E eu estou muito ansioso para ver o que vocês irão criar com esse
curso!!
Introdução ao Game Maker
(Recomendo manter o Game Maker aberto a partir desse tópico e testar tudo que for
apresentado a partir de agora)
Se você nunca abriu o Game Maker ou nunca mexeu com programação essa
sessão é muito importante, então vamos começar.
A primeira vez que você abrir o Game Maker e iniciar seu projeto, você irá ver essa
tela, esse é lugar onde iremos criar nosso jogo. À esquerda (talvez direita para você)
temos as nossas pastas, e elas representam as diferentes funcionalidades do Game
Maker, e o que podemos criar nele, por exemplo: objects, sprites, tile sets, fonts, paths,
etc… Porém, iremos ver um por um com muita calma. Começando pelos ‘Objects’.
Obs: é possível alterar a linguagem do Game Maker para português se necessário, porém
eu recomendo seguir com ele em inglês pois a programação utiliza palavras em inglês e acho
mais fácil entender dessa maneira, recomendo tentar utilizar o Google Tradutor se possível, mas
abaixo ireia mostrar como alterar a linguagem.
(Selecione a opção ‘File’ -> ‘Preferences’ -> ‘General Settings’ -> IDE Language)
Então para começar iremos criar o nosso primeiro objeto, para isso basta seguir os
seguintes passos:
(Clique com o botão direito na pasta ‘Objects’, selecione ‘Create’ e depois ‘Object’)
Parabéns!! Você criou seu primeiro objeto!! Porém é bom primeiro entendermos
o que é um objeto, então vamos lá!
O objeto é onde iremos executar todo o nosso código, então tudo que
acontecerá dentro do nosso jogo será executado em um objeto, desde um
personagem até um menu. Essa é a ideia básica, temos muito mais para entender
porém com o tempo cobriremos todos os tópicos.
Agora se você criou seu ‘Object’ você irá ver essa janela:
Essa é a janela que mais iremos ver durante nosso curso, é aqui onde
escreveremos nossos códigos, mas primeiro vamos entender, como funciona a
programação e quais são os básicos que precisamos entender.
Resumidamente, a programação é a maneira como nos “comunicamos” com o
computador. Para nos comunicarmos utilizamos uma linguagem de programação que
é interpretada pela Engine, no nosso caso a engine é o Game Maker e a linguagem de
programação é a GML (Game Maker Language), porém temos muitas engines por aí
que utilizam muitas linguagens diferentes, ela se diferenciam de alguns maneiras mas
na maioria a lógica que seguimos para programar é a mesma, por exemplo a Unity,
Godot, Unreal, etc…
● variavel = 5;
● numero = 5;
● asuidhsaiudha = 5;
● umapalavraqualquer = 5;
Onde a palavra é uma referência para o valor que atribuímos, então se nós
criarmos essa variável ‘numero = 5’ e nós definirmos para o Game Maker desenhar
essa variável na tela, ele desenharia o número ‘5’.
Agora que entendemos a ideia geral de uma variável, vamos esclarecer o que
podemos armazenar dentro das variáveis. Os tipos de informações que podem ser
armazenadas são: Números Reais, “Strings”, Integers e Booleans.
● Real Numbers: Número reais são números que podem possuir decimais. Tanto
números negativos quanto positivos.
○ Exemplo: 23, -12, 6.99, 5/2, 3.14, etc…
● Strings: Strings são apenas letras, então se definirmos uma variável como
“Jogo” ela é uma string. É importante lembrarmos que strings devem ser
escritas entre aspas (“”).
○ Exemplo: “Jogo”, “Gabriel”, “Programar”, etc…
● Integer: Integrais são números que não possuem casas decimais. Podem ser
tanto números positivos quanto negativos.
○ Exemplo: 1, 2, 3, 123123, -28193, -100, 3456, 0, etc…
● Booleans: Boolean é um tipo de informação que só pode assumir dois valores
diferentes, verdadeiro ou falso. Onde uma variável definida como verdadeira
pode ser interpretada pelo valor 1 e uma variável definida como falsa pode ser
interpretada pelo valor 0.
○ Exemplo: true, false, 1, 0.
Obs: no futuro abordaremos melhor esse tópico, mas é bom termos em mente que alguns tipos
de variáveis não poder ser combinadas, por exemplo, não podemos juntar uma ‘String’ com um número,
seja ‘Integer’ ou ‘Real Numbers’, para que isso seja possível precisamos converter o número em uma
string, no caso do Game Maker isso pode ser feito utilizando a função string() (variável que queremos
converter).
Agora que abordamos as variáveis vamos dar uma olhada na seguinte imagem:
O que vemos nessa imagem é a estrutura básica de um código no Game Maker,
para simplificar vamos abordar da seguinte maneira:
Podemos ler da seguinte maneira esse código: “Se (if) a variável (variavel) for
igual (==) a 5, a variável (variavel) será (=) 10”
Agora se pegarmos apenar o que coloquei em parênteses temos:
if variavel == 5 variavel = 10;
Aqui podemos ver que a expressão é ‘variável == 5’, ou seja, o código só irá
acontecer se a variável (variavel) for exclusivamente igual a 5, então se
definíssemos:
variavel = 6;
O expressão não seria mais válida e o código não seria executado.
Porém temos mais um detalhe, no exemplo acima nós utilizamos o que
chamamos de operadores, no caso apresentado o operador é o ‘==’ e ‘=’, abaixo
iremos ver alguns operadores presentes no Game Maker:
Essa é uma função utilizada para checar se alguma tecla do nosso teclado está
sendo pressionada, só que para utilizarmos essa função, precisamos definir qual tecla
queremos checar, isso é o que chamamos de argumento da função. Então para
utilizarmos essa função da maneira correta poderíamos fazer da seguinte maneira:
Movimentação
Começaremos nosso jogo programando a movimentação do nosso
personagem, se você seguiu até aqui você já possui um ‘objeto’ criado, caso contrário
siga os passos apresentados no tópico ‘Introdução ao Game Maker’.
Antes de programarmos, vamos criar uma sprite simples para o nosso
personagem. Sprites representam tudo o que for visual no nosso jogo. Para criarmos
nossa Sprite faremos o seguinte:
(Clique com o botão direito na pasta Sprites’, selecione ‘Create’ e depois ‘Sprite’)
Nesta área podemos desenhar o que quisermos, o Game Maker possui suas
próprias ferramentas para criação de sprites, porém no momento só selecionaremos a
ferramenta balde (‘F’), uma cor e preencheremos nossa sprite para formar um
quadrado.
Então esse é o nosso primeiro personagem!! Agora iremos alterar o seu nome,
para isso, faremos o seguinte:
(Botão direito na nossa sprite -> Rename/Ou podemos clicar na sprite e pressionar F2)
Agora falaremos rapidamente como fazemos as nomenclaturas do Game
Maker, não existe uma regra, mas para fins de organização e para facilitar nossa vida,
utilizamos algumas abreviaturas, por exemplo:
● Em Sprites utilizamos a abreviatura spr, então podemos criar uma Sprite com o
nome ‘spr_personagem’, ‘spr_parede’, ‘spr_inimigo’, etc…
● Em Objetos utilizamos a abreviatura obj, então pode ficar ‘obj_personagem’,
‘obj_parede’, ‘obj_inimigo’, etc…
Agora precisamos associar a nossa sprite ao nosso objeto para isso podemos
fazer de duas maneiras:
Bom, temos nosso código funcionando, porém nós podemos fazer algumas
mudanças para otimizá-lo, para começar, o valor da “velocidade” do nosso
personagem que estamos utilizando é 2, ou seja, o tanto de pixels que ele se mexe por
frame, agora vamos pensar no caso onde queremos alterar esse valor, então toda vez
que formos mudar, vamos ter que passar por cada código e mudar o valor de 2 para 3
por exemplo.
Agora imagine que estamos usando esse valor em 10 códigos diferentes, nós
teríamos que ir em todos os 10 códigos e alterar o seu valor, porém existe uma maneira
mais simples para resolver esse problema, para isso, vamos falar sobre um novo
evento dos objetos: Create Event.
No ‘Step Event’ que estávamos utilizando até então, o nosso código é executado
TODO FRAME DO JOGO (60 vezes por segundo), sem parar, no caso do ‘Create Event’,
o código que escrevermos só será executado UMA VEZ QUANDO O OBJETO POR
CRIADO. Então a sequência dos eventos até então será:
Iniciar o jogo
↧
Objeto é criado
↧
Código no Create Event é executado UMA ÚNICA VEZ
↧
Código do Step Event começa a executar
O código acima faz com que quando APERTARMOS a tecla ‘Shift’, a nossa
variável spd seja alterada para o valor 5 e quando SOLTAMOS a tecla Shift o valor da
variável retorna para o inicial (2 no meu caso, mas você pode alterar da maneira que
quiser).
E essa é uma ideia básica de como utilizamos variáveis em nosso código.
Projéteis
Agora que temos nosso personagem se movento e podendo “correr” vamos
fazê-lo disparar projéteis simples, para isso vamos entender a ideia geral destes
projéteis, quando eu estou programando, eu gosto de colocar as minhas ideias em
uma sequência, por exemplo:
Pressionar botão esquerdo do mouse OU ‘espaço’
↧
Criar Projétil
↧
Projétil receber uma direção para seguir
↧
Projétil seguir a direção em uma velocidade
Então esses são os 4 passos para se criar um projétil, mas para começar, igual
nosso personagem, precisamos de uma SPRITE e um OBJETO para o projétil, então
começaremos pela sprite:
Esse nosso projétil eu nomeei ‘spr_projetil’ e alterei o tamanho para ser 32x32
(32 pixels de largura e 32 pixels de altura), você pode fazer isso seguindo a imagem
acima. Agora podemos criar um círculo para ser a sprite do nosso projétil:
Você pode criar a sprite que desejar para seu projétil, por enquanto manterei
esse simples círculo, agora iremos aprender algo sobre as sprites, chamado: “Origem
da Sprite” ou ‘Sprite Origin’, que se refere ao ponto que a sprite será criada a partir e
aquele é seu ponto inicial x e y:
Originalmente esse ponto é o 0x0 da sprite, ou seja, o ponto na esquerda
superior, abaixo preparei um gif para entendermos melhor como essa ‘Sprite Origin’
funciona:
Como podemos ver o ponto de origem é a ‘âncora’ da nossa sprite, então ela
altera a posição referente da sprite e também como ela rotaciona, normalmente,
iremos definir o ponto de origem para ser a parte central das nossas sprites, para isso
podemos fazer o seguinte:
Podemos ver que temos várias opções de pontos de origem pré-definidos,
porém por enquanto iremos escolher o ‘Middle Center’ que se refere ao centro da
nossa sprite.
Então iremos fazer a mesma coisa para a sprite do nosso personagem:
Agora criaremos o nosso objeto para o projétil, da mesma maneira que fizemos
com o nosso personagem, e nomearemos esse objeto de ‘obj_projetil’ e colocaremos
essa sprite que acabamos de criar nesse objeto:
Agora vamos programar para o nosso personagem criar esse projétil quando
clicarmos com o botão esquerdo do mouse OU com a tecla espaço, para isso
retornaremos ao ‘Step Event’ do nosso obj_personagem, e aqui faremos algo um
pouco diferente, no caso do nosso projétil nós temos 2 condições para criá-lo, com o
mouse e com o teclado, a função para criar com o mouse é:
Então nós poderíamos criar 2 condições ‘if’ uma para o mouse e outra para a
tecla espaço que fariam exatamente a mesma coisa (Criar o projétil):
Nós podemos usar a condição ‘or’ (que se traduz para ‘ou’ em português) para
unir as nossas 2 expressões, então se traduzirmos esse código ficaria algo como:
● “SE pressionarmos o botão esquerdo do mouse OU pressionarmos a tecla
espaço o código irá acontecer “
Então agora esse código possui 2 condições diferentes e se PELO MENOS UMA
FOR VERDADEIRA (true) o código irá acontecer.
Obs: Podemos escrever essa condição como ‘or’ ou ‘||’:
Nós podemos fazer a mesma coisa com a nossa movimentação, no momento
estamos utilizando as setas, mas podemos ao mesmo tempo utilizar o “AWSD” para
isso podemos fazer o seguinte:
Então agora já temos a codição para criar nosso projétil, e para criá-lo usamos a
seguinte função:
Sempre que tivermos funções onde temos mais que um argumento, utilizamos
a vírgula (‘,’) para separá-los. Como a função está acontecendo dentro do nosso
‘obj_personagem’ se utilizarmos x e y ele pegará o x e o y atual do nosso personagem.
Agora o terceiro argumento que essa função pede é o nome da Layer que
queremos criar esse novo objeto, se acessarmos nossa room novamente, podemos
ver no canto esquerdo a lista dos nossos Layer (camadas):
A Layer original que o Game Maker cria para todas as Rooms é chamada de
‘Instances’, e é nela que iremos criar o nosso projétil, então se retornarmos para o
nosso código, ele irá ficar dessa forma:
Então é assim que criamos novos objetos (instâncias) dentro do Game Maker,
porém nós estamos criando um projétil e no momento ele não se mexe para nenhuma
direção, então agora iremos programar o que é importante para que ele funcione, para
isso, vamos agora acessar o ‘obj_projetil’, no momento ele não possui nenhum evento,
então começaremos adicionar o ‘Create’:
Podemos ver que nossos projéteis já estão se mexendo, porém eles sempre vão
na mesma direção, então agora precisamos resolver isso, para isso vamos entender
como funciona a direção do Game Maker:
Por enquanto não iremos programar nada para o nosso inimigo, vamos retornar
para o nosso ‘obj_projetil’ e adicionar um novo evento:
Bom, com isso nosso projétil está meio que funcionando já, a gente pode criar,
ele assume uma direção e uma velocidade, e quando colide com o inimigo, se destrói,
acho que é isso então, acabamos por aqui :).
Mentira, não podemos deixar esses inimigos a solta, olha como eles são bravos,
pra isso precisamos que nossos projéteis causem dano neles e quando a vida chegar
a 0 eles sumam. Então, qual é a ideia da vida?
Vamos pensar o seguinte, podemos criar uma variável para esses inimigos que
represente a vida deles, então agora vamos abrir o nosso ‘obj_inimigo’ e adicionar um
evento ‘Create’:
Então ‘life’ será a variável que utilizaremos para controlar a vida do nosso
inimigo, porém só de criar essa variável não está acontecendo nada, precisamos
determinar alguma condição para que quando essa variável chegue a 0 (A vida do
nosso inimigo seja 0) o inimigo se destrua, então adicionaremos um evento ‘Step’ e
podemos colocar o seguinte código (Antes de olhar a resposta recomendo você tentar
fazer essa parte sem minha ajuda, posso dizer que utilizamos o operador para checar
se algo é menor):
Com isso nós completamos o básico de programação, ainda temos MUITO para
falar, quando digo o básico é introduzir a ideia geral da programação.
Obs: Quando criamos variáveis que terão seu valor alterado em sequência, costumamos atribuir
-1 apenas porque é necessário declarar algum valor.
Agora no evento ‘Step’, vamos atribuir para cada variável a tecla correspondente,
então ficará da seguinte maneira:
Bem simples até então, mas o que precisamos fazer para conseguir sair de um
ponto (A) e chegar ao outro (B)? A resposta são 2 coisas, velocidade e direção, então
se escolhermos uma direção para ir, e começarmos a andar, estamos nos movendo.
Podemos ver acima que os argumentos que essas funções pedem são os
mesmos, agora vamos entender exatamente o que é o ‘len’ e o ‘dir’:
Como já falamos nos projéteis, as direções no Game Maker são represetadas
pelos graus de uma circunferência:
O que essas funções fazem, é calcular qual é essa distância para chegarmos a
esse ponto, e elas fazem isso da seguinte maneira:
É importante perceber que só conseguiremos chegar ao ponto desejado, se
sormarmos o ‘lengthdir_x’ com o ‘lengthdir_y.
Agora vamos aplicar essa ideia em nosso código de movimentação, então para
começar, vamos criar 3 variáveis, hspd (para a velocidade horizontal), vspd (para a
velocidade vertical) e dir (para a direção).
Para começar, vamos entender primeiro do que se trata o ‘var’, existem alguns
tipos diferentes de variáveis que podemos criar no Game Maker:
● ‘Instance Variables’: a variável que utilizamos até agora (por exemplo: direita,
esquerda, baixo, etc…), que pode ser utilizada em qualquer lugar do objeto.
● ‘Local Variables’: a variável local é criada utilizando o ‘var’ e ela pode APENAS
ser utilizada no evento em que ela é declarada, e no final de todo frame, ela é
destruída (liberada da memória), e criada novamente se necessário no próximo
frame, utilizamos esse tipo de variável quando ela será utilizada APENAS no
evento específico em que é criada.
Obs: para diferenciar essa variável das ‘Instances Variables’, eu gosto de colocar um
underline (_) antes do nome.
○ Exemplo: var _xx = 2; var _numero = 5;
● ‘Global Variables’: as variáveis globais podem ser criadas e utilizadas em
QUALQUER objeto.
○ Exemplo: global.numero = 5; global.exemplo = ‘numero’;
Com isso já temos a direção para o nosso personagem seguir, agora só falta a
velocidade, mas isso nós também já temos!! A variável ‘spd’ que criamos no início,
então vamos aplicar essas 2 variáveis ‘dir’ e ‘spd’ nas funções ‘lengthdir_x’ e
‘lengthdir_y’, então ficará da seguinte maneira:
O que fizemos aqui é apenas colocar uma condição que checa se estamos
apertando qualquer tecla de movimento, ou seja, se qualquer tecla tiver valor de 1
(true) a nossa variável ‘spd = 2’ e se não estamos apertando nenhuma tecla, todas elas
tem o valor 0 (false) a nossa variável ‘spd = 0’
Agora a última coisa que precisamos fazer para finalizar essa movimentação é
alterar como fazemos nosso personagem correr, porque se você testar, verá que nosso
‘Shift’ não funciona mais para alterar a velocidade do personagem.
Para começar vamos apagar nosso código anterior:
E adicionar nosso novo código:
Aqui utilizamos uma nova condição ‘else’, então vamos “traduzir” esse código
para português:
“Se (if) estamos segurando a tecla Shift (keyboard_check(vk_shift)), nossa
variável spd é igual a 5 (spd = 5), caso contrário (else), a variável spd é igual a 0 (spd =
0)”
Se pegarmos apenas o que está dentro do parênteses temos:
if keyboard_check(vk_shift){
spd = 5;
}else{
spd = 0;
}
Então utilizamos a condição else, se queremos atribuir uma condição caso a
expressão seja verdadeira (true) ou false (false), nesse caso é VERDADEIRA SE
ESTAMOS PRESSIONANDO SHIFT e FALSA SE NÃO ESTAMOS (Lembrem-se de
utilizar as chaves (‘{}’))
Agora temos o seguinte em nosso jogo:
Podemos ver que ainda não temos colisão com a parede, mas isso é a próxima
etapa, também é possível ver que nosso personagem não se move mais rápido quando
andamos na diagonal.
Obs: O download desse projeto (tudo que fizemos até aqui) está disponível na página do curso,
se quiser checar os códigos é possível por esse arquivo.
Muito bem, esse é nosso primeiro código que utiliza uma lógica um pouco mais
complexa, se você conseguiu entender tudo até aqui é ótimo, porém se estiver com
dificuldades vá com calma, tente entender cada parte separada e depois ir unindo as
ideias, o começo da programação é a parte mais difícil, continue se esforçando que
tudo fará sentido.
Agora vamos falar sobre colisão, para começar vamos ver o seguinte código:
Toda sprite no Game Maker tem uma ‘Collision Mask’ que pode ser alterada no
editor da sprite:
Podemos descrever essa ‘Collision Mask’ como a “área que a sprite ocupa”, e é
ela que é utilizada para checar a colisão nesse nosso caso.
Agora entendendo o que a função ‘place_meeting’ faz vamos rever o código de
colisão:
Neste primeiro exemplo, a nossa função está sem a adição do hspd, então
temos (A área em vermelho na direita do nosso personagem representa o nosso
próximo movimento):
Para resolvermos isso, vamos utilizar algo chamado ‘Loops’, loops são
condições do Game Maker (como if e else que vimos até agora) que se repetem
determinados números de vezes enquanto a condição for verdadeira (true). Existem 3
tipos de loops principais (for, repeat e while), no caso da nossa colisão vamos utilizar
o while e mais pra frente veremos os outros 2.
Antes de tudo, é muito importante entender que os loops são executados em
UM ÚNICO FRAME, vamos ver a imagem a seguir:
Então vamos usar um exemplo em códigos agora, podemos traduzir while para
‘enquanto’, então vamos ver o exemplo a seguir:
Mais uma vez, vamos ‘traduzir’ esse código para português, então seria algo
como:
● “Enquanto (while) a nossa variável número (numero) for menor ou igual a 20
(<=), vamos adicionar +1 na variável número (numero++)”, agora se pegarmos
apenas o que está em parênteses:
while numero <= 20{
numero++;
}
Então o que está acontecendo no código de loop é o seguinte, primeiro ele entra
no loop e se pergunta “A variável numero é menor ou igual a 20?” se a resposta for sim
(se essa expressão for true) ele irá somar +1 na variável, e ele vai retornar e se
perguntar a mesma coisa novamente: “A variável numero é menor ou igual a 20?”, e
ele irá repetir até que essa variável número, seja um valor maior que 20.
Usaremos muito loops durante todo o nosso curso, então é muito importante
entendermos muito bem como funciona.
MUITO IMPORTANTE: O loop while é muito perigoso pois é muito fácil criarmos
um loop infinito, e nosso jogo irá travar, então por exemplo, vamos utilizar o seguinte
exemplo:
Neste caso, nós criamos um loop ‘while’ que irá acontecer ENQUANTO a nossa
variável numero for maior ou igual (>=) a 0, porém ela será PARA SEMPRE, pois
estamos adicionando +1 nesta variável, então esse loop NUNCA ACABARÁ, e isso fará
nosso jogo travar, pois ele nunca sairá do loop e consequentemente NUNCA IREMOS
PARA O PRÓXIMO FRAME. Então é muito importante sempre ter certeza que nosso
loop ‘while’ possui o que chamamos de CONDIÇÃO DE SAÍDA, ou seja, garantir que o
nosso loop ‘while’ termine.
Agora vamos aplicar esse loop em nosso sistema de colisão, para isso, o código
ficará da seguinte maneira:
Pode parecer muita coisa a princípio mas vamos entender aos poucos esse
código, para começar, como sempre, vamos “traduzir” esse código para o português:
● Enquanto (while) NÃO (!) estiver havendo colisão (place_meeting) na frente do
nosso personagem (x + sign(hspd)) com a parede (obj_parede), nos
aproximaremos mais da parede (x += sign(hspd)).
Temos muitas coisas que ainda não utilizamos anteriormente nesse código,
então vamos começar, o sign é uma função do Game Maker que vai converter
qualquer valor que colocarmos como argumento, para -1, 0 ou 1, dependendo se for
um valor negativo, zero ou positivo.
● Exemplos:
○ sign(5) = 1
○ sign(100) = 1
○ sign(-3) = -1
○ sign(-277) = -1
○ sign(0) = 0
Mas caso a resposta seja sim, então se o nosso personagem andar MAIS UM
PIXEL na direção que está indo e for colidir com a parede, ele sairá do loop e não irá
executar mais, então ficará parado.
Esse é o código que utilizamos para a colisão perfeita, porém nesse caso
estamos checando apenas a colisão na HORIZONTAL, então precisamos fazer a
mesma coisa para a vertical:
Esse é um código muito mais complexo do que o que vimos anteriormente, não
se preocupe em entender tudo o que está acontecendo no momento, o importante
dessa parte de colisão perfeita é entender o porque de fazer o código desta maneira, a
lógica que utilizamos, então se você conseguiu entender que ESTAMOS CHECANDO
SE EXISTE PELO MENOS UM PIXEL SOBRANDO ENTRE O PERSONAGEM E A PAREDE
E EXECUTAMOS O LOOP PARA NOS APROXIMARMOS UM PIXEL POR VEZ ATÉ NÃO
HAVER MAIS ESPAÇO, isso é o que importa no momento. Também tenha calma, aos
poucos as coisas irão fazer sentido, eu mesmo tive que escrever e testar esse código
muitas vezes até entendê-lo por completo quando estava aprendendo!!