Estou desenvolvendo um shmup 2D (ou seja, Aero Fighters ) e fiquei imaginando quais são as várias maneiras de armazenar um nível. Supondo que os inimigos sejam definidos em seu próprio arquivo xml, como você definiria quando um inimigo aparecer no nível?
Seria baseado no tempo? Atualizações? Distância?
Atualmente, faço isso com base no "tempo do nível" (a quantidade de tempo em que o nível está sendo executado - a pausa não atualiza o tempo). Aqui está um exemplo (a serialização foi feita pelo 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>
Cada elemento inimigo é basicamente uma onda de tipos de inimigos específicos. O tipo é definido no EnemyType enquanto SpawnTime é o "tempo de nível" em que essa onda deve aparecer. NumberOfSpawns e SpawnOffset é o número de inimigos que aparecerão e o tempo gasto entre cada spawn, respectivamente.
Esta poderia ser uma boa ideia ou poderia haver melhores por aí. Não tenho certeza. Eu gostaria de ver algumas opiniões e idéias.
Eu tenho dois problemas com isso: gerar um inimigo corretamente e criar um editor de níveis. A questão do editor de níveis é um problema completamente diferente (que provavelmente vou postar no futuro: P).
Quanto à desova corretamente, o problema está no fato de eu ter um tempo de atualização variável e, portanto, preciso ter certeza de que não perco uma semente inimiga porque o deslocamento da desova é muito pequeno ou porque a atualização levou um pouco mais de tempo . Eu consertei isso na maior parte do tempo, mas parece-me que o problema está em como armazeno o nível.
Então, alguma ideia? Comentários?
Agradeço antecipadamente.