Comment stocker un niveau shmup?


12

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.

Réponses:


4

Une façon de le faire serait de baser le frai non pas sur le temps mais sur la distance horizontale parcourue (en supposant le défilement latéral). Vous pouvez stocker vos vagues ennemies dans une file d'attente avec une distance de déclenchement; lorsque la distance parcourue par votre joueur est supérieure à la distance de déclenchement de l'objet à l'avant de la file d'attente, sortez-le de la file d'attente et faites-le apparaître.

Cette solution se prêterait davantage à l'intégration avec un éditeur de niveau graphique qu'à une solution basée sur le temps. Il serait beaucoup plus facile de faire correspondre des points spécifiques le long de votre arrière-plan de défilement avec le moment où les ennemis apparaissent.


4
Et en bonus si vous modifiez la vitesse de défilement, soit globalement, soit pour une section du niveau, cela gardera les ennemis ultérieurs dans leurs positions d'apparition correctes, car si c'était basé sur le temps, les ennemis apparaîtront aux bons endroits.
AttackingHobo

2

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.


J'utilise déjà des courbes de Bézier pour stocker les mouvements ennemis (qui sont également sérialisés en xml). J'utilise principalement XML car .NET et XNA ont tous deux un support intégré pour la sérialisation / désérialisation. Le script LUA sonne bien mais il faudra plus de travail. Cependant, j'ai toujours prévu de l'utiliser, donc après avoir terminé un moteur de base, je vais certainement y réfléchir. Finallt, l'idée de faire naître une vague après une précédente semble intéressante.
pek

2
XML est correct, tant qu'il est généré par un outil et non édité à la main. Alors que les langages de script peuvent être utiles pour des cas spéciaux (par exemple, les boss), c'est un problème complètement distinct pour définir des modèles d'attaque standard, n'est-ce pas?
bluescrn

0

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.