Quero gerar aleatoriamente um mapa para um jogo side-scroller 2D usando o seguinte conjunto de peças:
Encontrei ótimos artigos sobre o processo de criação de bit, por exemplo: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -method-for-apply-tilemaps /
Eu gosto da idéia de usar uma máscara de bits / telha em vez de fazer uma enorme cláusula if ou instrução switch.
No entanto, estou tendo problemas para visualizar todo o processo e nenhum desses artigos fala sobre randomização.
Meus blocos se encaixam de várias maneiras diferentes, não apenas de uma maneira, como os blocos nos exemplos aos quais vinculei parecem.
Por exemplo, aqui estão apenas alguns exemplos:
Como minhas peças se encaixam de várias maneiras diferentes, não acho que uma máscara de 8 bits funcione. Portanto, eu estava pensando em usar uma máscara de bits maior. Algo como char [8] ou char 4 .
Se alguém pudesse, por favor, mostrar alguns pseudocódigo / exemplos de como seria o algoritmo geral, eu agradeceria muito.
Você já pensou em usar uma função de ruído 1D Perlin ou simplex? Há várias vantagens nisso, incluindo:
Infinito (dentro do domínio da precisão de ponto flutuante), terreno não repetitivo
Pode ser gerado em tempo real (mesmo em um shader, que é rápido ) ou antecipadamente e armazenado em texturas, como no seu exemplo
As bordas correspondem automaticamente, pois o Perlin e o simplex são contínuos.
Embora o terreno em si seja pseudo-aleatório, é fácil aplicar uma função de envelope ou simplesmente reduzir o número de oitavas em áreas onde você precisa de áreas planas ou outros recursos específicos do terreno.
Veja este link para uma explicação bastante completa da implementação 1D Perlin.
Um envelope é basicamente um campo escalar ou função que é multiplicada pela função de ruído antes de salvar ou exibir sua saída.
(Imagem inicial emprestada do artigo acima mencionado.)
Neste exemplo, a linha vermelha representa uma função por partes definida como
... que pode ser melhor definido usando uma função suave. Nesse caso, apenas reduz as coisas para 0 antes do platô e depois volta para 1 depois.
Atualizar
Aqui está um exemplo de um "terreno" 3D simplex de um dos meus projetos, com iluminação especular difusa aplicada, gerada inteiramente dentro de um tubo de sombreamento vert + tess + frag. Para sua situação, eu usaria uma fatia vertical para obter a inclinação do terreno.
E uma vista ortográfica de cima para baixo:
fonte