Sistema de Nadar e andar debaixo d'Água
Autor: Dr.XGB
Plataforma: RPG Maker 2000 e RPG Maker 2003
Dificuldade: Intermediário
E aí, pessoal?
Neste tópico vamos aprender a fazer um sistema um tanto interessante, baseando-se na ideia principal do jogo Breath Of Fire, onde você pode andar debaixo d'água. Aproveitando esse sistema, vou fazer um esquema um tanto diferente em relação a um sistema de natação, onde o herói pode nadar tanto na superfície quanto poder afundar mais um pouco, podendo aproveitar para pegar itens que ficam debaixo d'água; e, assim então, faremos uma opção para que o herói afunde mais ainda, chamando um novo mapa que é o mesmo, porém debaixo d'água.
No tutorial a seguir, teremos cada detalhe desta técnica para fazer esse sistema, causando uma impressão mais atrativa ao seu projeto.
Então vamos lá!
Etapa 1: Nadando na superfície
Antes de tudo, precisaremos criar um sistema bem básico para fazer o herói nadar sobre a superfície. É importante que você tenha os gráficos do herói nadando para causar tal impressão.
Caso você não tenha nenhum, você pode usar este:
Autor: Black-Dragon
Após definido o charset do seu herói, vamos ao Database na aba Tilesets (em algumas versões ainda está Chipset), alterar o tile da água como passível para que o nosso sistema funcione assim que ele entrar na água. Memorize o número do terreno do tile da água (de acordo com o padrão temos o número 9)e vamos agora aos Eventos Comuns.
0001: Hero Coordinates
Processo Paralelo
(sem switch)
Este evento comum será feito apenas para verificar as coordenadas do herói dentro do mapa. Ele será muito importante para o funcionamento do sistema, ajudando-nos a verificar se o herói está na água ou não. Daí então teremos um Wait de 0.0 segundos, que serve para o evento fazer uma breve pausa antes de repetir o comando outra vez; ótima opção para prevenir lags dependendo dos eventos paralelos realizados simultaneamente. Em computadores mais antigos, é bom colocar no mínimo 0.2s pelo fato da memória ser muito pequena para processar os dados que serão repetidos, porém não terá uma funcionalidade satisfatória.
Então teremos os seguintes comandos:
<> Variable Oper: [0001: Hero.X] Set, Hero X Coord. <> Variable Oper: [0002: Hero.Y] Set, Hero Y Coord. <> Wait: 0.0 Sec <>
0002: Check on the Water
Processo Paralelo
(sem switch)
Aqui é onde vamos desenvolver a base do sistema. Começamos realizando a verificação de terrenos com o comando Store Terrain ID, armazenando nele as variáveis Hero.X e Hero.Y e a Id do terreno a uma nova variável. Daí então vamos usar uma condição para determinar se haverá uma switch ativada. Essa tal Switch será utilizada para verificar se o herói está nadando ou se está fora d'água para podermos mudar o gráfico do herói nadando ou em pé.
Criaremos, em seguida, uma condição com ELSE, onde nela ficará o comando para sair da água e o Else para entrar na água. Se você memorizou o número do terreno da água, você deve, então, verificar se a variável retornada pelo Store Terrain ID possui o valor 9; sendo que quando a switch está ativada, é para verificar se é diferente de 9, se estiver desativada ela deve ser igual a 9.
<> Store Terrain ID: (V[0001],V[0002]), [0003: Hero.TerrainID] <> Branch if Switch [0001: Swimming Mode] is ON <> Branch if Variable[0003: Hero.TerrainID] is 9 Not <> Play Sound: water1 <> Change Sprite Association: Zack blonder-1 // Gráfico do herói normal <> Switch Operation: [0001: Swimming Mode] - OFF <> : End <> : Else Handler <> Branch if Variable[0003: Hero.TerrainID] is 9 <> Play Sound: water1 <> Change Sprite Association: Zack blonder-5 // Gráfico do herói nadando <> Switch Operation: [0001: Swimming Mode] - ON <> : End <> : End <> Wait: 0.0 Sec <>
Antes de passarmos para a próxima etapa, teste o jogo e verifique se não houve nenhum erro ou bug durante o jogo.
Etapa 2: Afundando o Herói
Agora vem a parte que vai deixar este sistema diferente: a ação do herói afundar na água. Você pode aproveitar isso, fazendo como se fosse uma segunda camada; deixando objetos no fundo onde você só pode interagir com eles se você afundar. Enquanto estiver na superfície, não há como interagir com os objetos no fundo do mar.
Vamos continuar o nosso trabalho na área dos Eventos Comuns!
0003: Going to the Deep
Processo Paralelo
Switch: [0001: Swimming Mode]
Este evento vai fazer com que o herói afunde ao pressionar a tecla "Shift". Com isso, usamos o comando Key Input Process ("Enter Password" no 2000). Se você estiver usando o RPG Maker 2000, você pode usar o Enter mesmo, o problema é que pode causar conflito com um NPC; porém o Shift é usado no Rm2k Value, que é uma atualização do mesmo que permite o uso do Shift.
Antes de chamar o comando da tecla de entrada, vamos usar outra switch e criar uma condição para que esta esteja desativada. A segunda switch será usada para o movimento debaixo d'água, ela será útil para o próximo evento comum e para que o herói não afunde de novo mesmo que já esteja no fundo. Aí então chamamos o Key Input Process com a opção Wait Until Key Pressed marcada.
Lembrando que o valor retornado para a tecla Shift é o número 7, dentro da condição da switch, criaremos outra condição com esta variável e o valor retornado pela tecla.
Depois disso, mude o gráfico do herói para o mesmo (nadando), porém transparente, causando o efeito de que ele está debaixo d'água e então ative esta nova Switch para indicar que agora ele está, definitivamente, no fundo.
<> Branch if Switch [0002: Dive Hero] is OFF <> Key Input Proc: [0004: Hero.SwimKey] <> Branch if Variable [0004: Hero.SwimKey] is 7 <> Play Sound: water3 <> Change Sprite Association: Zack blonder-5 <> Switch Operation: [0002: Dive Hero] - ON <> :End <> :End <> Wait: 0.0 Sec <>
0004: Swimmin' on Bottom
Auto Start
Switch: [0002: Dive Hero]
Depois que a switch fora ativada, este evento comum iniciará como Auto Start, travando todos os movimentos do herói. O motivo é simples: quando o herói estiver no fundo, ele não vai poder sair de lá a não ser que ele retorne para a superfície. Para evitar que ele saia da água quando estiver no fundo, teremos que desenvolver o movimento dele manualmente, verificando a Id do terreno do próximo passo. Se o tile que estiver à frente do herói, ele poderá se mover, senão ele apenas vai virar para a direção, como se estivesse uma parede ao invés da grama.
Usaremos a mesma variável da tecla só que agora vamos desmarcar a opção "Wait" e vamos adicionar as teclas direcionais, Enter e Cancel junto de Shift. Daí então criaremos condições, primeiramente para todos os direcionais (baixo, esquerda, direita e cima; nesta ordem). Vou explicar a lógica da tecla baixo e esquerda, daí inverteremos a lógica para as demais.
Vamos criar mais uma variável que servirá para checar a coordenada à frente do herói. No caso da tecla Baixo, pegamos o valor da coordenada Y do herói e acrescentamos por 1. Logo, checaremos a Id do Terreno retornando a Coordenada X e a nova variável, dando a Id do Terreno à mesma variável que usamos na última verificação. Se o jogador pressionar para Esquerda, a nova variável pegará a coordenada X e subtrair por 1, verificando a Id do Terreno com a nova variável e a Coordenada Y do Herói. Para direita, pega o X e som por 1, e para cima, a coordenada Y subtraída por 1.
Para cada uma das teclas, criaremos a condição se a Id do Terreno é 9, se for ele dará um passo à direção desejada, senão ele apenas vai virar para a direção escolhida pelo jogador. Para que não haja conflito entre os movimentos, use o comando Proceed with Movement ("Move All" no Rm2k) para que o comando possa continuar quando o herói terminar o movimento.
<> Input Key Proc: [0004: Hero.SwimKey] <> Branch if Variable [0004: Hero.SwimKey] is 1 <> Variable Oper: [0005: Hero.CanMoveTo] Set, Hero Y <> Variable Oper: [0005: Hero.CanMoveTo] +, 1 <> Store Terrain ID: (V[0001],V[0005]), [0003: Hero.TerrainId] <> Branch if Variable [0003: Hero.TerrainId] is 9 <> Move Event: Hero, Move Down <> :Else Handler <> Move Event: Hero, Face Down <> :End <> Proceed with Movement <> :End <> Branch if Variable [0004: Hero.SwimKey] is 2 <> Variable Oper: [0005: Hero.CanMoveTo] Set, Hero X <> Variable Oper: [0005: Hero.CanMoveTo] -, 1 <> Store Terrain ID: (V[0005],V[0002]), [0003: Hero.TerrainId] <> Branch if Variable [0003: Hero.TerrainId] is 9 <> Move Event: Hero, Move Left <> :Else Handler <> Move Event: Hero, Face Left <> :End <> Proceed with Movement <> :End <> Branch if Variable [0004: Hero.SwimKey] is 3 <> Variable Oper: [0005: Hero.CanMoveTo] Set, Hero X <> Variable Oper: [0005: Hero.CanMoveTo] +, 1 <> Store Terrain ID: (V[0005],V[0002]), [0003: Hero.TerrainId] <> Branch if Variable [0003: Hero.TerrainId] is 9 <> Move Event: Hero, Move Right <> :Else Handler <> Move Event: Hero, Face Right <> :End <> Proceed with Movement <> :End <> Branch if Variable [0004: Hero.SwimKey] is 4 <> Variable Oper: [0005: Hero.CanMoveTo] Set, Hero Y <> Variable Oper: [0005: Hero.CanMoveTo] -, 1 <> Store Terrain ID: (V[0001],V[0005]), [0003: Hero.TerrainId] <> Branch if Variable [0003: Hero.TerrainId] is 9 <> Move Event: Hero, Move Up <> :Else Handler <> Move Event: Hero, Face Up <> :End <> Proceed with Movement <> :End <> Wait: 0.0 Sec <>
Continuaremos este evento comum na próxima etapa para terminarmos de fazer as demais teclas.
0005: Leave Bottom
Processo Paralelo
Switch: [0002: Dive Hero]
Para que não haja conflito entre afundar e emergir com a tecla Shift, vamos fazer o sistema para emergir em outro evento, numa outra variável.
A única diferença é que colocaremos um Wait de 0.2 segundos antes da condição da tecla do outro evento. Ela tem uma ligação com a próxima etapa, portanto não se preocupe com isso ainda.
<> Input Key Proc: [0006: Hero.DiveKey] <> Branch if Variable: [0006:Hero.DiveKey] is 7 <> Wait: 0.2 Sec <> Branch if Variable: [0004: Hero.SwimKey] is 7 Not <> Play Sound: water1 <> Change Sprite Association: Zack blonder-5 <> Switch Operation: [0002: Dive Hero] - OFF <> :End <> :End <>
Etapa 3: No fundo do Mar
Agora vamos chegar ao ponto principal da ideia baseada naquele sistema do Breath Of Fire. Só que aqui vamos fazer diferente: o jogador precisa pressionar a tecla Shift por 2 segundos para que ele vá para o fundo num outro mapa. Antes de continuarmos o sistema, vamos copiar o mapa atual e colar um novo. Depois disso, inverta os pisos: onde estava a água será o chão e onde era o chão será a parede e o teto.
Voltando ao evento comum 0004, logo antes do Comando Wait 0.0 Sec, vamos criar uma condição para a tecla Shift, e nela vamos usar uma variável que vai representar cada décimo de segundo passado com a tecla pressionada; se apertar outra tecla, essa variável volta ao zero. Daí então quando esta variável chegar a 20 (2 segundos), memorizar o mapa e a coordenada, transportando para o mapa copiado. Como o comandoTeleport não trabalha com variáveis, vamos realizar um improviso com o comando Recall to Memorized Position, colocando uma outra variável com a Id do outro mapa, que você vai configurar dentro do próprio mapa. Em seguida, desativaremos as duas switches do sistema e ativaremos uma terceira e a nova variável volta ao valor de 0.
[...]<>BranchifVariable:[0004:Hero.SwimKey]is7 <> VariableOper:[0007:DiveHandle]+,1 <>Wait:0.1Sec <>:ElseHandler <>VariableOper:[0007:DiveHandle]Set,0 <>:End<>BranchifVariable:[0007:DiveHandle]is20or more <>MemorizeLocation:[0008],[0001],[0002] <>PlaySound: water3 <>HideScreen:WaverScreen <>Wait:0.2Sec <>Recall to Location:[0009],[0001],[0002] <>TintScreen:(R 100, G 100, B 200, S 100)0.0Sec <>Wait:0.2 sec <>ShowScreen:WaverScreen <>SwitchOperation:[0003:Underwater]- ON <>SwitchOperation:[0001:SwimmingMode]- OFF <>SwitchOperation:[0002:DiveHero]- OFF <>VariableOper:[0007:DiveHandle]Set,0 <>:End<>Wait:0.0 sec <>
0006: Back to Surface
Processo Paralelo
Switch: [0003: Underwater]
Já no mapa debaixo d'água, teremos outro evento comum, no qual você fará o mesmo comando de mergulhar para fundo, agora para voltar à superfície. O comando é exatamente o mesmo, porém sem as outras teclas, apenas o Shift; sem falar que certas alterações deverão ser inversas do evento 0004. Vamos usar as mesmas variáveis e voltar o herói para o mapa memorizado, porém na coordenada atual.
<> Input Key Proc: [0004: Hero.SwimKey] <> Branch if Variable: [0004: Hero.SwimKey] is 7 <> Variable Oper: [0007: Dive Handle] +, 1 <> Wait: 0.1 Sec <> :Else Handler <> Variable Oper: [0007: Dive Handle] Set, 0 <> :End <> Branch if Variable: [0007: Dive Handle] is 20 or more <>Play Sound: water3 <> Hide Screen: Waver Screen <> Wait: 0.2 Sec <> Recall to Location: [0008], [0001], [0002] <> Tint Screen: (R 100, G 100, B 100, S 100) 0.0 Sec <> Wait: 0.2 sec <> ShowScreen: Waver Screen <> Switch Operation: [0003: Underwater] - OFF <> Switch Operation: [0001: Swimming Mode] - ON <> Variable Oper: [0007: Dive Handle] Set, 0 <> :End <> Wait: 0.0 sec <>
Clique aqui para baixar a Demonstração deste tutorial
Agora teste o seu jogo e veja o resultado final. Baixe também a demonstração e veja como o sistema foi utilizado. Sem falar de alguns recursos extras que coloquei na Demo podendo enriquecer ainda mais o sistema.
Para fazer esta Demo, eu utilizei o RPG Maker 2003 v1.08. Quem for usar a Edição "Seita da Vaca Louca", é provável que dê erro na leitura dos gráficos porque na versão em Português eles mudaram o nome dos arquivos do RTP, porém os gráficos são os mesmos. Se isso ocorrer, é só você adaptar os gráficos de acordo com o seu RTP dentro do próprio editor.
É isso aí, pessoal.
Espero que tenham gostado deste tutorial.
Até mais!