ADVENT CALENDAR

シューティングゲームで敵の出現をjsonで管理する!!

By まめプロ

はじめに

これは、AmusementCreators 2020 アドベントカレンダー の 14日目の記事です。
こんにちは、まめプロです。
課題等の処理に時間を取られ投稿が遅れました・・・すいません。
今回は、今作っているシューティングゲームで敵の出現をjsonを使って管理する機能をつけたので、それについて書いていきます。

敵の出現をjsonで管理する

敵を出現させる場合、私はこれまで「xフレーム経過毎に敵を出現させる」と言う方法を採用していました。コードで書くと、

//countはゲームスタート後から経過したフレーム数
if(count % x == 60)
{
    //敵を出現させるコード;
}

みたいな感じです。
しかし、これでは敵が同じタイミングで出現し続ける少し単調なゲームになってしまいます。そこで、任意のフレーム数経過後に敵を出現させる方法として、敵の出現タイミングや出現する敵の種類をjsonで管理することにしました。

敵出現を管理するデータのクラスを準備する

敵出現のデータといっても、そのデータには「出現する敵の名前や種類」「出現するタイミング」「出現位置」「敵の数や隊列」等の様々な情報があるはずです。
よって、上記の情報をプロパティとして持つクラス(StageData.cs)を予め定義しておきます。

using System;
using Altseed2;
using System.Collections.Generic;
using System.Text;

namespace SpaceBox2
{
    class StageData
    {
        /// <summary>
        /// ステージ開始後何フレーム目で敵を出現させるか
        /// </summary>
        public int SpawnCounter { get; set; }
        /// <summary>
        /// 敵の出現するx座標
        /// </summary>
        public int PositionX { get; set; }
        /// <summary>
        /// 敵の出現するy座標
        /// </summary>
        public int PositionY { get; set; }
        /// 敵の隊列パターン
        /// </summary>
        public string Platoon { get; set; }
        /// <summary>
        /// 出現する敵の名前
        /// </summary>
        public string EnemyName { get; set; }
    }
}

ちなみにjsonファイルは例えば以下の様になります。

[
  {
    "SpawnCounter": 60,
    "PositionX":860,
    "PositionY": 210,
    "Platoon": "Nomal",
    "EnemyName": "Weaving"
  },
  {
    "SpawnCounter": 61,
    "PositionX":860,
    "PositionY": 310,
    "Platoon": "Nomal",
    "EnemyName": "Freeze"
  }
]

jsonを読み込むためのクラスを準備する

敵出現の情報がまとまっているjsonファイルを適切にデシリアライズするために、jsonを読み込むための機能をまとめたクラスを定義します。
今回はこのクラス名を「json.cs」とします。(クラス名がすこしまずい気がするかも知れませんが)

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using System.IO;

namespace SpaceBox2
{
    class Json
    {
        public static StageData[] ReadJsonToArarry(string filePath, string encodingName)
        {
            string json = ReadFileAllLine(filePath, encodingName);
            StageData[] stageDatas = JsonSerializer.Deserialize<StageData[]>(json);
            return stageDatas;
        }

        private static string ReadFileAllLine(string filePath, string encodingName)
        {
            StreamReader streamReader = new StreamReader(filePath, Encoding.GetEncoding(encodingName));
            string allLine = streamReader.ReadToEnd();
            return allLine;
        }
    }
}

ReadJsonToArarry()メソッドはjsonファイル内のデータを文字列として受け取り、その文字列をデシリアライズすることで、敵の出現情報(StageData[])を返すメソッドです。

敵を出現させるコードを実装する

jsonファイルを読み込み、デシリアライズする機能を実装できたので、次は取り出した敵の出現データを基に敵を出現させる機能を実装しましょう。

StageData[] stageDatas = Json.ReadJsonToArarry(jsonファイルのパス, "utf-8");
/*
stageDatasは配列であるため、何番目のデータを読み込むかを指定しなければならない
indexはstageDatas配列のインデックス値を表す
*/
int index = 0
//countはゲームスタート後からの経過フレーム数
if(stageDatas[index].SpawnCounter == count)
{
    //敵を出現させるコード(stageDatas[index].PositionXやstageDatas[index].Platoon 等のデータを使う);
    
    
    //次の出現データを読み込むためにindexの値を1増やす
    //ただし、エラー回避のためindexが(配列のサイズ-1)を超えない様にする
    if (stageDatas.Length - 1 > index)
    {
        index++;
    }
}

これで、狙ったタイミングに敵を出現させることができる様になりました。

おわりに

簡単な感じになってしまいましたが、jsonファイルを使うことで敵の出現を管理できる様になりました。
これでゲームの難易度調整が楽になりそうですね。
また、今回は省略しましたが、敵を出現させるコードを工夫することで、変な隊列を組んだ敵を出現させたり、敵の動く速さを上手く変えたりの応用ができそうです。今後はここら辺をもう少し詰めていきたいと思います。

最後まで読んでくれてありがとうございましいた!

SHARE THIS POST