Maneira correta de gerar “aleatoriamente” terrenos fluidos

9

Estou criando um jogo RTS simples de cima para baixo. Eu planejo "gerar aleatoriamente" mapas rapidamente quando preciso. Eu planejo tudo isso trabalhando em 'passes':

  1. Encha o terreno com toda a grama
  2. Volte e adicione alguns jorros aleatórios de cascalho
  3. Arredonde o cascalho
  4. Desenhe a paisagem da montanha na segunda camada
  5. Arredonde as montanhas
  6. etc etc.

Agora, dê uma olhada nesta imagem abaixo:

insira a descrição da imagem aqui

Eu o criei manualmente usando meu editor de mapas, mas planejo que isso basicamente seja o resultado após a aprovação / etapa 3.

Como devo decidir quando e onde colocar meu cascalho para que ele tenha pelo menos uma forma irregular e esporádica o suficiente para parecer natural?

Obrigado se puder! Toda e qualquer ajuda é apreciada!

Como uma nota rodapé:

Cada passe é basicamente eu repetindo todos os meus blocos (o mapa é dividido em blocos de 40x40) semelhante a este:

for (int x = 0; x <= GRIDMAX - 1; x++) {
    for (int y = 0; y <= GRIDMAX - 1; y++) {
        //Terrain(x, y, 0) = SomethingHere;
    }
}
Freesnöw
fonte

Respostas:

5

Você pode brincar com o Perlin Noise ( consulte minha resposta do StackOverflow para obter uma implementação ), para gerar um mapa de altura. No mapa de altura, você pode mapear determinados intervalos de altura para diferentes ladrilhos. Algo como:

  • Top 20% de neve
  • Próximo 20% Cascalho
  • Próximo 40% Grama
  • Últimos 20% de Água

Você terá que jogar com os valores do gerador Perlin Noise para obter um terreno que possa ser gerado e com boa aparência.

Nick Banks
fonte
5

Como os outros disseram, o ruído permanente deve ser uma boa fonte de dados para decidir onde colocar diferentes tipos de ladrilhos. Gostaria de complementar essa ideia e vincular dois recursos adicionais que devem ser úteis com a terceira etapa da sua lista de verificação - arredondando os cantos .

Esse é um processo chamado de agrupamento automático e não é tão difícil de implementar. Existem muitas maneiras diferentes de fazer isso, mas a maioria delas depende do cálculo de informações de adjacência para cada bloco para decidir qual gráfico deve ser desenhado nesse local.

Uma maneira muito elegante de resolver esse problema é atribuir um valor de bandeira exclusivo a cada direção do bloco adjacente e organizar seu spritehseet de modo que o valor que você obtém adicionando todas as bandeiras adjacentes de um bloco corresponda à posição correta do lado a lado na planilha. Leia este artigo para uma descrição muito clara da técnica.

E aqui está outro recurso que descreve outra variação da técnica.

David Gouveia
fonte
Ei, apenas para que você saiba, sua resposta foi extremamente útil na medida em que dobrou as esquinas. Muito obrigado :) Na verdade, agora tudo funciona (mesmo nos cantos arredondados)!
Freesnöw 7/03/12
4

Essencialmente, você pode usar a geração Perlin Noise para gerar seus mapas. Você poderia amostrar o mapa de altura gerado e atribuir blocos de cascalho a partes do mapa acima de uma determinada altura.

Aqui está um excelente post de referência sobre como implementar esse sistema e os diferentes tipos de terreno que você pode gerar.

Os exemplos têm muito mais etapas do que você precisaria, mas o conceito é o mesmo.

Mais sobre gen do mundo Minecraft

http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/

insira a descrição da imagem aqui

David Young
fonte