Mostrando postagens com marcador Passo-a-passo. Mostrar todas as postagens
Mostrando postagens com marcador Passo-a-passo. Mostrar todas as postagens

domingo, 31 de janeiro de 2016

[Fran Bow] Passo-a-passo - Capítulo 2 - Parte 1: "Curiosity Symptoms"


Olá! Continuaremos aqui o Passo-a-passo de Fran Bow. No momento, estamos no Capítulo 2 - Parte 1, isto é, o episódio em que Fran deixa o hospital psiquiátrico e chega á floresta.

Capítulo 2 - Parte 1: "Curiosity Symptoms":

Logo no início, pegue a Door na pilha de lixo. 
Prossiga para a direita e use a sua pílula. Sob seu efeito, será possível ver um grupo de Luciferns preso a árvore. Tente pegar a chave pendurada próximo á eles e prossiga com o diálogo, alimentando-o, até que os Luciferns lhe ofereçam a chave em troca de um Hair Comb.

Ainda sob o efeito da pílula, prossiga duas vezes para a esquerda até encontrar um poço fechado e um Sharpy Axe sobre um tronco cortado. Primeiro, pegue o Sharpy Axe e em seguida use-o sobre o Well. Isso fará com que a coruja assuste-se e saia voando, deixando cair uma Feather.
Cesse o efeito da pílula e retorne uma sala. Fale com Mr. Antonio, o inseto gigante, e prossiga com o diálogo, alimentando-o até quanto o possível. Depois, use o Sharpy Axe no Battlepig (o inseto menor), fazendo com que este corra para a esquerda. Não siga-o. Apenas use a Feather em Mr. Antonio para que este acorde. Após o diálogo que irá ocorrer, Mr. Antonio lhe indicará o caminho para a sua casa.

Prossiga normalmente e, quando chegar na porta da casa de Mr. Antonio, use o Sharpy Axe para abrir abrí-la, fazendo com que o trinco (Door Handle) da porta caia. Pegue-o.
Dentro da casa de Mr. Antonio, pegue a Glue dentro do armário aberto, suba no banco e pegue um pedaço de Meat
Fique sob o efeito a pílula, e use a Meat, obtida recentemente, nos Ants para que estes saiam de cima do cadáver do exterminador. Agora, pegue a sua Hunter's Bag sobre ele, abra-a para obter uma Rat Trap e um Ticket, e cesse o efeito da pílula.

Ainda na casa de Mr. Antonio, cheque a pequena casinha no canto direito. Você encontrará uma pequena família de Pinhas. Para resolver o enigma desta casinha, o jogador deve clicar nos objetos na ordem correta:
1. Use a Rat Trap no chão da casinha (Floor)
2. Tente pegar as Blueberries. (Isso fará a pinha da esquerda ficar presa na ratoeira)
3. Derrube a pinha bebê de sua cadeira. (Isso fará a pinha central perceber que a pinha anterior está presa)
4. Pegue as Blue Berries.

Saia da casa de Mr. Antonio e retorne até o Battlepig (o inseto menor). Use as Blue Berries nele para distraí-lo e depois o Sharpy Axe para matá-lo. Um rato irá sair de seu estômago. Fale com o rato e depois siga-o. Fale com ele uma outra vez e depois novamente, caso já tenha feito o diálogo com os Luciferns presos na árvore (caso negativo, siga os passos anteriores). Em todo caso, consiga o Hair Comb do ratinho.
.Agora retorne á arvore dos Luciferns, indo duas salas para a direita e, sob o efeito da pílula para que estes tornem-se visíveis, use o Hair Comb neles (Long faces). Depois do diálogo, pegue a chave e, ainda sob o efeito da pílula, retorne ao poço.

Aqui, combine a Door com a Super Glue, depois a mistura com a Door Handle (obtidos anteriormente, respectivamente, na pilha de lixo inicial, na entrada da casa de Mr. Antonio e no armário de Mr. Antonio) para formar uma Magic Door. Coloque-a sobre o poço.
Use a chave obtida recentemente para destrancá-la. Entre, e a primeira parte do episódio termina.
Continuaremos assim que possível!

sábado, 30 de janeiro de 2016

[Fran Bow] Passo-a-passo - Capítulo 1: "My Sober Day"


Olá! Neste passo-á-passo, pretendo descrever de forma rápida e eficiente todas as ações fundamentais que o jogador de Fran Bow deve executar para completar o jogo. Embora este seja, para mim, um jogo muito querido e especial, devo alertar que deixarei de lado os detalhes da história e outros elementos que não são requisitados para a conclusão da jogatina integral e, portanto, caso você estiver jogando para entender a história de Fran Bow, recomendo que você tente concluir o jogo por si só, o que certamente o levará a explorar e pesquisar os ambientes muito mais detalhadamente. Em todo caso, um bom jogo para você!

Capítulo 1: My Sober Day

Após a primeira cinemática, você iré controlar Fran em seu quarto do hospital psiquiátrico. Primeiramente, cheque a cortina, que irá quebrar, deixando cair o item Hook. Pegue-o. 

Depois, vá para a direita, e pegue a caixa sob a cama, facilmente visível. Abra-a em seu inventário, e com a chave obtida, abra a escrivaninha ao lado da cama de Fran para obter um Hair Clip e uma Family Photo. 

Até aqui já foram três itens. Certifique-se sempre de não deixar nada para trás. Agora vá para a esquerda e converse com a enfermeira. Escolha as opções "I Did Something.../I Broke the Curtains" para que a conversa seja encaminhada como o desejado. Siga a enfermeira para a sala ao lado e fale com ela novamente. Depois, volte ao escritório da enfermeira. Aqui, você deve aproveitar de sua ausência e pegar a Band-Aid Box e a Medicine Box. 
Para abrir a Medicine Box, examine-a em sua bolsa e coloque a senha corretamente, clicando nos quadrados até que marquem, respectivamente, 8954, isto é, o número correspondente de cada uma das letras imediatamente abaixo do quadrado. (Obs.: a dica é dada no relatório da enfermeira sobre a mesa)
Agora, sem sair desta mesma sala, tome sua primeira pílula. Note que alguns itens ou eventos só aparecem durante o efeito do medicamento, logo é sempre muito sábio observar a mesma sala sob as duas óticas diferenciadas. Sob o efeito da pílula, será possível pegar a Needle, próxima á enfermeira morta na cadeira de rodas. Combine a Needle com o Hair Clip obtido anteriormente para formar uma Fran's Handmade Key. Você pode retirar o efeito da pílula agora, clicando no pote novamente.

Com a Handmade Key, abra a porta próxima ao garoto Phil. Embora a conversação com ela seja opcional, ele ainda sim irá interromper sua passagem pela porta. A opção "I'll Try to find my Kitty. Bye!" torna o diálogo mais rápido.

Nesta nova sala, você irá encontra três novas portas, sendo uma delas impossível de abrir. Entre na porta mais próxima, e você irá chegar no quarto de Adelaida. Tente pegar um de seus gizes de cera, e um curto diálogo irá ocorrer. Escolha as opções "1. Can I Have it?/2. But you Have so Many!/3. Who?/4. Qualquer/5. I'll Se What I Can do." Abra seu inventário e use o Band-Aind Box em Adelaida, o que irá lhe render o Green Cayon.
Agora, saia desta sala e tente descer as escadas do lado oposto. A enfermeira irá barrar sua passagem. Para tornar os eventos mais rápidos, é indicado a escolha das opções "1. Opened it with my Key!/2. The Doctor Took the Key.", o que irá impedir Fran de ser mandada de volta para seu quarto, embora isto não fará nada além de atrasar a jogatina um pouco.

De qualquer maneira, ao descer as escadas, continue, ignore o guarda por enquanto e prossiga até encontrar a garota Victoria. Não fale com ela, apenas entre na porta á direita. Você irá chegar num quarto com duas crianças, sendo garotinho Robert o motivo de estarmos aqui. Fale com ele, e alimente o diálogo até que ele lhe diga para trocar de canal. Vá até a TV e coloque no canal número 8.
Feito isso, Robert ficará satisfeito e permitirá que você pegue um Paper sobre o chão. Antes de sair da sala, NÃO SE ESQUEÇA de pegar o Pink Sash no roupão sobre o cavalete de roupa.
Prosseguindo, entre agora na porta á esquerda da garota Victoria e você chegará ao refeitório. Pegue um Cinnamon Bun (bolinho de canela) sobre a mesa e continue para a esquerda. Aqui, você encontrar Annie levantando-se e o garoto Damian fazendo sua refeição. Tente pegar o Walking Cane apoiado sobre a parede próximo a ele e este irá interromper você.

Alimente o diálogo até que Damian lhe proponha trocar sua "espada" por um "cavalo e um castelo". Para tal, abra seu inventário e combine o Green Crayon com o Paper, e Fran irá realizar um desenho (obs.: a dica foi dada anteriormente, ao ler "the king likes drawings" invertido no vidro do banheiro trancado, com a Fran sob efeito da pílula, na sala após passar pela primeira porta trancada). Entregue o desenho a Damian e ele permitirá que você pegue o Walking Cane.

Abra seu inventário e combine o Walking Cane com o Pink Shash, depois a mistura com o Hook. Isso irá resultar no "Grab-O-Matic 2000". Volte na sala anterior e fale com Annie, sentada sobre o sofá. Alimente o diálogo até que ela lhe dê um Magic Stuff (Sonífero em Pílula). Combine o Magic Stuff com o Cinammon Bun para formar um Drugged Cinnamon Bun.

Agora retorne até a sala do Guarda. Fale com ele e este revelar-se-á um pedófilo muito sujo. Após o desagradável diálogo, tente usar o Drugged Cinnamon Bun nele. Esta sequencia de opções é relevante, pois isso decidirá se ele irá ou não comer, de fato, o bolo com o sonífero. Para tal, escolha as opções "1. A Cake! Eat it!/2. You'll Regret It!/3. Fresh from the Oven!" (Isso irá lhe garantir uma conquista no Steam).

Escolher qualquer uma das opções "erradas" impedirá que o guarda coma o bolo. Caso isto ocorra, retorne ao refeitório e um diálogo entre as enfermeiras irá ocorrer. Após tal cena, pegue o Very, Very hot Coffe sobre a mesa e use-o no Guarda. Fran, muito espertinha, saberá o que fazer neste caso. 

Diante de qualquer uma das duas situações, use o Grab-O-Matic 2000 para alcançar a Office Key sobre a mesa do Guarda.
Use-a na porta trancada nesta mesma sala e adentre o escritório do Dr. Deern. Aqui, você deve obter a Stolen Key sobre o chaveiro á esquerda da sala e o Alarm Code Note no mural á direita. 
Depois, tente sair da sala. O garoto Phil irá surgir e, após um diálogo muito esquisito, este irá prendê-la no escritório. Use uma pílula e, sob seu efeito, aguarde a passagem da calefação ser aberta. Prossiga com a animação até acordar na sala de limpeza. Aqui, suba as escadas e use a Stolen Key na porta trancada. Ao tentar entrar, um evento irá ocorrer. Após acordar pela segunda vez, prossiga para a recepção pelo caminho único, e outra cena irá ocorrer.

Agora, use uma pílula e, sob seu efeito, coloque a Stolen Key sobre o chaveiro do lado direito na sala. Cesse o efeito da pílula e prossiga com a cena. Agora, vá até o painel do alarme e digite a senha '2932' (obs.: A dica está no 'Alarm Code Note' obtido anteriormente, 'December17, July25', isto é '12+17, 7+25', ou seja, '29,32') para desligar o alarme.

Depois, saia do hospital e prossiga com a cena até chegar ao labirinto. Aqui, um pequeno Mini-game de labirinto irá ocorrer. Completá-lo não é obrigatório, e pode ser pulado apertando-se o botão no canto superior-direito da tela, entretanto, completá-lo irá lhe garantir uma conquista no Steam. Note que o labirinto não é muito difícil e as criaturas aqui só andam horizontalmente.
Feito isso, o primeiro capítulo do jogo estará completo. Note que o item Green Crayon será passado adiante consigo e, futuramente, terá seus usos.

Até a próxima! Clique abaixo para ir para o guia do próximo capítulo de Fran Bow!

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!

sábado, 28 de março de 2015

[Game Maker] Aula 3 - Configurando os inimigos

Nesta aula, eu irei mostrar como configurar, passo á passo, um inimigo simples, porém funcional. A característica do "inimigo" em todos os jogos é impedir o progresso do jogador com a inteligência artificial que lhe foi dada, criando um PvE.

Continuando a partir do que foi feito na aula anterior, desta vez vamos configurar os inimigos do jogo. O inimigo será muito simples: suas funções básicas serão avistar o jogador, perseguir o jogador, atacar o jogador caso tenha a oportunidade e também apanhar do jogador, até que venha a morrer.

Índice:
1. Preparações de sprites e objetos
2. Configurando o inimigo I
3. Configurando efeitos visuais
4. Configurando o inimigo II
5. Interação entre inimigo e personagem
6. Configurando o inimigo III
7. Morte, Game Over e outros detalhes
8. Finalização

1. Preparações de sprites e objetos
Primeiro, temos que criar outros sprites para os inimigos, neste caso, chamamos o primeiro de sprite_inimigo_menor. Você pode alterar este nome, como lhe convir melhor. Este primeiro sprite não será diferente de todos os outros: 16x16 e ponto de origem centralizado (x:8;y:8). O segundo, chamados de sprite_inimigo_grande. Como o próprio nome já diz, faremos um inimigo um pouco maior: 24x24, também com o ponto de origem da imagem centralizado (x:12;y:12). Você pode fazer uma animação básica em ambas as sprites se desejar, embora seja puramente cosmético.

Como fizemos um inimigo maior que a nossa Mask padrão (16x16), criaremos então um novo sprite para servir de Mask para ele. Faça como a mask anterior: uma imagem de tamanho 24x24, com um círculo redondo cobrindo a imagem o máximo possível, com a origem centralizada, chamado de sprite_mask_maior24x24. Desta maneira:

Agora, vamos criar objetos para os inimigos, porém vamos fazer isso de uma maneira um pouco diferente do que estávamos fazendo anteriormente. Vamos fazer o uso do recurso Parent.

Crie um objeto. Independente do nome que você deu os sprites, o nome do objeto deve ser objeto_inimigo_geral. Agora crie outros dois objetos, agora com o nome em relação aos sprites que você deu, neste caso, objeto_inimigo_menor e objeto_inimigo_maior. Em ambos, coloque as seguintes características: Solid, coloque suas sprites e masks correspondentes e por fim, seu Parent deve ser o objeto_inimigo_geral. Algo parecido com isso:

Agora que o terreno está pronto, vamos para a parte do GML.
_____________________________________________________

Antes, deixe-me dar uma breve explicação do que ocorreu aqui: nós colocamos o Parent do objeto_inimigo_menor e objeto_inimigo_maior como objeto_inimigo_geral. Ou seja, todas as alterações e tudo o que diz respeito ao objeto_inimigo_geral afetará diretamente os outros dois. Por exemplo: se quiséssemos destruir todas as instâncias do objeto_inimigo_menor e objeto_inimigo_maior, não teríamos que fazer duas ações: basta destruir todos os objeto_inimigo_geral, e seus representantes serão destruídos por consequência.

Neste caso, tudo o que estiver interligado com o objeto_inimigo_geral ou com os outros dois será considerado para o jogo um inimigo. A grande vantagem disso é que só iremos configurar os inimigos uma única vez e depois faremos pequenas alterações entre um e outro para darmos á cada um características mais únicas.

Se não tivéssemos feito isso, teríamos que copiar e colar o mesmo código em todos os inimigos do jogo e, caso algo tivesse dado errado ou quiséssemos fazer uma alteração, teríamos que fazer de um em um, pacientemente. Vale lembrar que uma instância do objeto_inimigo_geral nunca vai entrar diretamente no jogo. Ele só irá participar indiretamente, através dos seus "representantes".

Para que um "filho" faça exatamente a mesma coisa que seu pai em um determinado evento, existem duas opções: deixar o evento intocável no representante, ou então usar o a função "event_inherited();". A função "event_inherited();" basicamente copia o código do evento que ela foi adicionada do objeto-pai para o objeto-representante. Não se preocupe em entender isso agora, logo iremos trabalhar encima deste conceito e tudo ficará mais claro.
_____________________________________________________

Também é interessante colocar o Parent do objeto_inimigo_geral como objeto_obstaculo_geral, pois assim o inimigo também funcionará como um obstáculo comum qualquer, que o jogador não possa atravessar.

2. Configurando o inimigo I
Certo! Agora, vamos mexer nas características do objeto_inimigo_geral. Não precisamos alterar nada á respeito de sprite, nem solid, nem mask, nem visible, etc, pois como já dito, ele nunca vai entrar no jogo diretamente, logo, estas características pouco importam. Primeiro, vamos configurar sua visão simples e faremos com que ele persiga o jogador. No Create Event, coloque:

{
   //Variáveis que serão alteradas no futuro
   var_atributo_velocidade = 0;
   var_atributo_dano = 0;
   var_atributo_visao = 0;
   var_atributo_vida = 0;

   //Variáveis que não serão alteradas
   var_alvo = objeto_jogador_geral
   var_provocado = 0;
   var_morto = false;
}

Como podemos ver, atribuímos muitas características ao nosso futuro oponente. Muitas estão zeradas pois no iremos alterar seus valores somente no objeto_inimigo_menor e objeto_inimigo_maior. Atribuímos também a variável var_alvo como o objeto_jogador_geral para ajudar a sermos menos redundantes nos códigos. Agora vamos trabalhar com elas agora.

No Step Event, coloque o seguinte:

{
//Vira o sprite do inimigo de acordo com a direção que ele anda...
image_angle = direction;

//Caso o jogador estteja dentro do raio de visão inimiga...
if distance_to_object(var_alvo) <= var_atributo_visao
    {
    
    //... e também se não houver nenhuma parede que atrapalhe a visão do inimigo...
    if !collision_line(x, y, var_alvo.x, var_alvo.y, obj_obstaculo_geral, 1, 1)
        {
        
        //A variável var_provocado será constantemente colocada com valor 90.
        //Como será uma variável para indicar tempo, 90 = 3 segundos (pois 30 = 1 segundo).
        var_provocado = 90;
        
        }
    
    }
    
//Se o inimigo estiver provocado...
if var_provocado > 0
    {
    
    //Diminui a variável provocado constantemente.
    //Como acima atribuímos o valor de 90, significa que o inimigo que perder 
    //a visão do jogador tentará encontrá-lo por mais 3 segundos, 
    //e depois irá desistir.
    var_provocado -= 1;
    
    //Tenta chegar ao jogador. O mp_potential_step é
    //muito poderoso pois é uma função que permite
    //as instâncias chegarem entre sí evitando sempre
    //obstáculos sólidos.
    mp_potential_step(var_alvo.x, var_alvo.y, var_atributo_velocidade, 0);
    
    }
}

Acabamos de utilizar as variáveis var_alvo, var_atributo_velocidade, var_atributo_visao, var_provocado. Vale á pena comentar um pouco sobre duas funções importantíssimas que acabamos de utilizar no código acima: collision_line e mp_potential_step.

A collision_line cria uma linha imaginária entre um ponto (x¹, y¹) e outro (x², y²), neste caso, entre o ponto do inimigo e o ponto da personagem. É extremamente útil, especialmente da forma que aplicamos acima: isso funciona como uma linha de visão do inimigo, onde ele só consegue "ver" o jogador caso não tenha nenhum objeto_obstaculo_geral entre os dois.

O mp_potential_step é com certeza a função dos deuses. Ela permite que objetos movam-se em direções á um ponto qualquer automaticamente desviando de obstáculos sólidos. Existe outra versão, chamada de mp_potential_step_object onde o objeto não evita obstáculos sólidos, mas sim apenas o objeto que foi especificado. Isso é útil, por exemplo, para fazer com que o inimigo verde passe somente pela parede verde, enquanto o inimigo amarelo passe somente pela parede amarela.

As próximas funções serão referentes á apanhar e morrer e, convenhamos, estas funções precisam de um tempero á mais, para que o jogador de fato saiba que acertou o inimigo e que o inimigo morreu. Para isso, criamos efeitos visuais.

3. Configurando efeitos visuais
Começamos fazendo o principal neste quesito: os sprites dos efeitos. Nesta ocasião, uma animação convincente é obrigatória, pois é intuito deste recurso. Criaremos dois sprites: sprite_efeito_sangue e sprite_efeito_morte (ambos em padrão 16x16 e origem centralizada).

Ofereço-lhe duas imagens que vão cair bem nesta ocasião, use-as se quiser:



Criemos então um novo objeto: objeto_efeito_geral. Diferente dos inimigos, não é necessário criar um objeto para cada efeito visual pois todos eles possuem o mesmo intuito, sempre: aparecem, fazem suas animações e depois somem. A única característica que devemos alterar é sua Depth: coloque em -1 (agora ele estará sempre acima visualmente de qualquer instância que tenha Depth igual ou maior que 0). Agora, no Create Event, defina uma velocidade menor que o padrão (1), algo como:

{
   image_speed = 0.25;
}

E no Other Event: Animation End, coloque:

{
   instance_destroy();
}

Nosso efeito visual está pronto para ser usado á qualquer instante agora.

4. Configurando o inimigo II
Agora podemos completar um pouco mais nosso objeto_inimigo_geral. Continue editando o Step Event (se quiser criar uma nova folha de código para ajudar a organizar a informação, fica á seu critério) com o seguinte:

{
//Se houver um ataque sobre o inimigo...
if place_meeting(x, y, objeto_ataque_geral)
    {
    
    //Se ele estiver vivo ainda...
    if var_morto == false
        {
        
        //Chamaremos o ataque que estiver sobre ele de "var_temporaria_ooo"...
        var_temporaria_ooo = instance_nearest(x, y, objeto_ataque_geral);
        
        //Reduziremos um ponto de sua vida...
        var_atributo_vida -= 1;
        
        //Destruiremos o ataque, pois este já fez sua função.
        with var_temporaria_ooo do
            instance_destroy();
            
        //E criaremos um efeito visual de sangue saindo do inimigo.
        var_temporaria_efeito = instance_create(x, y, objeto_efeito_geral);
        var_temporaria_efeito.sprite_index = sprite_efeito_sangue;
        
        }
    
    }
    
//Caso a vida dele esteja igual ou menor que zero...
if var_atributo_vida <= 0 && var_morto == false
    {
    
    //Então deve ser considerado morto.
    var_morto = true;
    
    //Cria-se um efeito visual temporário referente á isso.
    var_temporaria_efeito = instance_create(x, y, objeto_efeito_geral);
    var_temporaria_efeito.sprite_index = sprite_efeito_morte;
    
    //E destrói a instância, para tirá-la do jogo.
    instance_destroy();
    
    }
}

Se você analisar bem o código acima, compreenderá que agora o inimigo efetivamente apanha e morre depois que atacado um certo número de vezes. Ele está qualquer pronto, mais ainda não faz o principal: atacar o jogador. Podemos fazer isso de milhares de maneiras diferentes, mas eu pretendendo fazer isto da maneira mais simples o possível.

5. Interação entre inimigo e personagem
Para isso acontecer, precisamos fazer mais alterações na nossa personagem. A ideia vai ser a seguinte: fazer com que, ao tomar dano, o personagem fique inatingível por um curto período, podendo tomar outro dano somente quando esta invencibilidade acabar, e isso será muito simples de fazer.

Para isso, voltemos ao nosso objeto_jogador_geral. No Create Event, acrescente três novas variáveis:

{
var_inatingivel = 0;
var_atributo_vida = 10;
var_morto = false;
}

A var_inatingivel vai servir como um timming para definir o período que o jogador vai ficar totalmente inatingível e, portanto, incapaz de tomar outro ataque inimigo. Vamos trabalhar só com ela por enquanto para não confundirmos todas as informações. Ainda no Step event, acrescente o seguinte:

{
if var_inatingivel > 0
    var_inatingivel -= 1;
}

É interessante sempre comunicarmos ao jogador real do que está se passando no jogo, para que ele entenda realmente como as coisas funcionam. Neste caso, é importante deixarmos claro que o jogador está invencível por este período. A maneira mais clássica, usada pela maioria dos jogos de antigamente, para isso é fazermos o personagem ficar "piscando" durante sua invencibilidade. No Step event, acrescente então:

{
//Efeito visual de invencibilidade
if frac(var_inatingivel/2) == 0
    visible = true;
else
    visible = false;
}

Pronto! Agora nossa personagem sabe como apanhar, resta a nós ensinar aos inimigos como bater. Só que nós vamos fazer isso de uma maneira inesperada. Assim como a lógica do personagem e os obstáculos, onde ao invés de ensinarmos os obstáculos a interromperem a personagem, ensinamos a própria personagem a não atravessar os obstáculos, iremos ensinar a personagem á apanhar dos inimigos, e não os inimigos baterem na personagem. Confuso? Relaxe, que você irá entender.

Anteriormente, já tínhamos adicionados as variável "var_atributo_vida = 10" e "var_morto = false" no Create Event do objeto_jogador_geral. Neste caso, ainda no Step Event do objeto_jogador_geral, acrescente o seguinte:

{
    //Se a distância entre o inimigo e o jogador for de 1 pixel, ou seja, estarem extremamente pertos...
    if distance_to_object(objeto_inimigo_geral) <= 1
        {
        
        //E a personagem não esteja em período de invencibilidade...
        if var_inatingivel <= 0
            {
            
            //Chamaremos

            //A personagem perde pontos de vida e torna-se intocável por 3* segundos. 
            //* Lembre-se que 30 = 1 segundo, em termos de tempo.
            var_atributo_vida -= 1;
            var_inatingivel = 90;
            
            //E por fim criaremos um efeito visual de sangue saindo da personagem.
            var_temporaria_efeito = instance_create(x, y, objeto_efeito_geral);
            var_temporaria_efeito.sprite_index = sprite_efeito_sangue;
            
            }
        
        }
    
    //Se a vida da nossa personagem chegar á estaca zero...
    if var_atributo_vida <= 0 && var_morto == false
        {
        
        //Ela deve ser considerada morta.
        var_morto = true;
        var_inatingivel = 9999;
    }
}

Com este código, fechamos o nosso sistema de combate básico do jogo. Falta só alguns detalhes á serem feitos.

6. Configurando o inimigo III
Chegamos ao nosso último passo no que diz respeito aos nosso queridos inimigos. Agora, vamos atribuir características diferentes á cada um de nossos inimigos. No momento nós só temos dois: objeto_inimigo_menor e objeto_inimigo_maior, mas nada impede que você crie muitos outros (aliás, eu encorajo que você o faça depois!).

No Create Event do objeto_inimigo_menor, coloque o seguinte código:

{
   //Chama-se o evento do Parent, ou seja, copia as variáveis do seu superior, o objeto_inimigo_geral
   event_inherited();
   
   //Variáveis alteradas de acordo com o inimigo. Todas com valores baixos, de acordo com o jogo, pois é o primeiro inimigo e não deve representar tanta ameaça, especialmente para um jogador novato.
   var_atributo_velocidade = 0.5;
   var_atributo_dano = 1;
   var_atributo_visao = 64;
   var_atributo_vida = 3;
}

No Create Event do objeto_inimigo_maior, coloque o seguinte código:

{
   event_inherited();
   
   //Inimigo um pouco mais agressivo que o primeiro, com valores mais altos.
   var_atributo_velocidade = 0.75;
   var_atributo_dano = 2;
   var_atributo_visao = 80;
   var_atributo_vida = 5;
}

Vale á pena comentar novamente sobre a função "event_inherited();". que adicionamos acima. Se não tivéssemos colocado ela no início do código, certamente teríamos um erro ao executar o código, pois algumas variáveis importantes características dos inimigos (como a "var_alvo = objeto_jogador_geral;" e a "var_provocado = 0;") se encontram apenas no objeto-pai.

Por outro lado, se tivéssemos colocado um "event_inherited();" no final do código, também não teria dado certo, pois todas as alterações que fizéssemos seriam em vão, já que todos os valores voltariam á ser 0, igual o objeto-pai (o código é executando sempre da primeira em direção á última linha).

Entendido isso, podemos passar para o último passo desta aula.

7. Morte, Game Over e outros detalhes
Assim como tivemos que adicionar detalhes visuais para quando o inimigo morre, também teremos que o fazer para quando a personagem chega ao seu destino final. Obviamente, a morte da nossa personagem é muito mais relevante que a morte de um inimigo comum e, por este motivo, devemos fazer algo mais impactante.

A ideia é criarmos uma cena em que torne claro que o jogador falhou ao deixar sua personagem morrer e, portanto, terá que tentar novamente desde o começo da fase.

Para isso, podemos criar um novo objeto: o objeto_game_over. Com este nome intuitivo, podemos começar á trabalhar nele. Ele não precisa de sprites, nem masks e nem coisas do tipo, apesar disso, ele irá participar diretamente do jogo e não através de um representante. Porém, como sendo um recurso do jogo irrefutável, deve estar acima de qualquer coisa, logo, terá que ter uma Depth extremamente baixa. Algo em torno de -99 é o suficiente.

Agora, vamos dar o primeiro passo ao que chamamos de Interface do usuário, embora isso é um assunto que será abordado em uma próxima aula. Agora, só faremos o necessário.
No objeto_game_over, vamos trabalhar alguns conceitos diferentes: alarms e draw event. Antes de mais nada, vamos ao Create Event do objeto_game_over:

{
//Torna todas as instâncias da room invisíveis, inclusive ela
with all do
    visible = false;

//Torna-se visível novamente
visible = true;

//Dois alarms, [1] para ser adicionado nesta exato momento e o [0], em 1 segundo, pois 30 = 1 segundo real.
alarm[1] = 1;
alarm[0] = 30;
}

Colocamos dois alarms para executar suas ações com intuitos diferentes. Em geral, coloca-se alarms com número irrisórios, como o caso do alarm[1] = 1, para que ele seja executado exatamente depois do Crate Event e do Other: Room Start do objeto em questão. Já no caso do alarm[0] = 30, colocamos em um perído não tão grande assim (1 segundo apenas), porém já faz uma certa diferença para o jogador real, já que ele vai, de fato, demorar um pouco para ser ativado.

No evento do Alarm[1] do objeto_game_over, que será ativado praticamente no momento que o objeto_game_over entrar em cena, coloque:

{
//Isso vai fazer com que o jogo congele por 2000 milissegundos, ou 2 segundos).
sleep(2000);
}

Já no evento do alarm[0] coloque o seguinte:

{
//Isso fará com que a room reinicie-se, como forma de punição ao jogador por ter deixado a personagem morrer.
room_restart();
}

Agora, no Draw Event, vamos realmente ao que interessa: a mensagem do jogo ao jogador real de que ele falho e deve tentar novamente. O Draw Event nada mais é que desenho de vetores, formas geométricas e textos na tela do jogador. Não é algo que interaja com as instâncias da room, tornando assim o meio ideal para criar a interface do jogador.

Como vamos trabalhar com textos, é interessante primeiro criar uma fonte. A Font pode ser criada como qualquer outro recurso comum. Lá, você pode pegar os caracteres de uma fonte qualquer instalada no seu computador, mas deve levar em conta que isso não significa que o jogador que baixar o seu jogo terá a mesma fonte no computador dele, portanto, prefira fontes comuns e populares (isso explica do por quê você baixa aquele jogo em coreano e todas as "letras" transformam-se em quadrados iguais).
Você tem de considerar também que nem todas as fontes são adaptadas ao português e, portanto, não terão caracteres de letras acentuadas. Para verificar se a fonte possui tais caracteres, clique em "All" para que o character range fique de 0 á 255, e depois verifique dentro do jogo. A fonte pode ser á sua escolha, no tamanho que achar melhor, negrito ou não, itálico ou não. Apenas dê o nome á ela de fonte_padrao0.

Agora, para finalizar, no Draw Event do objeto_game_over, coloque o seguinte código:

{
    //Torna todas as formas geométricas, textos e vetores á seguir na cor PRETA.
    draw_set_color(c_black)
    
    //Desenha um retângulo com essas característica.
    draw_rectangle(x-96, y - 32, x + 96, y + 32, 0);
    
    //Torna todas as formas geométricas, textos e vetores á seguir na cor BRANCA.
    draw_set_color(c_white);
    
    //Torna todos os textos á seguir centralizados tanto horizontalmente quanto verticamente.
    draw_set_halign(fa_center);
    draw_set_valign(fa_middle);
    
    //Aplica a fonte que criamos anteriormente.
    draw_set_font(fonte_padrao0);
    
    //Desenha o texto conforme as características dadas acima.
    draw_text(x, y, "Uh oh!#Tente novamente!");
}

Agora, vamos á tão esperada...


8. Finalização
Verifique se tudo está OK durante o teste. Característica á se verificar:

- Inimigos perseguem o jogador.
- Inimigos atacam o jogador.
- Inimigos não adentro paredes.
- Jogador apanha somente em no mínimo de 3 em 3 segundos.
- Jogador morrer.
- Inimigos apanham e morrem.
- Cena de game over, e logo após a sala reinicializa.

Se tudo ocorrer como o esperado, parabéns! Mais um passo concluído. Vale á pena lembrar que o seu personagem consegue andar para trás, então use esta função durante o teste para atacar ao mesmo tempo que se afasta do inimigo!
Ufa! até a próxima!


terça-feira, 24 de março de 2015

[Game Maker] Aula 2 - Adicionando os obstáculos básicos!

Continuaremos nosso guia para iniciantes em Game Maker. Neste guia, continuaremos o que fizemos na aula passada. Desta vez, vamos dar uma olhada mais á fundo nas Rooms, e discutirmos um pouco sobre background. Mas, principalmente, iremos aprender a usar os importantíssimos tilesets!

Na aula passada, conseguimos terminar o nosso personagem básico. Ele anda, ele ataca, mas provavelmente está deprimido, pois ele não tem por onde andar e muito menos em quem atacar. Neste caso, vamos dar um passo de cada vez. Começaremos então utilizando a room criada na aula passada, a nossa rm_testroom.

Começaremos a dar um visual ao nosso jogo, adicionando dezenas de Tilesets. A vantagem do uso de Tilesets é que você pode criar um único obstáculo geral, e colocá-lo sobre os Tilesets que podem tanger com a personagem. O jogador terá a impressão de que tudo aqui é sólido e real, mas na verdade estamos usando uma parece invisível por cima de tudo aquilo. A grande vantagem disso é a ENORME economia de memória, tornando o seu jogo muito mais rápido, leve e com uma boa fluidez. 

"Ahn?!? TILESET?!? Que isso?! Parede invisível?! Porra, explica isso direito!"

Bom, nada melhor do que visualizarmos como vai ser feito:

Isso é uma room com os Tilesets. Tudo o que você vê nela: árvores, lagos e pedras, não existe. Você está vendo, mas para o jogo isso não tem o menor significado, ou seja, seu personagem vai passar por cima disso tudo como se não houvesse nada. E, de fato, não há. 
A ideia é marcarmos os obstáculos para o jogo entender que o seu personagem não pode, em hipótese alguma, passar por ali andando. E obviamente não iremos fazer isso em todos as árvores, rios e pedras da tela: é aí que mora o segredo. Nós vamos colocar as paredes invisíveis que eu mencionei apenas sobre os obstáculos que o jogador pode a vir encostar:

Agora que nós ja temos idéia, vamos trabalhar encima disso. Primeiro de tudo, vamos criar uma nova Mask, desta vez com o formado quadrado e que tenha sua origem no (0,0). Isso por quê paredes invisíveis devem ser blocos consistentes que ocupam a área toda (se nós usarmos a Mask redonda, dará a impressão que ela tem "buracos" quando o jogador andar encostando nela). E o fato da origem ser (0,0) é que é muito mais fácil alinhar com os tilesets desta maneira. Então, na prática, deverá ficar algo parecido com isto:
Nomeie esta nova mask de sprite_mask_qudrado16x16. Esta mask será exclusiva das paredes invisíveis: todo o resto dos objetos utilizará a mask anterior (sprite_mask_padrao16x16).

Agora, crie um objeto chamado de "objeto_obstaculo_geral". Nele, coloque a mask quadrada 16x16 que acabamos de criar, desmarque a opção Visible e marque a opção Solid. Agora, precisamos que o nosso personagem entenda que isso é um obstáculo, e ele não pode passar por ele. Quero que note que isso não deve ser feito ao contrário: nunca devemos ensinar o obstáculo a não deixar o personagem passar por cima dele. Isso se deve ao fato de que em todas as rooms teremos um único personagem, e dezenas ou centenas de paredes invisíveis. É muito melhor ensinar um que vale por todos, do que ensinar todos para lidar com um. Além do mais, para objetos em que usaremos muitas instâncias simultaneamente como é o caso das paredes invisíveis, é sempre melhor que usemos o mínimo de eventos possível, para não sobrecarregar a memória do computador. 

Já podemos deixar o objeto_obstaculo_geral de lado então, e voltemos ao objeto_jogador_geral mais uma vez. Desta vez uma coisa bem rápida: vamos adicionar um evento de Colisão entre o nosso objeto_jogador_geral com o nosso objeto_obstaculo_geral. Apenas este simples código irá resolver nosso problema:

{

//Ao colidir com o obstáculo, o jogador volta para as coordenadas anteriores à colisão, efetivamente tornando impossível ele passar por cima de um obstáculo qualquer.
x = xprevious;
y = yprevious;

}

Pronto! Agora temos o obstáculo em sí, a parede invisível. Mas para que ela faça algum sentido (à menos que o propósito do jogo seja encontrar o caminho através de um caminho invisível) precisamos também da parte visual. E isso é trabalho dos já mencionados Tilesets
Um tileset nada mais é que um plano de fundo (background) dividido em vários cortes iguais. O tamanho do Background pode ser qualquer. Eu recomendo que você, por hora, use um do tamanho 80x80. As divisões devem ser de 16x16 (para dividir, selecione a opção do background "Use as Tileset"). Na hora da edição da imagem, você só conseguirá ver onde estão as linhas de recorte se você configurar e ativar a Grid corretamente, desta maneira:
Lembre-se que deixar cada um no seu quadrado, literalmente, é muito importante. Você pode utilizar dois ou mais quadrados para um mesmo desenho, sem problemas, mas é importante respeitar as linhas de divisão dos outros desenhos. Neste Tileset, você irá colocar todos os seus obstáculos. Se precisar, aumente o tamanho do background utilizando a opção de edição "Resize cavas...", mantendo-os sempre á esquerda-superior, para evitar estragar os desenhos nas Rooms. Como os obstáculos são tamanho padrão 16x16, prefira manter o background em múltiplos de 16 para formar quadrados perfeitos (por exemplo, 80x80, 160x160, 128x128, 192x192, etc).

Assim que desenhado os obstáculos, distribua-os na rm_testroom e aplique a mesma lógica mostrada no início: coloque uma instância do objeto_parede_invisível sobre todos os tilesets que o jogador possa, de qualquer maneira, encostar.

É importante lembrar que, assim como os objetos, os tilesets também usam o recurso de depth. Logo, você pode criar várias camadas diferentes de tilesets, garantindo sempre que o tileset usando no chão fique abaixo do tileset da parede, por exemplo.

Para finalizar, para cobrir o plano de fundo você pode criar outro background comum, chamado bg_comum_0. Em seguida, para aplicar um background na room, basta ir na aba "backgrounds", selecionar o "background 0" e selecionar a imagem. Dica: ao usar uma imagem como background, desative a opção "Draw background color" para, de novo, poupar o máximo de memória da máquina possível.
Não se esqueça de desativar a "Draw Bg. Color", como eu fiz.
Feito isso, já podemos ir para a nossa primeira...


Observer se a movimentação da personagem está com fluidez. Observe se ele não fica travando nas paredes. Caso isso ocorra, o problema está provavelmente nas Mask tanto da personagem quanto da parede invisível. Lembre-se de manter as paredes invisiveis sempre organizadas e perfeitamente colocadas sobre os Tilesets, para não dar a impressão de que o jogo está com algum defeito.

Eis outro exemplo da utilização dos Tilesets com a disposição das paredes invisíveis:
Sem as paredes invisíveis.
Com as paredes invisíveis.
Certinho! Nossos obstáculos estão funcionando perfeitamente (uhul!)! E agora que você já sabe o truque, pode começar a praticar, criando novos Tilesets e treinando seu olho para perceber com mais velocidade onde você precisa ou não encaixar as paredes invisíveis. Tudo é questão de prática!

Com isso, já podemos ir para a próxima aula!