shmupレベルを保存する方法は?


12

私は2Dのshmup(すなわちAero Fighters)を開発していますが、レベルを保存するためのさまざまな方法について疑問に思っていました。敵が独自のxmlファイルで定義されていると仮定すると、レベルで敵が出現するタイミングをどのように定義しますか?

時間に基づいていますか?アップデート?距離?

現在、私はこれを「レベル時間」に基づいて行っています(レベルが実行されている時間-一時停止しても時間は更新されません)。次に例を示します(シリアル化は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>

各敵の要素は基本的に特定の敵の種類の波です。タイプはEnemyTypeで定義されますが、SpawnTimeはこのウェーブが表示される「レベル時間」です。NumberOfSpawnsとSpawnOffsetは、表示される敵の数と、それぞれのスポーンにかかる時間です。

これは良いアイデアかもしれませんし、もっと良いものがあるかもしれません。よく分かりません。私はいくつかの意見やアイデアを見たいです。

これには2つの問題があります。敵を正しくスポーンすることと、レベルエディターを作成することです。レベルエディターの問題は、まったく別の問題です(おそらく、今後投稿します:P)。

正しくスポーンする場合、問題は更新時間が可変であるという事実にあります。そのため、スポーンオフセットが小さすぎるか、更新に少し時間がかかったため、敵のスポーンを見逃さないようにする必要があります。 。私はそれを大部分修正しましたが、問題はレベルの保存方法にあるようです。

だから、アイデアはありますか?コメント?

前もって感謝します。

回答:


4

これを行う1つの方法は、スポーンを時間ではなく水平移動距離に基づいて行うことです(横スクロールを想定)。敵の波をトリガー距離のあるキューに保存できます。プレイヤーの移動距離がキューの先頭にあるオブジェクトのトリガー距離よりも大きい場合、キューからポップしてスポーンします。

このソリューションは、時間ベースのソリューションよりもグラフィカルレベルエディターとの統合に適しています。スクロールする背景に沿った特定のポイントを、敵が出現するときと簡単に一致させることができます。


4
ボーナスとして、グローバルに、またはレベルのセクションのいずれかでスクロール速度を変更した場合、時間ベースであれば敵が正しい場所に出現するため、後の敵を正しいスポーン位置に保ちます。
AttackingHobo

2

参考としてPowerMangaのコードを調べることをお勧めします。レベルには2種類あります。レベル開始から特定の距離に物事が配置され、その他のものがランダムに生成される横スクロール(tyrianのような)レベルと、1つの波のみが解析される「静止」レベル(ala la galaga)前のものがそのパターンを終了した後。

もちろん、連続したベジェ曲線によって波パターンを効率的に計画できます(ウィキペディアのページには、それを説明するきちんとしたアニメーションがあります)。

最終的なコメントに余裕があれば、より表現力があり、保守が容易で、LUAスクリプトなどのゲームプログラミングで便利なXMLをここに完全にドロップします。

HTH。


私はすでにベジェ曲線を使用して敵の動きを保存しています(これもXMLでシリアル化されています)。.NETとXNAの両方にシリアル化/逆シリアル化のサポートが組み込まれているため、主にXMLを使用しています。LUAスクリプトは適切に聞こえますが、さらに作業が必要になります。しかし、私は常にそれを使用することを計画していたので、いくつかの基本的なエンジンを終えた後、私は間違いなくそれを調べます。Finallt、前の波の後に波を発生させるという考えは興味深いですね。
ペック

2
XMLは、ツールによって生成され、手動で編集されない限り、問題ありません。スクリプト言語は特別な場合(ボスなど)には便利かもしれませんが、それは標準的な攻撃パターンの定義とはまったく別の問題ですよね。
bluescrn

0

手続き的に敵を生成することを検討してください。私はそれがあなたが望む答えとはかなり異なり、間接的に問題を完全に解決することを知っています。

これを行う場合、各敵ユニットに難易度の「ポイント」値を割り当て、レベルをいくつかのポイントに割り当てます。100ポイントは100ポイントの敵100人、または100ポイントの敵1人に相当します。またはその間の何か。

おそらく、これを少し制限して、最初のレベルで100ポイントのボスを獲得しないようにするか、敵の数を最小限に抑え、おそらく残っている敵のリストを定期的にポーリングしてプルする必要があります。画面上の次のもの。

フォーメーション:位置とポイントのコレクション、たとえば、1行(行または列)に1ポイントの敵が7人、または3ポイントが2つ並んだ5ポイント。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.