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
Tweet