Hoje mostrarei como trabalhar com diversas fases e salvar o jogo para que ninguém tenha que começar todas as fases desde o começo cada vez que inicia o jogo. Então vamos lá?
Nível Completo? Vamos para a próxima:
Primeiro, vamos criar um objeto chamado “obj_jogo”, sem sprites. Nele crie um evento “Step” e adicione o seguinte código:
01. if (instance_number(obj_flor) == 0){
02. if(room_exists(room_next(room))){
03. room_goto_next();
04. }
05. }
Este código diz o seguinte: se a quantidade do obj_flor for igual a 0, então verifique se existe uma próxima fase (outra room) e, se existir, vá para a próxima. Para que o código seja executado, abra o “rm_level1” e adicione o obj_jogo em alguma parte da tela.
Agora, vamos focar no desenvolvimento da próxima fase. Ao invés de criarmos uma a uma do zero, podemos usar a incrível ideia de copiar ou colar, ou na linguagem do GameMaker, duplicar. Então, na pasta Rooms, clique com o botão direito do mouse e selecione a opção “Duplicate”.
Para deixar mais organizado, podemos unir todos os níveis em uma subpasta. Para isto, selecione o “rm_level1” com o botão direito do mouse e selecione a opção “Insert Group”.
Para facilitar o jogador a selecionar a fase que deseja ou mostrar a progressão no jogo, podemos criar uma tela de seleção de nível. Então para montar esta tela, primeiro criamos uma room chamada “rm_levelSelect”. Coloque um plano de fundo que desejar (coloquei o “bk_main”). Na lista de recursos, tenha certeza que esta room está abaixo da “rm_menu”, como a imagem abaixo indica. Assim, quando o jogador apertar “Novo Jogo”, será direcionado para a tela de seleção de níveis.
“spr_lvl1”
“spr_lvl2”
“spr_lvl3”
“spr_lvl4”
“spr_lvl5”
Depois de criar os cinco botões, basta adicioná-los na “rm_levelSelect”:
Salvando o Jogo
Agora que temos níveis, devemos permitir que o jogador continue de onde parou, independente se fecharmos ou não o jogo. A forma que vamos utilizar será usando um arquivo INI, que guardará as informações do progresso em um arquivo e o mesmo será carregado quando necessário. Também será neste arquivo que vamos informar se uma fase está ou não desbloqueada.
Então, para começar, vamos abrir o “rm_level2” e clicar em “Creation Code”, que é o código que será executado logo que uma Room é carregada. Vamos inserir o seguinte código:
01. ini_open("SaveGame.sav");
02. ini_write_real("Levels","LevelDois",1);
03. ini_close();
Bem simples o código: a primeira linha abre um arquivo. Caso o arquivo não exista, ele criará o arquivo somente na primeira tentativa de gravar o arquivo, que é o que ocorre na linha 02. Nesta linha estou dizendo para gravar um número real. Os parâmetros desta função respectivamente são: seção do arquivo, ou seja, qual parte do arquivo será adicionada a variável; o segundo parâmetro é o nome da variável e o terceiro é o valor. O arquivo resultante deste código será assim:
[Levels]
LevelDois= 1
A terceira linha serve para fechar o arquivo. Isto não só no GameMaker, mas em qualquer linguagem/ferramenta de programação, deve-se fechar o arquivo sempre que terminar de usá-lo.
Agora vamos fazer a mesma coisa para o rm_level3 e os outros. O código do rm_level3 ficará assim:
01. ini_open("SaveGame.sav");
02. ini_write_real("Levels","LevelTres",1);
03. ini_close();
E vai alterando desta forma até o “rm_level5”.
Carregando e Trancando os Níveis
Vamos agora fazer o processo inverso da gravação de arquivo: a leitura. Mas, antes, importe o sprite que indica que o nível está bloqueado e nomeie como “spr_lvlTrancada”:
01. ini_open("SaveGame.sav")
02. destravada = ini_read_real("Levels","LevelDois",0);
03. ini_close()
04. if (destravada != 1){
05. sprite_index = spr_lvlTrancada;
06. }
Aqui nós abrimos o arquivo e em seguida o lemos, dizendo em qual seção do arquivo está a variável, qual delas queremos e ,se não foi encontrada, qual é o valor padrão para retornar. Guardamos esse valor em uma variável chamada “destravada”. Fechamos o arquivo e então verificamos se a fase está destravada. Se não estiver, alteramos a sprite da fase para indicar que a mesma está trancada ainda.
Agora, para efetivamente não entrar na fase, mesmo com ela indicando que está trancada, vamos alterar o evento “Left Pressed”. Delete o que tiver dentro deste evento e insira o seguinte código:
01. if (sprite_index != spr_lvlTrancada){
02. room_goto(rm_level2);
03. }
Esse código verifica o sprite que está sendo usado. Se ele for diferente do sprite que indica que está trancada, então permita que vá para a fase dois.
Agora, adaptemos para cada botão de fase estes códigos e assim está concluído o tutorial de hoje.