Durante a exposição do meu jogo Milkyway Mailing Inc. na BRING #2 em Abril, uma das principais features que foi requisitada pelos jogadores foi um sistema de mapa para que eles pudessem se localizar no vasto mundo que eles estavam explorando.
Assim que acabou o evento eu sentei a bunda na cadeira e comecei a elaborar o design para possíveis mini mapas para meu jogo. E cheguei no seguinte conceito inicial e fui com ele:
Nesse conceito, o Sistema Solar estaria mapeado em um círculo que o jogador poderia ativar a qualquer momento durante sua jornada.
O mapa atualiza em tempo real a posição de cada um dos objetos. Isso é importante porquê, no jogo, os planetas e outros objetos de interesse estão orbitando o Sol, assim como na vida real. Mas sem nenhuma intenção de ser preciso ou simular as respectivas órbitas.
E pensando nisso, eu tentei implementar esse sistema durante uma livestream semana passada.
https://youtube.com/live/MkPo-dBMaqI?feature=share
Apesar das distrações no meio do processo, eu consegui terminar com um protótipo funcional que eu pude polir quando cheguei em casa mais tarde daquele dia.
Para entender esse sistema, podemos pensar em o que um mapa realmente se pretende a fazer.
Bom, fundamentalmente um mapa…mapeia. Parece óbvio. Mas é isso! Nesse sentido, mapear significa posicionar algo em relação a uma referência. Guarde essa descrição.
A nossa referência é o mundo total do nosso jogo, no caso, tudo que o jogador pode explorar. Já o mapa é uma representação visual desse mundo e como qualquer representação, ele é uma abstração em menor resolução.
Então, eu decidi que iria criar um sistema que tomaria como base a distância total do mundo do meu jogo e criaria uma proporção relativa de onde os objetos estariam nesse mapa. Por exemplo. Digamos que o meu level tem 100.000 pixels de tamanho e o planeta Terra se encontra em 3.000 pixels de distância do ponto zero. Isso significa que o planeta Terra está deslocado 3% do ponto zero em relação ao tamanho total.
Sabendo disso, podemos criar um vetor e rotacioná-lo em direção ao planeta Terra e após isso, nós temos um vetor normalizado que podemos utilizar para mapear essa posição em um mapa de qualquer resolução.
Nesse sentido, o sistema é composto por dois componentes: o MapItem e o Map.
O MapItem é um Node2D que vai dar a posição do objeto a ser mapeado relativo ao ponto zero do mundo. Ele também carrega uma imagem, Texture, que será sua representação no mapa. O MapItem também se insere no grupo de nodes map para que ele esteja acessível para os outros componentes do sistema.
Já o Map é o componente de interface gráfica responsável por mapear os MapItems em uma representação gráfica do mapa do mundo do jogo, que tipicamente é um TextureRect posicionado no centro da tela.
Assim, quando eu quero que algo seja mapeado, basta que eu adicione o componente MapItem na hierarquia de nodes da cena e use uma imagem como ícone que irá representar o objeto no mapa.