Geração processual de nível infinito

16

Quais são algumas boas abordagens para gerar processualmente um nível 2d infinito? O nível pode ser restrito em qualquer dimensão, mas não necessariamente.

A abordagem que mais faz sentido para mim até agora está usando um raio baseado em grade. por exemplo, divida a área de jogo em uma grade com quadrados de um determinado tamanho e carregue X quadrados em um raio ao redor do jogador. Então, quando o jogador se mover para outro quadrado, construa o próximo conjunto e desça mais (a área explorada persistente não é necessária.) Quando um quadrado é construído, ele contém um arranjo aleatório de objetos. Quando os objetos deixam o anel externo dos quadrados, eles são removidos do mundo. Existem maneiras melhores ou diferentes? Ou, se essa é uma boa abordagem, quais são os possíveis problemas?

Por uma questão de discussão, você pode pensar no nível como um campo de asteróides de cima para baixo, com power-ups, etc. espalhados por todo o lado.

Colin Gislason
fonte
2
Isto parece estar relacionado: gamedev.stackexchange.com/questions/2230/...
jacmoe
^ e, portanto, está na coluna "Relacionadas", no lado direito. Não há necessidade de vincular.
Ricket 9/08/10
7
E então tornou-se "vinculado" e "relacionado" - puro, não é? :)
jacmoe

Respostas:

6

Um problema com mundos "infinitos" é que suas coordenadas subjacentes podem não ser infinitas. Às vezes, se o jogo atrasar o jogador o suficiente, pode não ser uma preocupação, porque o tempo para atingir o número inteiro, por exemplo, seria muito longo para ser alcançado. Porém, se você permitir grandes diferenças de velocidade, pode ser preciso e muito abrangente, que você precise pensar em suas coordenadas. Uma correção razoável seria ter dois níveis, como as coordenadas inteiras da sua grade e coordenadas flutuantes em cada referencial da grade.

Como um aparte, você pode até conseguir manter o layout do seu mundo adequadamente, usando as coordenadas da grade como uma semente para criar seu mundo aleatório em um determinado quadrado. Assim, quando o jogador sai da área, você pode soltá-la e, quando o jogador voltar, poderá regenerá-la novamente a partir da semente.

small_duck
fonte
4
Esse problema pode ser contornado, centralizando o mundo ocasionalmente.
Jonathan Fischoff
Além disso, esteja ciente não apenas da quebra automática de números inteiros, mas também das imprecisões de pequenas alterações no ponto flutuante quando o número do ponto flutuante for alto. Tente isto: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos; Na minha máquina, diff é 0.
tenpn
Todos esses são bons pontos. Eu acho que seria apropriado atualizar as coordenadas sempre que um novo conjunto de quadrados for gerado, desde que seja eficiente o suficiente.
Colin Gislason
Aliás esta é a mesma solução que na versão PC de Minecraft :) +1 para fixo inteiro + flutuador wich é na minha opinião a melhor solução
GameDeveloper