No tutorial de hoje, vamos dar uma melhorada em alguns pontos de jogos. Vou mostrar como gerenciar a quantidade de vidas, vamos adicionar Power-Ups, criar telas de game over com informações sobre o desempenho do jogador. Então, vamos nessa!
Todos merecem uma segunda chance
A situação atual do jogo, bem, não é muito interessante para o jogador. Enquanto a bolinha sai para fora, ela vai para o infinito e além e o jogo só pode ser jogado novamente se o usuário fechá-lo. Vamos corrigir isto agora. Como? Vamos fazer o seguinte: o jogador poderá errar 3 vezes e, quando o jogador errar, a bola começará do ponto de partida. Ok, agora temos a nossa regra, vamos colocar as mãos no teclado.
O GameMaker possui uma variável global que serve para controlar a quantidade de chances que o jogador tem. Essa variável chama-se “lives”, que significa “vidas” em inglês. Então vamos fazer com que, quando um jogo começa, o jogador receba 3 vidas. Para isto, abra o objeto “obj_jogo”, crie um evento “Create” e adicione o seguinte código:
01. lives=3;
Ok, dei as vidas ao jogador. Agora vamos tirar a vida dele caso ele não consiga manter a bolinha dentro da área de jogo. Abra o objeto “obj_bola” e clique em “Add Events”. Clique agora em “Others” e em seguida em “Outside Room”, como mostra a imagem abaixo:
01. lives -= 1;
02. if (lives > 0){
03. x = xstart;
04. y = ystart;
05. direction = random_range(45,135);
06. }
Na primeira linha, nós removemos uma vida do jogador. Em seguida verificamos se ele possui mais vidas. Se houver, então o colocamos na posição inicial setando a variável “x” e “y” da bola com as variáveis do sistema “xstart” e “ystart”, que marcam respectivamente as posições x e y iniciais. E então, damos alguma direção randômica para a bola.
Fim de Jogo
Temos as vidas e já podemos perdê-las. Agora o que acontece quando elas acabam ? Fim de Jogo! Para isso, vamos criar mais uma tela, que se chamará “rm_fimDeJogo”, e colocar este plano de fundo no jogo:
Coloque o plano de fundo normalmente, mas vamos fazer uma coisa diferente. Primeiro, desmarque a opção “Draw background color”. A razão disso é que vamos criar um efeito semi-transparente na tela de Game Over mostrando o cenário. Agora na aba “Settings” clique em “Creation Code” e insira o seguinte código:
01. background_alpha[0] = 0.5;
Isto fará que o plano de fundo fique semitransparente. Agora, no “obj_jogo” vamos adicionar o seguinte código no evento “Step”:
01. if (lives == 0){
02. room_goto(rm_fimDeJogo);
03. }
Aqui basicamente diz: se está sem vidas, vá para a tela de fim de jogo.
Medindo Desempenho do Jogador
Na tela de Fim de Jogo, vamos mostrar o desempenho do jogador. Vamos mostrar os seguintes dados: o maior número de combo, flores destruídas em sequência sem tocar na raquete e também quantas flores foram destruídas.
Então, abra o objeto “obj_bola” e no evento “Create” adicione o seguinte código:
01. combo=0;
02. global.maxcombo = 0;
03. global.total = 0;
Este código inicializará a variável “combo”, uma variável global chamada “maxcombo” e também, outra global chamada total. Todas começarão com o valor 0.
No mesmo objeto, adicione o seguinte código no evento “Colisão com o obj_raquete”.
01. combo=0;
Este código fará com que o contador de combo zere quando a bola atingir a raquete. Agora, no evento “Colisão com obj_flor”, adicione o seguinte código:
01. combo+=1;
02. if (combo > global.maxcombo){
03. global.maxcombo = combo;
04. }
05 global.total+=1
Neste trecho, adicionamos 1 ao combo quando a bola atinge uma flor. Então verificamos se o combo superou ao antigo: se superou, guardamos na variável global “maxcombo”. O final, apenas adicionamos 1 na variável global total para contar quantas flores foram destruídas.
Agora que já criamos o mecanismo de medir o desempenho, vamos criar a parte que exibe o mesmo. Crie um novo objeto chamado “obj_stat” , adicione um evento “Draw” e o seguinte código:
01. draw_text(x, y, "Combo Maximo: " + string(global.maxcombo));
02. draw_text(x, y+15, "Flores Destruídos: " + string(global.total));
Abra o “rm_fimDeJogo” e adicione o objeto que acabamos de criar no local onde quero que apareçam as mensagens.
Finalizando a tela de Fim de Jogo
Bem, está faltando algo bem básico na tela de Game Over: como ele vai sair desta tela. Bem, para resolver, vamos adicionar alguns botões:
01. room_goto(rm_menu);
E pronto! Este objeto está pronto! Agora vamos para o botão de tentar novamente. Faça os mesmos procedimentos do botão anterior para criar o “obj_tenteN”, mas usaremos o “spr_tenteN” e o código que irá no evento “Left Pressed” será o seguinte:
01. room_goto(global.level);
Isso não terá efeito se não definirmos um valor para a variável global “level”. Então, para ter efeito, vamos fazer o seguinte: para cada room de nível, vamos atribuir o nome da room para a variável global “level”. Vou fazer a do “rm_level1” como exemplo: primeiro abra a “rm_level1” e no guia “Settings” clique no botão “Create Code”. Isso já fizemos diversas vezes. Agora vamos adicionar este código:
01. global.level = rm_level1;
E pronto! Só isso. Só que agora temos que fazer para o rm_level2, rm_level3, rm_level4 e para o rm_level5. No casos destes quatros últimos, podem colocar no final do código, já que tem o código para salvar as fases liberadas. E mais uma coisa, não vão aspas no nome da room.
Só para fechar esta última parte, abra o rm_fimDeJogo e adicione os dois botões na room. Pronto! Missão Cumprida!
Adicionando um Power Up
Vamos fazer agora dois power ups para o nosso jogo. Os power ups terão a forma da bola só que em outra cor e elas ficarão paradas. São instanciadas que nem as flores. Então vamos começar pelo primeiro, que adiciona uma segunda bola ao jogo. Então, vamos baixar o sprite “spr_multi”, que será representada por esta bola verde:
01. ativado = false;
Agora crie um evento “Colisão com obj_bola” e adicione este código:
01. ativado=true;
E por último, um evento do tipo “Step” com o seguinte código:
01. if (ativado == true){
02. instance_create(x,y,obj_bola);
03. instance_destroy();
04. }
Então, este último código verifica se o item foi ativado. Se ele foi, instanciará uma nova bola e destruirá o power up. Agora, para quando uma bola sair enquanto tiver uma bola extra, o jogador não deve perder uma vida. Para isso, vamos modificar o código do evento “Outside Room” do obj_bola, que está assim:
01. lives -= 1;
02. if (lives > 0){
03. x = xstart;
04. y = ystart;
05. direction = random_range(45,135);
06. }
para:
01. if (instance_number(obj_bola) == 1){
02. lives -= 1;
03. if (lives > 0){
04. x = xstart;
05. y = ystart;
06. direction = random_range(45,135);
07. }
08. }else{
09. instance_destroy();
10. }
O que fizemos? Adicionamos uma condicional: se tiver apenas um objeto obj_bola, tire uma vida e recomece a fase. Senão, apenas destrua a bola que saiu. Agora, basta colocar este objeto obj_multi em algumas fases e testar.
O segundo power up é uma bomba de linha explosiva. Quando a bola atinge, uma linha horizontal aparece e destrói todas as flores que estão alinhadas horizontalmente. Mas para isto, primeiro vamos fazer o download da spr_bomba:
01. ativado = false;
e um evento de colisão com obj_bola com este código:
01. ativado=true;
02. alarm[0] = 5;
Basicamente é a mesma coisa que fizemos com o objeto anterior, com a diferença que na colisão com a bola, colocamos o alarme 0 para despertar em 5 passos. Agora, em invés de usar um evento “Step”, vamos usar um evento Draw e adicionaremos o seguinte código:
01. if(ativado==true){
02. draw_set_color(c_red);
03. draw_line_width(0,self.y, room_width, self.y, 4);
04. draw_set_color(c_black);
05.
06. with(obj_flor){
07. if(self.y==other.y){
08. destruir = true;
09. }
10. }
11. }
12.
13. draw_self();
Neste trecho, tudo está condicionado se o item foi ativado. Se foi, ele vai desenhar uma linha vermelha, que cortará a tela horizontalmente. Note que na linha 04 nós usamos o set_color para voltar a cor para preto, para não influenciar os outros eventos “Draw”. Na segunda parte do código, usamos o comando “with”, que faz com que tomemos o ponto de vista dos objetos especificados, que neste caso são todas as flores. Então, comparamos o y com o outro, que neste caso é a bomba, e se eles estiverem alinhados, é ativada a destruição da flor. A última linha é para que o GameMaker desenhe o sprite do objeto, pois geralmente quando o evento “Draw” é usado, é necessário dizer explicitamente que o sprite do próprio objeto deve ser desenhado.
Agora, crie um evento “Alarm 0” e adicione o seguinte código:
01. instance_destroy();
E pronto! Agora escolha uma fase e insira este novo power up!