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.
la source
Réponses:
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.
la source
float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos;
sur ma machine, le différentiel est 0.