Je développe un shmup 2D (c'est-à-dire Aero Fighters ) et je me demandais quelles sont les différentes façons de stocker un niveau. En supposant que les ennemis sont définis dans leur propre fichier xml, comment définiriez-vous quand un ennemi apparaît dans le niveau?
Serait-ce basé sur le temps? Mises à jour? Distance?
Actuellement, je fais cela en fonction du "temps de niveau" (la durée pendant laquelle le niveau est en cours d'exécution - la pause ne met pas à jour l'heure). Voici un exemple (la sérialisation a été effectuée par XNA):
<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:level="pekalicious.xanor.XanorContentShared.content.level">
<Asset Type="level:Level">
<Enemies>
<Enemy>
<EnemyType>data/enemies/smallenemy</EnemyType>
<SpawnTime>PT0S</SpawnTime>
<NumberOfSpawns>60</NumberOfSpawns>
<SpawnOffset>PT0.2S</SpawnOffset>
</Enemy>
<Enemy>
<EnemyType>data/enemies/secondenemy</EnemyType>
<SpawnTime>PT0S</SpawnTime>
<NumberOfSpawns>10</NumberOfSpawns>
<SpawnOffset>PT0.5S</SpawnOffset>
</Enemy>
<Enemy>
<EnemyType>data/enemies/secondenemy</EnemyType>
<SpawnTime>PT20S</SpawnTime>
<NumberOfSpawns>10</NumberOfSpawns>
<SpawnOffset>PT0.5S</SpawnOffset>
</Enemy>
<Enemy>
<EnemyType>data/enemies/boss1</EnemyType>
<SpawnTime>PT30S</SpawnTime>
<NumberOfSpawns>1</NumberOfSpawns>
<SpawnOffset>PT0S</SpawnOffset>
</Enemy>
</Enemies>
</Asset>
</XnaContent>
Chaque élément ennemi est essentiellement une vague de types d'ennemis spécifiques. Le type est défini dans EnemyType tandis que SpawnTime est le "temps de niveau" auquel cette onde devrait apparaître. NumberOfSpawns et SpawnOffset est le nombre d'ennemis qui apparaîtront et le temps qu'il faut entre chaque apparition respectivement.
Cela pourrait être une bonne idée ou il pourrait y en avoir de meilleures. Je ne suis pas sûr. J'aimerais voir quelques opinions et idées.
J'ai deux problèmes avec cela: engendrer un ennemi correctement et créer un éditeur de niveau. L'éditeur de niveau est un problème entièrement différent (que je posterai probablement à l'avenir: P).
En ce qui concerne le frai correctement, le problème réside dans le fait que j'ai un temps de mise à jour variable et je dois donc m'assurer de ne pas manquer un spawn ennemi parce que le décalage de spawn est trop petit, ou parce que la mise à jour a pris un peu plus de temps . Je l'ai un peu corrigé pour la plupart, mais il me semble que le problème est de savoir comment je stocke le niveau.
Alors, des idées? Commentaires?
Merci d'avance.
Je vous suggère d'étudier le code de PowerManga comme référence. Ils ont deux types de niveaux: les niveaux à défilement latéral (de type tyrien) où les choses sont positionnées à une distance spécifique du début du niveau et d'autres choses sont générées de manière aléatoire, et les niveaux "fixes" (à la galaga) où une seule vague est analysée uniquement après que le précédent a terminé son modèle.
Les modèles de vagues peuvent bien sûr être planifiés efficacement par des courbes de Bézier successives (la page wikipedia a une animation soignée pour expliquer cela).
Si je peux me permettre un dernier commentaire, je laisserais complètement tomber XML ici au profit de quelque chose de plus expressif, plus facile à maintenir et plus utile dans la programmation de jeux comme un script LUA.
HTH.
la source
Envisagez de générer des ennemis de manière procédurale. Je sais que c'est assez différent de la réponse que vous voulez, et cela résout indirectement complètement le problème.
Si je devais faire cela, j'attribuerais à chaque unité ennemie une valeur de "points" de la difficulté, puis attribuerais aux niveaux un certain nombre de points - 100 points valent cent ennemis de 1 point, ou un ennemi de 100 points, ou quoi que ce soit entre les deux.
Vous auriez probablement besoin de contraindre cela un peu afin de ne pas avoir de boss à 100 points au premier niveau, ou d'avoir un nombre minimum d'ennemis, et vous souhaiterez probablement interroger périodiquement la liste des ennemis restants et tirer le suivant à l'écran.
Vous pourriez aller plus loin en ayant des formations: des collections de positions et de points, par exemple. sept ennemis à un point sur une seule ligne (ligne ou colonne) ou cinq points flanqués de deux points à 3 points.
la source