Geração aleatória de mapas

63

Estou iniciando / iniciando um jogo de RPG de mapa em 2D em Java e quero implementar a geração aleatória de mapas. Eu tenho uma lista de peças diferentes (sujeira / areia / pedra / grama / cascalho etc.) junto com peças de água e peças de caminho, o problema que tenho é que não tenho idéia por onde começar a gerar um mapa aleatoriamente.

Seria necessário ter seções de terreno (como uma parte será areia, parte sujeira etc.) Similar à forma como o Minecraft é onde você tem biomas diferentes e eles se transformam perfeitamente. Por fim, eu também precisaria adicionar caminhos aleatórios a isso, além de seguir direções diferentes em todo o mapa.

Não estou pedindo a ninguém que me escreva todo o código ou qualquer coisa, apenas me coloque na direção certa, por favor.

tl; dr - Gere um mapa de peças com biomas, caminhos e verifique se os biomas se encaixam perfeitamente.

Tom O
fonte

Respostas:

68

Entre as muitas outras perguntas relacionadas no site, há um artigo frequentemente vinculado para geração de mapas: Geração de mapas poligonais para jogos, você pode obter algumas boas estratégias desse artigo, mas não pode realmente ser usado como está.

Embora não seja um tutorial, há um artigo sobre como os mapas mundiais dos Dwarf fortress são gerados. Basicamente, você gera várias camadas de ruído, para altura, umidade, temperatura e salinidade. Então você usaria algo como isto:

insira a descrição da imagem aqui

Ou isto

insira a descrição da imagem aqui

para gerar biomas com base nas camadas de ruído que você produziu antes. Normalmente, isso fornece uma transição bastante suave entre os biomas e as transições são lógicas. Também modifico os mapas de umidade e temperatura com base na elevação. Isso naturalmente gera uma "linha de madeira" e produz montanhas rochosas com calotas nevadas.

Estou usando essa estratégia no meu jogo e ela produz mapas assim muito rapidamente:

insira a descrição da imagem aqui

Além disso, você pode me ver percorrer mais alguns mapas no início deste vídeo .

E aqui estão mais algumas para você começar:

Como posso criar um "mundo" aleatório em um mecanismo de bloco?

Como posso identificar regiões de recursos em um mundo gerado processualmente?

Como crio ruído sólido inclinável para geração de mapas?

MichaelHouse
fonte
Embora esse link para a geração de mapas poligonais para jogos seja um artigo muito bom, não acho que seja um bom ajuste para essa pergunta, porque a) não é uma grade de mapa de blocos eb) não possui biomas - a textura do terreno é com base na altura.
Tapio
@ Tapap Você está certo, eu atualizei com mais informações.
MichaelHouse
@ Byte56 Obrigado, tudo isso me dá um ponto de partida! :)
Tom O
@ Byte56 Notei que você mencionou minha pergunta de alguns anos atrás, então eu a atualizei com o código de trabalho!
precisa
11
Aliás, o projeto de geração de mapa de polígonos foi criado para um jogo que tinha um mapa de blocos que não exibia as alturas. As alturas e polígonos existem para gerar os biomas, mas na verdade não são mostrados no jogo.
Amitp
29

Embora as outras respostas aqui sejam realmente boas para gerar os tipos de paisagens estáticas que funcionariam para essa necessidade específica. Existem outros métodos que as pessoas que se deparam com essa pergunta podem estar procurando se desejam criar paisagens que mudam ao longo do tempo ou pareçam muito mais realistas. Você pode seguir essa técnica.

Ao contrário das outras respostas, você começa isso com um mapa totalmente vazio. Comece com o que você consideraria o nível do mar. Use o Perlin Noise para adicionar variações muito pequenas; se você tiver 256 elevações possíveis, não varie mais do que 3-5 em qualquer direção. Isso cria os primeiros bilhões de anos de sua paisagem sem precisar executar uma simulação por tanto tempo.

Placas tectônicas

Divida o mapa em linhas retas ou curvas para criar placas, quanto mais detalhadas as formas das placas, mais interessante será a sua paisagem. Mantenha-os grandes. Dê a cada placa uma direção, velocidade. Em um determinado período de tempo, mova as placas passo a passo pelo mapa, arrastando todas as peças acima delas.

Quando duas placas se cruzam, escolha qual irá passar e qual ficará abaixo, essa escolha poderá ser aleatória. Os ladrilhos nas placas designadas abaixo são instantaneamente reduzidos em altura em 5 etapas. Depois que uma placa é designada acima ou abaixo, todas as interações futuras com as placas seguirão estas regras:

  • Quando uma placa designada cruza uma placa não designada, a placa não designada se torna do tipo oposto. (Assim, as placas UD ficam embaixo ao cruzar uma sobre.)
  • Onde uma placa superior fica sobre uma placa inferior, todos esses ladrilhos sobem etapas de elevação de 0 a 1 e os ladrilhos seguem o caminho da placa superior.
  • Onde uma placa cruzada cruza uma placa cruzada, todos esses ladrilhos sobem 1-2 etapas, e os ladrilhos na região cruzada não flutuam mais.
  • Onde uma placa inferior cruza uma placa inferior, todos os ladrilhos na área com elevação maior que a marca de 66% para ambas as placas na região de cruzamento sobem 1-3 etapas (como se por atividade vulcânica, isso produziria ilhas por tempo suficiente ) e os ladrilhos nessa área param de ficar à deriva.

Todas as placas que se cruzam lentas em 20% da velocidade atual a cada passo. Para maior realismo, adicione uma mudança aleatória de -10% a 10% na direção do movimento a cada passo.

Depois de executar o número desejado de etapas. Provavelmente 5 a 10 são suficientes. Quaisquer ladrilhos onde nenhuma placa é residente, devem ser descartados no nível mais baixo existente.

Grande ou pequeno?

Esse mapa pode ser usado como está ou ser expandido para criar um mapa muito maior dividindo-o em pedaços de bloco 4X4 (célula) e expandindo essas seções com base em suas elevações individuais. Trate a elevação de cada célula como um ponto e crie uma gradação suave no mapa maior entre esses pontos. Portanto, se o mapa maior for 40X40 em vez de 4X4 e o ponto (0,0) for 10 e o ponto (0,1) for 1, os blocos no mapa maior entre eles serão 10,9,8,7,6 , 5,4,3,2,1 de altura. É possível adicionar mais ruído Perlin para suavizar as inclinações. No geral, toda essa técnica de dimensionamento é semelhante ao algoritmo Diamond Square .

Água

Simular rios e lagos, oceanos e lençóis freáticos. Eu prefiro usar autômatos celulares .

As alturas tornam-se flutuantes ou intervalos int expandidos para permitir um rastreamento mais refinado. As células da água têm valores de saturação, digamos na faixa de 1-256. Os mapas devem começar uniformemente. Você precisará jogar com os números para o tamanho de seu mapa individual; no entanto, geralmente você seguirá regras mais ou menos assim:

  • Se uma célula vizinha estiver mais saturada, aumente a saturação e ganhe altura.
  • Se uma célula vizinha estiver menos saturada, diminua a saturação e perca a altura.

Faça essa verificação para todas as células vizinhas. Execute um número suficiente de etapas. Se desejar, você pode adicionar temperatura a esta simulação alterando a quantidade de saturação perdida / adquirida por essa temperatura. Você também pode alterá-lo com base na elevação. Lagos e rios naturais devem se formar. Alguns vão cair no oceano. (O oceano provavelmente não será preenchido por nenhuma métrica, mas você designará qualquer coisa abaixo do nível do mar como preenchida com água no final).

Você pode manter os dados de temperatura e saturação para usar, como nas outras respostas, para criar biomas. Eles devem ser MUITO mais precisos e interessantes. Com biomas nevados nos pólos e quentes no meio (se você usar uma lista gradual e suave de temperaturas).

Você também pode simular o vento e, portanto, as mudanças de temperatura com base nas elevações. Você pode alternar entre executar a simulação de temperatura e a simulação de água, se desejar. No entanto, eu não construí nada usando mudanças de temperatura, então não vou comentar sobre como fazer isso.

Paisagens em evolução

Se você mantiver as simulações de terra, água e calor ao redor e reduzir drasticamente seus efeitos e também impedir que as placas se movam, você poderá continuar alterando todas essas métricas ao longo do tempo. Eu não faria os cálculos com muita frequência, mas você pode obter um mapa-múndi que responda a mudanças dessa maneira.

Conclusão

Embora esses tipos de técnicas sejam muito mais envolvidos, eles produzem efeitos muito mais realistas e evolutivos. Tome-o para o que vale a pena?

DampeS8N
fonte
15

Você pode usar o Perlin Noise para a geração do terreno, eis como os biomas do Minecraft funcionam. Como você pode ver, ele usa um mapa de calor em combinação com um mapa de chuva para criar os biomas.

Biomas de Minecraft

tversteeg
fonte