Génération procédurale de niveau infini

16

Quelles sont les bonnes approches pour générer de façon procédurale un niveau 2D infini? Le niveau peut être limité dans l'une ou l'autre dimension mais pas nécessairement.

L'approche qui me semble la plus logique jusqu'à présent consiste à utiliser un rayon basé sur une grille. Par exemple, divisez la zone de jeu en une grille avec des carrés d'une certaine taille, puis chargez X carrés dans un rayon autour du joueur. Ensuite, lorsque le joueur se déplace vers un autre carré, construisez l'ensemble suivant et déposez-le plus loin (la zone explorée persistante n'est pas nécessaire.) Lorsqu'un carré est construit, il contient un arrangement aléatoire d'objets. Lorsque les objets quittent l'anneau extérieur des carrés, ils sont retirés du monde. Existe-t-il des moyens meilleurs ou différents? Ou si c'est une bonne approche, quels sont les problèmes potentiels?

Pour les besoins de la discussion, vous pouvez considérer le niveau comme un champ d'astéroïdes descendant avec des power-ups, etc. dispersés partout.

Colin Gislason
la source
2
Cela semble être lié: gamedev.stackexchange.com/questions/2230/…
jacmoe
^ et c'est donc dans la colonne "Associés" sur le côté droit. Pas besoin de lier.
Ricket
7
Et puis c'est devenu "lié" aussi bien que "lié" - soigné, hein? :)
jacmoe

Réponses:

6

Un problème avec les mondes "infinis" est que vos coordonnées sous-jacentes peuvent ne pas être infinies. Parfois, si le jeu ralentit suffisamment le joueur, cela pourrait ne pas être un problème, car le temps pour atteindre l'entier entier, par exemple, serait beaucoup trop long pour être atteint. Mais si vous autorisez de grandes différences de vitesse, vous devrez peut-être être à la fois très précis et très étendu, que vous devrez penser à vos coordonnées. Une solution raisonnable serait d'avoir deux niveaux, tels que les coordonnées entières de votre grille, et les coordonnées flottantes dans chaque référentiel de grille.

En passant, vous pourriez même être en mesure de conserver correctement la disposition de votre monde, en utilisant les coordonnées de la grille comme graine pour créer votre monde aléatoire dans un carré donné. Ainsi, lorsque le joueur quitte la zone, vous pouvez la laisser tomber et lorsque le joueur revient, vous pouvez la régénérer à partir de la graine.

small_duck
la source
4
Ce problème peut être contourné en centrant le monde de temps en temps.
Jonathan Fischoff
Soyez également conscient non seulement du bouclage entier mais aussi des inexactitudes des petits changements de virgule flottante lorsque le nombre à virgule flottante est élevé. Essayez ceci: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos; sur ma machine, le différentiel est 0.
tenpn
Ce sont tous de bons points. Je pense qu'il serait approprié de recentrer les coordonnées chaque fois qu'un nouvel ensemble de carrés est généré, tant qu'il est suffisamment efficace.
Colin Gislason
Soit dit en passant,