GM Tutorial - Platform Games Ingles PT-BR
GM Tutorial - Platform Games Ingles PT-BR
GM Tutorial - Platform Games Ingles PT-BR
Criar um bom jogo de plataforma não é algo trivial, tampouco com o Game Maker.
Há três aspectos importantes a serem levados em conta:
• Criação de movimento natural para o personagem.
• Criar variação suficiente nos monstros, no plano de fundo, etc.
• Projetar cuidadosamente os níveis de modo que sejam divertidos
de jogar e se tornem cada vez mais difíceis.
Neste tutorial, você aprenderá a criar um jogo de plataforma simples no Game Maker.
Criaremos o jogo em várias etapas. As várias etapas estão disponíveis como jogos
editáveis na pasta Examples (Exemplos). Eles consistem em apenas um nível para
demonstrar algum aspecto específico. Você pode usá-los como base para seus
próprios jogos de plataforma.
O básico
Começaremos com o jogo de plataforma mais simples. Você pode encontrá-lo no
arquivo platform_1.gm6. Em cada jogo de plataforma, há dois objetos básicos: o
personagem que é controlado pelo jogador e um objeto de bloco que é usado para os
pisos (plataformas) sobre os quais o jogador pode andar. O mesmo bloco costuma ser
usado para as paredes pelas quais o jogador não pode passar. Precisamos de dois
sprites: um para o personagem e outro para o bloco. Para o personagem, usamos uma
bola simples. Para o bloco, usamos um quadrado preto (não transparente). Criamos
dois objetos. O objeto bloco é simplesmente um objeto sólido que não tem eventos ou
ações. Ele simplesmente fica lá. O objeto do personagem é muito mais complicado.
Movimento
1
O aspecto crucial que tratamos nesta primeira seção é como definir o movimento do
personagem. O problema é que o personagem deve andar sobre os pisos. Ele não deve
cruzar o piso. Se o personagem pular ou cair de uma plataforma, ele deverá aterrissar
corretamente na plataforma seguinte. Há várias maneiras diferentes de o personagem
andar, pular e cair. Diferentes jogos de plataforma usam modos diferentes.
Normalmente, nós apenas
2
use três teclas para controlar o movimento. A tecla de seta para a esquerda deve
mover o personagem para a esquerda, a tecla de seta para a direita deve movê-lo para
a direita e a tecla para cima ou a tecla de espaço o faz pular.
Saltos
Em seguida, precisamos do movimento vertical. Isso é mais difícil. Para que o
personagem caia, podemos usar a gravidade. Mas ele deve parar de se mover quando
atingirmos o chão. Além disso, você normalmente quer uma velocidade máxima de
queda, caso contrário, o personagem se moverá rápido demais. (Isso não é muito
agradável, mas também pode causar problemas na implementação. Por exemplo, o
personagem pode cair em um piso se ele se mover muito rápido). Para resolver esse
problema, no evento de passo do personagem, verificamos se a posição logo abaixo
do personagem está livre de colisão. Em caso afirmativo, o personagem está no ar e
definimos a gravidade como um valor positivo. Caso contrário, nós a definimos como
0. Também verificamos a variável vspeed, que indica a velocidade vertical. Se ela
for maior que 12, nós a definimos novamente como 12. Dessa forma, limitamos a
velocidade vertical a 12. Portanto, o evento tem a seguinte aparência:
3
Em seguida, temos que aterrissar corretamente no chão. Isso é mais difícil do que
parece. Isso ocorrerá quando o personagem colidir com o objeto de bloco. Nesse
evento de colisão, devemos definir o movimento vertical como 0. Mas isso pode
deixar o personagem um pouco suspenso no ar, acima do chão. (O motivo é que o
personagem é colocado de volta em sua posição anterior à colisão). Para isso,
queremos mover o personagem para o ponto exato onde ocorre a colisão. Felizmente,
há uma ação para isso no Game Maker:
Usamos essa ação. Como direção, indicamos a variável direction, que é a direção
atual de movimento da instância. Como distância máxima, especificamos 12 (embora
isso não seja realmente necessário aqui):
4
Portanto, o evento total de colisão com o bloco é o seguinte:
Você poderia argumentar que só devemos fazer isso quando atingirmos um piso
abaixo de nós. Mas, na verdade, também devemos nos mover para a posição de
contato se atingirmos um piso por baixo ou uma parede pela lateral. Há um aspecto
importante aqui que geralmente causa problemas: Presumimos que o personagem em
sua posição anterior está de fato livre de colisões. É de se esperar que isso aconteça,
mas nem sempre é o caso. Um erro que geralmente é cometido é que, quando o
personagem tem uma imagem animada, a máscara de colisão também muda a cada
etapa. Isso pode significar que a nova imagem no local anterior ainda causa uma
colisão. Portanto, é melhor certificar-se de que o personagem tenha uma máscara de
colisão (consulte também a próxima seção).
Por fim, temos de permitir que o personagem salte quando a tecla de seta para cima for
pressionada. Mas isso só deve acontecer quando o personagem estiver no chão.
Portanto, primeiro testamos se a posição abaixo do personagem cria uma colisão e, em
caso afirmativo, definimos a velocidade vertical
por exemplo, para -10. Talvez seja necessário brincar um pouco com o valor de 10
5
para a velocidade vertical e o valor de 0,5 para a gravidade para obter o movimento
desejado.
6
Agora a base para o jogo de plataforma está pronta. Projete um nível com alguns
pisos e paredes, construídos a partir de instâncias do objeto de bloco. Coloque uma
instância do personagem na sala e pronto.
Gráficos melhores
O jogo de plataforma básico que criamos na seção anterior funciona, mas tem uma
aparência bastante ruim. Há dois aspectos que queremos alterar: a aparência do
jogador e a aparência do plano de fundo. O jogo adaptado pode ser encontrado no
arquivo platform_2.gmk.
Em jogos mais avançados, você provavelmente desejará usar sprites animados. Nesse
caso, você também precisará de um sprite para o personagem quando ele não estiver
se movendo. Além disso, talvez você queira adicionar sprites para o personagem
pular, cair, atirar etc. Nesse caso, você terá de alterar o sprite em vários locais nos
eventos. Em particular, no evento sem tecla Keyboard, você provavelmente desejará
definir o sprite como o que não está se movendo.
Como alternativa, você pode desenhar o sprite correto no evento Draw com base na
situação. Por exemplo, você pode verificar se xprevious<x para descobrir se o
personagem se moveu para a direita. Conforme indicado anteriormente, é melhor
7
certificar-se de que todos os sprites tenham a mesma caixa delimitadora e que não
haja verificação precisa de colisão.
8
As plataformas e paredes
Em segundo lugar, queremos melhorar o plano de fundo e as plataformas. Aqui
usamos uma técnica padrão. Em vez de usar objetos para todos os diferentes
elementos de parede e piso, usamos os chamados ladrilhos. Os ladrilhos são partes de
imagens de fundo desenhadas em determinados locais da sala. Eles não têm eventos
associados nem criam colisões. A parte boa é que eles são rápidos e usam pouca
memória. Portanto, você pode criar salas grandes sem a necessidade de imagens
grandes.
Para adicionar ladrilhos aos cômodos, primeiro você precisa de uma imagem de fundo
que contenha os ladrilhos. Os blocos em uma imagem de plano de fundo devem ter
um tamanho fixo e uma pequena borda (1 pixel) entre eles, de modo que possam ser
facilmente separados. Um pequeno conjunto de blocos é fornecido na pasta
Resources. Nós o adicionamos como um recurso de plano de fundo transparente
chamado back_tiles. Ao adicioná-lo ao jogo, nas propriedades do plano de fundo,
indique que ele deve ser usado como um conjunto de blocos e preencha o tamanho e a
separação corretos dos blocos, como segue:
Agora, ao criar uma sala, você pode clicar na guia azulejos. Você pode selecionar o
conjunto de blocos (ou seja, o recurso de plano de fundo apropriado). Agora você
pode desenhar blocos clicando no bloco apropriado e, em seguida, colocando-os na
sala, como faria com os objetos. O botão direito do mouse exclui as peças. Use sua
imaginação para criar salas desafiadoras. (Observe que você pode colocar blocos em
diferentes camadas de profundidade adicionando camadas. Por exemplo, você pode
criar uma camada de peças que ficam na frente dos personagens em movimento. Não
as usaremos aqui, mas elas são ótimas para dar um melhor efeito 3D).
9
No entanto, ainda há um problema. Conforme indicado acima, os blocos são apenas
gráficos bonitos. Eles não geram eventos ou colisões. Portanto, o personagem cairia
direto através deles. Para evitar isso, ainda precisamos dos objetos de bloco que
tínhamos antes. Colocamos os objetos de bloco nos locais apropriados em cima das
paredes e plataformas que você criou com os blocos no plano de fundo. Agora, ao
tornar os objetos de bloco invisíveis, você não verá os blocos pretos, mas os belos
ladrilhos. Mas os objetos de bloco estão realmente lá, portanto o personagem não
poderá passar pelas paredes e aterrissará nas plataformas.
10
Pode haver um problema aqui. Os objetos de bloco 16x16 serão muito grandes para
cobrir bem o plano de fundo. Portanto, queremos criar alguns outros objetos de bloco
de tamanho 16x8 e 8x16. Novamente, nós os tornamos sólidos. Para evitar ter de
especificar eventos de colisão com eles também, usamos o mecanismo pai. Esse é um
mecanismo muito poderoso que você deve aprender a usar. Se um objeto A for um pai
do objeto B, B se comportará como um caso especial de A. Ele herdará todo o
comportamento de A (a menos que você o substitua por outro comportamento). Além
disso, as colisões com B são tratadas da mesma forma que as colisões com A.
Portanto, para os blocos menores, definimos o pai como o bloco maior. Dessa forma,
eles serão tratados da mesma forma que o bloco maior.
Ameaças e guloseimas
Ficar pulando de plataforma em plataforma é um tanto entediante. Você
definitivamente precisa de mais desafios e objetivos. Nesta seção, tratamos de alguns
deles. Dê uma olhada no jogo platform_3.gmk para ver o resultado.
Monstros
Primeiro, vamos adicionar alguns monstros. Criaremos dois monstros, um que se
move para a esquerda e para a direita em uma plataforma e outro que voa para a
esquerda e para a direita no céu. Pular em cima dele pode esmagar o primeiro; o
segundo deve ser evitado o tempo todo.
Vamos começar com o monstro que se move sobre as plataformas. Precisamos de dois
sprites para ele, um com o monstro voltado para a esquerda e o outro com o monstro
voltado para a direita. Novamente, é melhor não usar a verificação precisa de colisão
pelos mesmos motivos indicados acima e escolher uma caixa delimitadora relevante.
Agora, criamos o objeto monstro. No evento de criação, deixamos que ele se mova
para a direita com uma velocidade específica. Sempre que atingir uma parede, ele
reverterá sua velocidade horizontal. Para definir o sprite correto para o monstro,
usamos o evento End Step. Esse evento ocorre logo antes de as instâncias serem
desenhadas. Nele, definimos o sprite correto com base no valor da variável hspeed
que indica a velocidade horizontal. Se ela for menor que 0, deixaremos o monstro
virado para a esquerda e, caso contrário, para a direita. (Se você tiver a Pro Edition do
Game Maker, também poderá usar a ação para espelhar a imagem. Nesse caso, você
precisará de apenas um sprite).
11
Para evitar que os monstros caiam das plataformas, introduzimos outro objeto, que
chamamos de marcador. Esse marcador será um bloco azul invisível. Sempre que um
monstro o tocar, ele inverterá a direção de seu movimento. Ter marcadores invisíveis
é um bom truque geral para permitir que as instâncias executem determinadas ações
em lugares específicos da sala. Além de mudar a direção, você pode usar marcadores
para atirar, colocar bombas etc.
Quando o personagem atinge um monstro, ele deve morrer. Mas, na verdade, como na
maioria dos jogos de plataforma, gostamos de possibilitar que o personagem pule em
cima do monstro e o esmague. Portanto, no evento de colisão do personagem com o
monstro, devemos verificar se atingimos o monstro de cima para esmagá-lo. Para
descobrir isso, realizamos o seguinte teste Para descobrir isso, realizamos o seguinte
teste:
Isso é verdadeiro se vspeed for maior que 0, de modo que o personagem se move
para baixo, e o personagem está perto do topo do monstro, de modo que está de fato
atingindo-o de cima. (No exemplo, transformamos o monstro em um monstro morto
plano, que se destrói após algum tempo. Isso proporciona um efeito gráfico mais
agradável). Nesse jogo de plataforma simples, morrer para o personagem corresponde
a reiniciar o nível, o que pode ser feito por meio de algumas ações simples.
Talvez você queira adicionar mais monstros, por exemplo, com velocidades
diferentes, para tornar as coisas mais difíceis. Você também pode criar um monstro
ou pedra que caia ou se mova para cima e para baixo. Basta usar sua própria
imaginação.
Poços
A maioria dos jogos de plataforma exige um timing cuidadoso dos saltos para evitar
cair em buracos. Cair em um poço normalmente mata o personagem. Para isso,
adicionamos um novo objeto, chamado morte. Esse objeto é um bloco vermelho que,
mais uma vez, não é visível. Você pode colocá-lo no fundo do poço. (Na sala de
azulejos, você pode colocar alguns espinhos ali.) No evento de colisão do
personagem com o objeto de morte, ele deve emitir um som, esperar um pouco e
reiniciar a sala. Você também pode criar poços que descem infinitamente. Nesse caso,
você deseja adicionar ações semelhantes no evento Outside Room (nos outros
eventos) do personagem, talvez incluindo um teste para verificar se y >
room_height para garantir que o personagem caiu, em vez de pular para fora do
campo de jogo.
Coleta de pontos
A maioria dos jogos de plataforma tem algum mecanismo pelo qual o jogador pode
acumular pontos. Normalmente, é preciso pegar determinados objetos ou apanhar
certas coisas. Em nosso exemplo, o jogador pode coletar cogumelos. Portanto,
criamos um objeto de cogumelo. Para variar um pouco, o sprite do cogumelo contém
10 subimagens de cogumelos diferentes. O objeto cogumelo escolhe uma delas
12
aleatoriamente ao ser criado usando a ação Change Sprite (Alterar sprite):
13
Definimos a subimagem como random(10). random(10) é uma chamada de
função. Ela retornará um número aleatório abaixo do argumento fornecido (portanto,
abaixo de 10 no nosso caso). Definimos a velocidade como 0 para parar de percorrer
as subimagens. No evento de colisão do personagem com o objeto cogumelo,
reproduzimos um som, destruímos o outro objeto (ou seja, o cogumelo) e
adicionamos 10 à pontuação.
Em alguns jogos de plataforma, coletar objetos tem uma função mais importante do
que apenas aumentar sua pontuação. Por exemplo, você pode ganhar uma vida extra
ao coletar objetos suficientes. Também pode haver objetos que restauram sua saúde
(supondo que os monstros não o matem, mas simplesmente o enfraqueçam), fazem
você se mover mais rápido, pular mais alto etc. Isso pode ser facilmente adicionado.
Próximo nível
É claro que deve haver uma maneira de terminar um nível, de modo que o jogador
possa passar para o próximo nível. Para isso, criamos um objeto obj_levelexit.
Quando o personagem chega lá, você é movido para o próximo nível. No exemplo,
isso é feito de forma bastante simples. Adicionamos uma ação de teste para verificar
se a próxima sala existe. Se esse teste for verdadeiro, passamos para a próxima sala.
Caso contrário, a lista de recordes é exibida e o jogo é reiniciado.
Você pode optar por fazer com que a saída do nível apareça somente quando, por
exemplo, todos os cogumelos tiverem sido coletados. Para isso, no evento de criação
do objeto obj_levelexit, mova-o para a posição -100,-100 (portanto, fora da tela).
Agora, no evento de etapa do objeto, verificamos se o número de objetos cogumelo é
igual a 0 (há uma ação para isso) e, em caso afirmativo, movemos o objeto de volta à
sua posição inicial (novamente, há uma ação para isso). Tudo muito simples.
Mais moções
Nosso jogo de plataforma atual tem apenas algumas possibilidades limitadas de
movimento. O personagem pode se mover para a esquerda e para a direita e pode
pular. Para tornar as coisas mais interessantes, vamos acrescentar algumas
possibilidades. O resultado pode ser encontrado no jogo platform_4.gmk.
14
Rampas
É bom que o jogador possa subir rampas inclinadas (a descida é automática por causa
da queda). Para isso, temos de substituir o código no evento da tecla de seta para a
esquerda. Colocamos lá o seguinte:
Escadas
As pessoas sempre querem escadas em jogos de plataforma ao longo das quais o
personagem possa se mover de uma plataforma para outra. Isso requer um pouco de
trabalho. Uma escada será representada por um bloco vertical fino que é invisível (a
escada real, a videira ou o que quer que seja usado para escalar é desenhado
novamente usando ladrilhos) e não sólido. Quando o personagem não estiver em
contato com uma escada, o movimento deverá ser como antes. Mas quando ele
estiver em contato com a escada, as coisas devem ser diferentes. Em primeiro lugar, o
personagem não deve cair. Portanto, no evento de passo, temos de fazer uma
alteração nesse efeito, adicionando algumas ações que definem a velocidade vertical e
a gravidade como 0 quando em contato com uma escada. Além disso, definimos o
sprite para o sprite de escalada nesse caso.
A segunda coisa que precisa ser alterada é o evento da tecla para cima. Quando o
personagem está em uma escada, a tecla de seta para cima deve movê-lo para cima,
em vez de pular. Novamente, precisamos de algumas ações adicionais para isso.
Testamos se o personagem está em contato com uma escada e, em caso afirmativo, o
movemos um pouco para cima. Usamos ações semelhantes para a tecla para baixo.
16
que você está controlando. Isso torna o jogo mais desafiador, pois o jogador deve
tentar detectar o caminho através das plataformas. Você também pode esconder
prêmios em locais de difícil acesso na sala.
Ter a visualização é bom, mas torna a janela na qual as coisas acontecem bastante
pequena. Para evitar isso, nas Configurações globais do jogo, indicamos uma escala
fixa de 200%. É claro que você pode brincar com esses valores para obter o efeito
desejado.
17
Alguns toques adicionais
Atirando em monstros
A próxima etapa é permitir que o jogador atire nos monstros. Para tornar as coisas um
pouco mais interessantes, o jogador precisa primeiro encontrar alguma munição para
poder atirar. Para isso, introduzimos uma variável que chamamos de munição e que
indica a quantidade de munição que o jogador tem. No evento Create do personagem,
definimos esse valor como 0 usando a ação para definir uma variável. O objeto de
munição tem um sprite simples e não faz nada. Ele apenas espera ser pego pelo
jogador. Quando o personagem colide com o objeto de munição, adicionamos 10 à
variável munição (definindo-a como 10) e destruímos a instância de munição.
Resta destruir a bala quando ela atingir uma parede ou quando sair da sala e matar o
monstro quando a bala o atingir. Tudo isso é fácil. Consulte o arquivo
platform_5.gmk para obter detalhes.
Um painel de pontuação
O jogador agora tem uma pontuação e munição. Também lhe daremos algumas
vidas. Atingir um monstro ou cair em um poço custará uma vida. Há um
mecanismo fácil para vidas no Game Maker. Vamos criar um objeto
obj_controller especial. Ele não precisa de um sprite. Em seu evento Create,
ele define o número de vidas como 3. Sempre que o jogador morre, diminuímos o
número de vidas. No evento No More Lives do controlador, mostramos a tabela de
18
recordes e reiniciamos o jogo.
19
Mas também seria bom se pudéssemos ver o número de vidas, a pontuação, a
munição etc. Para isso, vamos criar um pequeno painel com essas informações.
V a m o s desenhá-lo no evento Draw do objeto controlador. Mas há um problema
aqui. Onde devemos desenhá-lo? Não podemos desenhá-lo em um local fixo na sala
porque a visualização muda e queremos que o painel esteja sempre à vista.
Felizmente, podemos solicitar a posição da visualização. Isso é indicado pelas duas
variáveis view_xview e view_yview, que indicam a posição esquerda e a posição
superior da visualização, respectivamente. Assim, podemos desenhar o painel com as
informações relativas a essa posição. Esta é a aparência do evento de desenho do
objeto controlador:
Observe que também desenhamos uma imagem quando o jogador pode atirar. No
jogo, que pode ser encontrado no arquivo platform_5.gmk, o resultado é a seguinte
imagem:
20
E agora?
As seções acima explicaram alguns dos princípios básicos da criação de jogos de
plataforma. Agora é a sua vez. Você terá de usar essas técnicas e mais algumas ideias
suas para criar um jogo de plataforma realmente bom. Lembre-se de que a parte mais
importante dos jogos de plataforma é formada pelos níveis. Comece a criar níveis um
a um. Jogue-os até ficar satisfeito com eles. De vez em quando, introduza algum novo
aspecto de jogo. Aqui estão algumas ideias adicionais que você pode usar:
Boa sorte.
Leitura adicional
Para ler mais sobre como criar jogos usando o Game Maker, recomendamos que você
compre nosso livro:
O livro apresenta uma introdução passo a passo a muitos aspectos do Game Maker e,
no processo, você cria nove belos jogos que também são divertidos de jogar.
21