Geração de terrenos para plataformas 2D baseadas em blocos

15

Atualmente, estou trabalhando em um jogo de plataformas 2D baseado em blocos semelhante ao Terraria em alguns aspectos, embora esteja tendo dificuldades com a geração do terreno. Eu tenho alguns princípios básicos, embora eles não saiam como algo útil.

Eu tentei algumas técnicas diferentes, como o Perlin Noise, e li sobre outras, como o deslocamento do ponto médio, embora não tenha certeza do que seria melhor ou uma combinação de técnicas diferentes para gerar áreas diferentes. (Como deslocamento do ponto médio para a forma geral do terreno e ruído Perlin para as cavernas.)

Eu encontrei uma excelente explicação de como eu poderia colocá-lo em camadas com a Accidental Noise Library , embora esteja em C ++, e eu não conheço C ++ suficiente para compilá-lo em uma DLL que eu possa usar em C #. Tentei copiar isso em C #, embora não saiba como mesclar dois efeitos (o gradiente para a base geral e o fractal para os detalhes).

Atualmente estou usando um fractal de plasma e os resultados são extremamente variados. Por exemplo, ele pode gerar terreno onde quase não há superfície, ou pode gerar terreno onde não há superfície.

Um exemplo de um mapa correto, seria melhor com mais algumas melhorias. (Preto é sólido, branco é ar):

Bom mapa

E um exemplo de um mapa terrível. (Preto é sólido, branco é ar):

Mapa terrível

Basicamente, o que estou perguntando é: qual seria a melhor maneira de gerar o terreno ou forçá-lo a garantir que haja uma quantidade razoável de área de superfície, com o tempo de geração o mais rápido possível. Ou, alternativamente, como eu seria capaz de obter o mesmo resultado que a Accidental Noise Library, mas em C #.

Qualquer exemplo seria muito apreciado.

Dimensões sombreadas
fonte
Oi, eu queria saber como você fez isso. Estou tentando entender como gerar mundos como esse e gosto dos resultados que você está obtendo. Qual algoritmo você está usando porque não se parece com o ruído perlin 2D e definitivamente não é o ruído perlin 1D.
G3tinmybelly

Respostas:

8

Eu tentava manter o ruído Perlin, mas adicionando um peso a ele com base na altura, para garantir uma certa densidade média em determinadas altitudes. Para citar parte da postagem de Notch na geração do terreno Minecraft :

Então, mudei o sistema para um sistema semelhante baseado no ruído 3D Perlin. Em vez de amostrar a “altura do solo”, tratei o valor do ruído como a “densidade”, onde qualquer coisa menor que 0 seria ar e qualquer coisa maior que ou igual a 0 seria terra. Para garantir que a camada inferior seja sólida e a parte superior não, basta adicionar a altura (compensada pelo nível da água) ao resultado amostrado.

Essencialmente, você está pegando uma pequena fatia do terreno do Minecraft. Portanto, gere ruído 2D Perlin, mas pesa-o de forma que qualquer coisa acima de um determinado ponto provavelmente seja ar e qualquer coisa abaixo de um certo ponto provavelmente seja terra.

Isso lhe dará um bom terreno, com algumas saliências e recursos interessantes, além de algumas cavernas e ilhas flutuantes. (Se você não quiser ilhas flutuantes, poderá testá-las e removê-las manualmente.) Esse método não fornecerá itens como túneis; portanto, você desejará um método para adicioná-los na geração após o terreno, como um passeio aleatório .

dlras2
fonte
Não tenho certeza absoluta de que estou usando o Perlin Noise em todo o seu potencial. Depois de fazer exatamente como você descreveu, acabou de fazer muitas cavernas, com muitas ilhas flutuantes. Nenhuma definição real do tipo de terreno. Usando um gradiente para pesar os resultados, recebo esse resultado .
Shaded Dimensions
@Shaded Dimensions - Seus parâmetros de Perlin Noise precisam de ajustes. Você tem um ruído muito variável, quando o que você deseja é um padrão muito mais suave e amplo. Confira freespace.virgin.net/hugo.elias/models/m_perlin.htm e tente mexer nos seus parâmetros. Tente persistência menor e menos oitavas. (Esses termos podem variar, assim que ler esse artigo.)
dlras2
Ok, obrigado pelo link. Também descobri que o peso não estava funcionando como pretendido depois de alterar alguns parâmetros.
Shaded Dimensions
Ok, modifiquei bastante os parâmetros e tenho algo que é bastante aceitável, por enquanto, pelo menos. Também removi a geração de cavernas apenas para este teste, pois queria fazer o terreno real primeiro. Este é o resultado final . Só precisa adicionar verificações para remover as ilhas flutuantes. Obrigado novamente.
Shaded Dimensions
Dimensões @ Shaded - Nice! Muito tempo, bons terrenos vêm apenas de ajustes nos parâmetros e da sobreposição de ruídos. Vai demorar um pouco antes de você conseguir algo com que esteja muito feliz, mas você sempre pode usar o que tem agora e voltar para adicionar ajustes finais. Boa sorte!
dlras2