sexta-feira, 3 de abril de 2015

[Game Maker] Aula 4 - Adicionando mais recursos importantes!

Dando continuidade ao nosso projeto de GML, iremos agora adicionar outros fatores importantes que você deverá criar o costume de empregar em seus futuros jogos. Vamos dar uma olhada em variáveis globais, em rooms de Setup, no Menu principal do jogo, e também iremos adicionar elementos importantes para o jogo em si, como itens.

Esta aula nós iremos dividir em duas partes, as quais irão se conectar no final. A primeira parte, iremos lidar como o "Out Game", coisas que não são feitas para serem jogadas e sim para fazerem o jogo funcionar, como rooms que servem apenas para "iniciar" o jogo e também o menu principal. A segunda parte, iremos adicionar mais elementos bacanas em nosso jogo, como itens e também formas de "passar para a próxima fase".

Índice:
1. Criando uma room de Setup
2. Criando uma room de menu principal
3. Criando itens e sistemas de pontuação
4. Detalhes finais

1. Criando uma room de Setup
Primeiramente, iremos criar uma nova room ao nosso jogo. Esta será de vital importância ao jogo, e deverá ser a primeira room de todas, portanto, acima de todas as outras, para que seja sempre a primeira a ser inicializada com o jogo. Chame-a de room_setup_geral.

Nesta room, iremos na aba Settings e clicaremos no botão "Creation Code". Nele, iremos adicionar o seguinte comando:

{
    //Setup de variáveis globais
    global.var_pontos = 0;
    global.var_opcao_do_menu = 0;
    
    //Vai para a próxima room
    room_goto_next();
}

Assim é a melhor forma de adicionar novas variáveis globais, ou seja, variáveis que servem para todas as rooms. Por enquanto, iremos adicionar apenas este sistema básico de pontuação e também uma variável que irá nos ajudar a construir o menu, que é o próximo passo.

2. Criando uma room de Menu principal:
O Menu principal pode ser feito de milhares de jeitos diferentes, mas eu tentarei mantê-lo o mais básico possível, contendo apenas o indispensável. Outro objetivo é manter o mouse desfuncional neste jogo, logo, não iremos fazer botões reais, e o menu será todo controlado pelo teclado, assim como o resto do jogo.

Criemos então outra room, que deve ser colocada logo em seguida da room_setup_geral. Esta por sua vez deverá se chamar room_menu_principal. Agora iremos criar um novo objeto, que deverá comandar as funções do menu principal. Chame-o de objeto_menu_principal. Com a ajuda da variável global que criamos no passo anterior, a global.var_opcao_do_menu, tudo ficará mais fácil.

No draw event do objeto_menu_geral, coloque o seguinte:

{
//Seleciona as opções de acordo com o número da variável global.var_opcao_do_menu
//Neste caso foi definido o seguinte:
//  0 = iniciar o jogo.
//  1 = Ajuda sobre o jogo.
//  2 = sair do jogo.
switch(global.var_opcao_do_menu)
    {
    case 1: var_meu_texto = "Sobre o jogo!"; break;
    case 2: var_meu_texto = "Sair do jogo!"; break;
    default: var_meu_texto = "Iniciar jogo!"; break;
    }


//Define como será desenhado o texto no jogo
draw_set_font(fonte_padrao0);
draw_set_color(c_white);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);

//Desenha o texto com as caracteres e as características definidas acima, centralizado automáticamente com o tamanho da room.
draw_text_transformed(room_width/2, room_height/2 - 32, "TÍTULO DO SEU JOGO!", 2.5, 2.5, 0);
draw_text(room_width/2, room_height/2 + 128, "<    "+string(var_meu_texto)+"    >");
}

Isso irá desenhar o básico. Agora é a sua vez: enfeite o Menu principal com novos tilesets á sua escolha, da maneira que você achar melhor. Prefira também usar uma cor de fundo escura, ou então troque a cor do texto acima para uma cor escura (c_black, c_navy, c_dkgray...) para fazer contraste ao plano de fundo para que o jogador consiga ler o que está escrito. Não se esqueça de alterar a parte do nome do seu jogo também. Eis um exemplo de menu básico:

Se algo der errado, considere ver se você colocou a room_menu_principal depois da room_setup_geral. Caso o "í" do "título" fique bugado, significa que a fonte que você está usando na fonte_padrao0 não possui caracteres acentuados (verifique também se a Character Range da fonte_padrao0 está de "0 til 255"). Agora o menu está visualmente pronto, mas precisa ser trabalhado para que funcione realmente.

No objeto_menu_principal adicionaremos o seguinte no Create Event:

{
var_delay = 0;
}

E no Step Event:

if var_delay > 0
    var_delay -= 1;
else
    {
    
    //Lembre-se que definimos três opções no menu principal, sendo a primeira a número 0.
    //Logo, o número máximo de opções é 2.
    
    if keyboard_check(vk_right)
        {
        //Trava as opções por um pequeno período
        var_delay = 6;
        
        //Se a opção selecionada não for a última... (!= 2)
        if global.var_opcao_do_menu < 2
            global.var_opcao_do_menu += 1;
        else
            global.var_opcao_do_menu = 0;
        }
        
    if keyboard_check(vk_left)
        {
        //Trava as opções por um pequeno período
        var_delay = 6;
        
        //Se a opção selecionada não for a primeira... (!= 0)
        if global.var_opcao_do_menu > 0
            global.var_opcao_do_menu -= 1;
        else
            global.var_opcao_do_menu = 2;
        }
    
    }

Agora você já consegue fazer transição entre as opções do menu, embora não funcionem realmente. Recomendo que você faça um teste agora para ver se tudo está de acordo. Caso positivo, continuaremos então!

Ainda no Step Event do objeto_menu_principal, acrescente:

{

//Ao pressionar a tecla "enter"...
if keyboard_check(vk_enter)
    {
    
    switch(global.var_opcao_do_menu)
        {
        case 1: show_info(); break;
        case 2: game_end(); break; 
        default: room_goto_next(); break;
        }
    
    }

}

Com este simples comando, todas as nossas opções de menu agora possuem comandos básicos importantes para o jogo. No caso do opção 1, "Show Info", abrirá uma tela de informações própria do Game Maker. Para alterá-la, clique no ícone respectivo da barra de recursos:

Você também pode alterar as configurações desta tela em como ela aparece durante o jogo, indo em File > Options.

Com isso, completamos o nosso menu principal básico do jogo, e podemos então ir para a segunda parte da aula.

3. Criando itens e sistemas de pontuação ao jogo
Agora iremos voltar á trabalhar com recursos que aparecem durante o jogo. Iremos adicionar os itens dos quais o jogador pode pegar. O plano é adicionar três tipos de moedas que garantem diferentes pontuações para o jogador obter durante as fases e dois itens especiais que ajudarão o jogador á completar sua missão.

Para isso, criemos cinco novos sprites padrão (16x16, origem centralizada): sprite_moeda_bronze, sprite_moeda_prata, sprite_moeda_ouro, sprite_pocao_cura, sprite_pocao_invencivel. Os nomes são intuitivos e você pode adicionar qualquer animação básica nelas. Eis alguns exemplos:

Agora, criaremos um novo objeto: o objeto_item_geral. No Step Event dele, colocaremos o seguinte:

if place_meeting(x, y, obj_jogador_geral)
    {
    
    alarm[0] = 1;
    
    }

E no evento do Alarm[0]:

{
instance_destroy();
}

E no Create Event, para que a animação fique mais lenta e para que o item fiquem abaixo dos outros objetos:

{
image_speed = 0.25;
depth = 1;
}

Isso nos dará uma certa liberdade para alterar os diferentes itens da forma que quisermos. O plano é colocar o efeito de cada item no alarm[0] e em seguida chamarmos o event_inherited(), para que o item seja destruído, dando a impressão que ele foi consumido ou obtido pela personagem. Neste caso, criemos outros cinco objetos, com características padrões: objeto_item_moeda_bronze, objeto_item_moeda_prata, objeto_item_moeda_ouro, objeto_item_pocao_cura, objeto_item_pocao_invencivel. Todos eles com a sprite_mask_padrao16x16 como Mask, não sólidos, visíveis e com o Parent no objeto_item_geral. Agora é só alterar o alarm[0] do...

... objeto_item_moeda_bronze:
{
global.var_pontos += 1;
event_inherited();
}

... objeto_item_moeda_prata:
{
global.var_pontos += 5;
event_inherited();
}

... objeto_item_moeda_ouro:
{
global.var_pontos += 10;
event_inherited();
}

... objeto_item_pocao_cura:
{
obj_jogador_geral.var_atributo_vida += 5;
event_inherited();
}

... objeto_item_pocao_invencivel:
{
//270 = 9 segundos.
obj_jogador_geral.var_inatingivel += 270;
event_inherited();
}

Agora todos os itens estão configurados! Você pode adicionar quantos mais quiser, e distribuí-los pelas fases como você desejar! Nota: se você quiser com que os inimigos gerem pontos ao morrer, você pode adicionar um Destroy Event no objeto_inimigo_geral e então colocar o seguinte comando:

{
global.var_pontos += 1;
}

4. Detalhes finais
Agora podemos ir para os últimos acertos referentes á este guia. Para fechar com chave de ouro, vamos adicionar alvo que funcione como "End Level" para o jogador, algo como um portal que a personagem adentre e vá para a próxima fase. Talvez mais á frente adicionaremos algum Boss para que ela deva derrotar e então prosseguir, mas agora esta não é a prioridade.

Criemos então um sprite para tal local. No meu caso, eu criei um sprite_portal e fiz a seguinte animação:

Depois, crieremos um objeto chamado objeto_end_level (deve ser um objeto visible, não sólido, com a Mask sprite_mask_maior24x24) e colocaremos um simples comando em seu step event, muito parecido com os itens que fizemos anteriormente:

{
if place_meeting(x, y, obj_jogador_geral)
    {
    
    global.var_pontos += 10;
    
    if room != room_last
        room_goto_next();
    else
        {
        
        show_message("Parabéns! Você completou o jogo! Sua pontuação foi de "+string(global.var_pontos)+"!");
        game_restart();
        
        }
    
    }
}

Se quiser, diminua a velocidade de animação através do Create Event:

{
image_speed = 0.25;
}

Pronto! Agora distribua o portal final no fim de algumas fases de teste, coloque itens espalhados, junto á um número moderado de inimigos Não se esqueça do que fizemos nas aulas passadas para isso.

Agora...


Verifique também se o menu está em ordem, e se as opções fazem suas respectivas funções corretamente. Se tudo deu certo, parabéns! Mais uma etapa completa! Até a próxima!

Nenhum comentário:

Postar um comentário

Dúvidas? Pergunte!
Ajudou? Agradece!
:]