Come memorizzare un livello shmup?


12

Sto sviluppando uno shmup 2D (ovvero Aero Fighters ) e mi chiedevo quali sono i vari modi per memorizzare un livello. Supponendo che i nemici siano definiti nel loro file xml, come definiresti quando un nemico apparirà nel livello?

Sarebbe basato sul tempo? Aggiornamenti? Distanza?

Attualmente lo faccio in base al "tempo di livello" (la quantità di tempo in cui il livello è in esecuzione - la pausa non aggiorna il tempo). Ecco un esempio (la serializzazione è stata eseguita da 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>

Ogni elemento nemico è fondamentalmente un'ondata di tipi nemici specifici. Il tipo è definito in EnemyType mentre SpawnTime è il "tempo di livello" che dovrebbe apparire questa onda. NumberOfSpawns e SpawnOffset è il numero di nemici che appariranno e il tempo necessario rispettivamente tra ogni spawn.

Questa potrebbe essere una buona idea o ce ne potrebbero essere di migliori là fuori. Non ne sono sicuro. Mi piacerebbe vedere alcune opinioni e idee.

Ho due problemi con questo: generare correttamente un nemico e creare un editor di livelli. L'editor di livello è un problema completamente diverso (che probabilmente posterò in futuro: P).

Per quanto riguarda la spawn corretta, il problema sta nel fatto che ho un tempo di aggiornamento variabile e quindi devo assicurarmi di non perdere una spawn nemica perché l'offset della spawn è troppo piccolo o perché l'aggiornamento ha richiesto un po 'più di tempo . L'ho risolto un po 'per la maggior parte, ma mi sembra che il problema sia il modo in cui memorizzo il livello.

Quindi, qualche idea? Commenti?

Grazie in anticipo.

Risposte:


4

Un modo per farlo sarebbe quello di basare lo spawn non sul tempo ma sulla distanza orizzontale percorsa (assumendo il sidescrolling). Puoi memorizzare le tue onde nemiche in una coda con una distanza di innesco; quando la distanza percorsa dal tuo giocatore è maggiore della distanza di innesco dell'oggetto nella parte anteriore della coda, aprilo dalla coda e generalo.

Questa soluzione si presterebbe più all'integrazione con un editor di livello grafico che a una soluzione basata sul tempo. Sarebbe molto più facile abbinare punti specifici lungo il tuo sfondo scorrevole con quando i nemici si generano.


4
E come bonus se cambi la velocità di scorrimento, a livello globale o per una sezione del livello, manterrà i nemici successivi nelle loro posizioni di spawn corrette, perché se fossero basati sul tempo, i nemici si spawnerebbero nei punti corretti.
Attaccando

2

Ti suggerisco di studiare il codice di PowerManga come riferimento. Hanno due tipi di livelli: livelli a scorrimento laterale (tipo tiranno) in cui le cose sono posizionate a una distanza specifica dall'inizio del livello e altre cose sono generate casualmente e livelli "fermi" (alla galaga) in cui viene analizzata solo un'onda dopo che il precedente ha terminato il suo schema.

Ovviamente i modelli d'onda possono essere pianificati in modo efficiente da successive curve di Bezier (la pagina di Wikipedia ha un'animazione ordinata per spiegarlo).

Se posso permettermi un commento finale, lascerei cadere completamente XML qui a favore di qualcosa di più espressivo, più facile da mantenere e più utile nella programmazione di giochi come uno script LUA.

HTH.


Uso già curve di Bezier per memorizzare i movimenti dei nemici (anch'essi serializzati in xml). Uso principalmente XML perché sia ​​.NET che XNA hanno il supporto integrato per la serializzazione / deserializzazione. Lo script LUA suona bene ma richiederà più lavoro. Tuttavia, ho sempre pianificato di usarlo, quindi dopo aver finito un motore di base, lo esaminerò sicuramente. Alla fine, l'idea di generare un'onda dopo una precedente sembra interessante.
pek

2
XML va bene, purché sia ​​generato da uno strumento e non modificato manualmente. Mentre i linguaggi di scripting possono essere utili per casi speciali (ad esempio i boss), questo è un problema completamente separato per la definizione di schemi di attacco standard, non è vero?
bluescrn

0

Prendi in considerazione la generazione procedurale di nemici. So che è abbastanza diverso dalla risposta che vuoi e risolve indirettamente il problema completamente.

Se dovessi farlo, assegnerei a ogni unità nemica un valore di "punti" di quanto sia difficile, quindi assegnerei ai livelli un numero di punti: 100 punti valgono 100 punti nemici o 1 nemico 100 punti, o qualsiasi altra via di mezzo.

Probabilmente avresti bisogno di vincolarlo un po 'in modo da non ottenere un boss da 100 punti al primo livello, o che hai un numero minimo di nemici, e probabilmente vorrai sondare periodicamente l'elenco dei nemici rimasti e tirare il prossimo sullo schermo.

Puoi fare un ulteriore passo in avanti formando: raccolte di posizioni e punti, ad es. sette nemici di un punto in una sola linea (riga o colonna) o un cinque punti affiancato da due 3 punti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.