Transição estilo Zelda no mesmo mapa

DevRPG2k DevRPG2k
estão participando dessa conversa. 0 membros e 1 visitante (1 bot) estão vendo.

DevRPG2k Membro
Transição estilo Zelda no mesmo mapa
Seg, 27 de julho de 2026, 02:02:07 - Última modificação: Seg, 27 de julho de 2026, 13:03:30 por DevRPG2k

Este tutorial ajudará você a entender facilmente como usar um único mapa com várias seções do mesmo tamanho para jogos como Zelda ou alguns jogos no estilo Metroidvania.

Para melhor explicação, usarei o mapa padrão do RM2K sem modificações, o que significa que a tela terá 320x240 pixels, então cada parte do mapa terá 20x15 tiles:

Após essa parte temos que identificar o centro exato da parte que o jogador começar. Se for na primeira aonde está o trono será em 9x7, se for na segunda parte à direita aonde tem azulejos de pedra será 29x7 e se for abaixo aonde temos os rios e grama será 9x22, então basta somar 20 para a lateral à cada parte do mapa e 15 para baixo.

E agora vamos para a parte que fixa a tela no jogador. Vou criar um evento de mapa em "Processo Paralelo" e usar uma "Switch" para acontecer apenas uma vez:

@> Scroll Map: Fixed ON
@> Control Switches: [0001] = ON

E agora vamos para a parte lógica em relação à posição da tela. Crie uma nova página também em "Processo Paralelo", mas que seja ativada pela Switch que foi ativada na página anterior.

Dentro desta página crie duas variaveis que verifiquem a posição do jogador na tela, isso funciona diferente de coordenadas:

@> Control Variables: [0001:Player-X-Pic] = Player's Screen X
@> Control Variables: [0002:Player-Y-Pic] = Player's Screen Y

Ou seja, se o jogador estiver fora da tela independente da posição dele no mapa o valor vai ser o mesmo que se tivesse iniciado em outro lugar.

O valor exato de quando o jogador está fora da tela são os seguintes:

-8 se for à esquerda da tela

328 se for à direita da tela

0 se for acima da tela

256 se for abaixo da tela

Considerando esses valores para cada posição possível do jogador fora da tela este seria um exemplo pratico pra entender o funcionamento:

Com isso então podemos criar uma condição para cada possibilidade acontecer, o problema é que eventos em "Processo Paralelo" ainda permitem que o jogador se mova, então ao invés disso colocaremos outra Switch:

@> Conditional Branch: Variable [0002:Player-Y-Pic] <= 0
@> Control Switches: [0002] = ON
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] >= 328
@> Control Switches: [0002] = ON
@>
: Branch End
@> Conditional Branch: Variable [0002:Player-Y-Pic] >= 256
@> Control Switches: [0002] = ON
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] <= -8
@> Control Switches: [0002] = ON
@>
: Branch End


Agora vamos criar uma terceira página ativada por essa nova Switch, mas ao invés de "Parallel Process" ela deverá está em "Autorun" que é o disparo automatico do evento, isso impedirá que o jogador se mova até a conclusão, no final dela desligue a Switch:

@> Conditional Branch: Variable [0002:Player-Y-Pic] <= 0
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] >= 328
@>
: Branch End
@> Conditional Branch: Variable [0002:Player-Y-Pic] >= 256
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] <= -8
@>
: Branch End
@> Control Switches: [0002] = OFF


Dentro de cada condição moveremos a visão do mapa com o comando "Scroll Map" usando a opção "Shift Position", coloque na velocidade 6 para não tornar isso entediante para o jogador.

Mas primeiro vamos relembrar o conceito usado, se o jogador estiver fora do limite nas laterais ele terá que deslocar 20 tiles para a direção correspondente, se for acima ou abaixo apenas 15:

@> Conditional Branch: Variable [0002:Player-Y-Pic] <= 0
@> Scroll Map: Up, 15, 6, Wait
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] >= 328
@> Scroll Map: Right, 20, 6, Wait
@>
: Branch End
@> Conditional Branch: Variable [0002:Player-Y-Pic] >= 256
@> Scroll Map: Down, 15, 6, Wait
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] <= -8
@> Scroll Map: Left, 20, 6, Wait
@>
: Branch End
@> Control Switches: [0002] = OFF

Com isso você já tem a base para a criação de um jogo ou mini-game que dependa de um único mapa.


Agora imagine que você precisa criar um mapa com paredes entre os cômodos. Nesse caso, os valores não precisam estar fora da tela. Vou dar um exemplo de um mapa com paredes:

Seguindo este exemplo, os valores da posição do jogador na tela serão os mesmos mostrados acima, deslocando-se apenas 16 pixels em relação ao exemplo anterior:

  1. Quando o ScreenY atingir 16, a transição será para cima
  2. Quando o ScreenY atingir 240, a transição será para baixo
  3. Quando o ScreenX atingir 8, a transição será para a esquerda
  4. Quando o ScreenX atingir 312, a transição será para a direita

Page 3:

@> Conditional Branch: Variable [0002:Player-Y-Pic] <= 16
@> Scroll Map: Up, 15, 6, Wait
@> Set Move Route: Player, Move Up, Move Up
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] >= 312
@> Scroll Map: Right, 20, 6, Wait
@> Set Move Route: Player, Move Right, Move Right
@>
: Branch End
@> Conditional Branch: Variable [0002:Player-Y-Pic] >= 240
@> Scroll Map: Down, 15, 6, Wait
@> Set Move Route: Player, Move Down, Move Down
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] <= 8
@> Scroll Map: Left, 20, 6, Wait
@> Set Move Route: Player, Move Left, Move Left
@>
: Branch End
@> Wait for All Movement
@> Control Switches: [0002] = OFF


Mas e se você quiser que o jogador possa ficar nas bordas da tela, contanto que seu rosto não esteja virado para a porta? Basta incluir uma verificação extra em cada condição na Page 2:

@> Control Variables: [0001:Player-X-Pic] = Player's Screen X
@> Control Variables: [0002:Player-Y-Pic] = Player's Screen Y
@> Conditional Branch: Variable [0002:Player-Y-Pic] <= 16
@> Conditional Branch: Player is facing Up
@> Control Switches: [0002] = ON
@>
: Branch End
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] >= 312
@> Conditional Branch: Player is facing Right
@> Control Switches: [0002] = ON
@>
: Branch End
@>
: Branch End
@> Conditional Branch: Variable [0002:Player-Y-Pic] >= 240
@> Conditional Branch: Player is facing Down
@> Control Switches: [0002] = ON
@>
: Branch End
@>
: Branch End
@> Conditional Branch: Variable [0001:Player-X-Pic] <= 8
@> Conditional Branch: Player is facing Left
@> Control Switches: [0002] = ON
@>
: Branch End
@>
: Branch End
Criado por Dante, inspirado na versão de 2007 da RPG Menace - A Ameaça RPG, feito com Rails 8.1.3.1, Ruby 4.0.5 e 💛.