Estoy desarrollando un shmup 2D (es decir, Aero Fighters ) y me preguntaba cuáles son las diversas formas de almacenar un nivel. Suponiendo que los enemigos están definidos en su propio archivo xml, ¿cómo definirías cuándo aparece un enemigo en el nivel?
¿Se basaría en el tiempo? Actualizaciones? ¿Distancia?
Actualmente hago esto en función del "tiempo de nivel" (la cantidad de tiempo que el nivel se está ejecutando; la pausa no actualiza el tiempo). Aquí hay un ejemplo (la serialización fue realizada por 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 enemigo es básicamente una ola de tipos de enemigos específicos. El tipo se define en EnemyType, mientras que SpawnTime es el "tiempo de nivel" en el que debería aparecer esta ola. NumberOfSpawns y SpawnOffset es el número de enemigos que aparecerán y el tiempo que transcurre entre cada engendro, respectivamente.
Esta podría ser una buena idea o podría haber mejores por ahí. No estoy seguro. Me gustaría ver algunas opiniones e ideas.
Tengo dos problemas con esto: generar un enemigo correctamente y crear un editor de niveles. Lo del editor de niveles es un problema completamente diferente (que probablemente publicaré en el futuro: P).
En cuanto al desove correctamente, el problema radica en el hecho de que tengo un tiempo de actualización variable y, por lo tanto, debo asegurarme de no perder un engendro enemigo porque el desplazamiento de engendro es demasiado pequeño o porque la actualización tomó un poco más de tiempo . La mayoría de las veces lo arreglé, pero me parece que el problema está en cómo almaceno el nivel.
Entonces, ¿alguna idea? Comentarios?
Gracias de antemano.
fuente
Le sugiero que estudie el código de PowerManga como referencia. Tienen dos tipos de niveles: niveles de desplazamiento lateral (tipo tirio) donde las cosas se colocan a una distancia específica desde el inicio del nivel y otras cosas se generan aleatoriamente, y niveles "fijos" (a la galaga) donde se analiza una sola onda después de que el anterior haya terminado su patrón.
Los patrones de onda, por supuesto, pueden planificarse eficientemente mediante curvas bezier sucesivas (la página de wikipedia tiene una animación ordenada para explicar eso).
Si puedo permitirme un comentario final, soltaría completamente XML aquí a favor de algo más expresivo, más fácil de mantener y más útil en la programación de juegos, como un script LUA.
HTH
fuente
Considera generar enemigos procesalmente. Sé que es bastante diferente de la respuesta que deseas, e indirectamente resuelve el problema por completo.
Si tuviera que hacer esto, le asignaría a cada unidad enemiga un valor de "puntos" de lo difícil que es, luego asignaría a los niveles algún número de puntos: 100 puntos valen cien enemigos de 1 punto, o un enemigo de 100 puntos, o cualquier cosa intermedia.
Probablemente necesite restringir esto un poco para que no obtenga un jefe de 100 puntos en el primer nivel, o que tenga un número mínimo de enemigos, y probablemente desee sondear periódicamente la lista de enemigos que quedan y tirar el siguiente en pantalla.
Podría ir un paso más allá al tener formaciones: colecciones de posiciones y puntos, por ejemplo. siete enemigos de un punto en una sola línea (fila o columna), o cinco puntos flanqueados por dos de 3 puntos.
fuente