No último tutorial fizemos bastantes coisas: criamos uma tela de Splash, aquelas que geralmente aparece o nome da empresa desenvolvedora do jogo, o menu principal e também a tela de opções. Com isso, acabamos vendo Alarmes e a forma que o GameMaker trabalha com transições de telas.
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”.
Com isso, ele vai fazer uma cópia da room “rm_level” e você pode modificar a cópia para fazer os próximos níveis. Então, vamos fazer agora os níveis 2 até 5 e usarei o padrão que criei para o primeiro nível. Os meus níveis ficaram assim:

“rm_level2”

“rm_level3”

“rm_level4”

“rm_level5”
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”.
Uma subpasta, cujo nome que dei foi “Niveis” será criada e agora é só arrastar cada nível para dentro da pasta. Ele deve ficar assim:
Criando a Tela de Seleção de Níveis
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.
Agora criaremos os botões usando os seguintes sprites:

“spr_lvl1”

“spr_lvl2”

“spr_lvl3”

“spr_lvl4”

“spr_lvl5”
Agora criaremos um objeto chamado “obj_lvl1”, que usará o sprite “spr_lvl1”. Adicione um evento “Left Mouse Button Pressed”, clique e arraste o “Different Room” () e configure para ir para “rm_level1”. Crie outros quatro objetos para fazer a mesma coisa para os outros quatros botões, cada um indo para a respectiva fase. Lembre-se que a duplicação pode acelerar aqui.
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”:
Agora, vamos ao código. Vamos abrir o primeiro botão que pode ser trancado, que é o obj_lvl2. Crie um evento “Create” e adicione o seguinte código:
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.