DotFeatherを使ってみる
はいどーもこんばんは、無職まっしぐらの無職です。
本日はDotFeatherを使ってみようと思います。
DotFeatherってなに
DotFeatherとは、Xelticaさんが制作しているC#用のゲームエンジンです。
C#のAdventCalendarをボーッと眺めていたらゲームエンジンの話があり、ちょろっと覗いて興味を持った感じですね。
詳しい情報はQiitaの記事で概要を見てもらえればなと思います。
ゲームウィンドウを表示してみる
Qiitaの記事に従って準備を完了させたら、とりあえずコードを書いてみます。
まずはゲームウィンドウの表示ですね。
public class Game : GameBase {
public Game(int width, int height) : base(width, height) {
}
static void Main() {
using(var g = new Game(816, 624)) {
g.Run();
}
}
}
はいこれだけです。
これでゲームウィンドウが表示できます。
とりあえず動いたので、あとは何を作るかなんですよね。
今回は「ノベルゲーっぽい挙動するなにか」を作ってみようと思います。
タイトル画面を作ってみる
ゲームは「シーン」という単位で画面を管理させたいことが多いです(ツクールもUnityも基本はシーン単位で動いてます。ゲームの作り手によっては1シーンのみでやりくりする場合もありますが……)。
というわけで、DotFeatherでもシーンを作ってみましょう。
公式サイトの説明を参考に組み立てて行きますよ。
シーンを作成する
まずはSceneTitleというクラスを作りましょう。
こんな感じ。
/// <summary>
/// タイトルシーン
/// </summary>
internal class SceneTitle : Scene {
}
わお簡単ですね。ツクール並の簡単さです。
公式ドキュメントによれば、Router.ChangeScene<T>()でシーンの遷移が可能なようです。
また、第2引数に辞書型変数を渡すことで次のシーンのOnStart()に値を渡せるようです(例ではジェネリック版ですが、第2引数云々と書いているのは非ジェネリックメソッド版の話かと思われます)。
これの何が嬉しいかと言えば、シーンをまたいでデータのやり取りができることですね。
Unityはシーンをまたいだデータのやり取りがちょっと面倒なので(シングルトンとか使うなら簡単ですけど……)、これは嬉しい点ですね。
タイトルシーンを呼んでみる
というわけで呼んでみましょう。
こんな感じでどうでしょう。
public class Game : GameBase {
private Router _router;
public Game(int width, int height) : base(width, height) {
_router = new Router(this);
}
protected override void OnLoad(object sender, EventArgs e) {
var initData = new Dictionary<string, object> {
{ "キーA", "山田太郎" },
{ "キーB", "次郎さん" },
{ "キーC", "ちょんまげ君" }
};
_router.ChangeScene<SceneTitle>(initData);
}
protected override void OnUpdate(object sender, DFEventArgs e) {
_router.Update(e);
}
static void Main() {
using(var g = new Game(816, 624)) {
g.Run();
}
}
}
changeSceneでデータを渡していますが、特に深い意味はないです。
単に本当に使えるのかなーというレベルの興味で渡してみただけですね。
一応これでタイトルシーンが呼ばれているはずなのですが、DFEventArgsとかなんやねんとかいうのがまだわからないので、ルーターのupdateとかさっぱり意味がわからないので、ちゃっちゃかタイトルシーン本体に行きましょう。
タイトルシーンでデータを受け取る
とりあえずチュートリアルの通りにやるならばこんな感じでしょうか。
/// <summary>
/// タイトルシーン
/// </summary>
internal class SceneTitle : Scene {
public override void OnStart(Router router, GameBase game, Dictionary<string, object> args) {
System.Diagnostics.Debug.Write(args["キーB"]);
//Print("C");
//Print("Press ESC to return");
}
}
argsの中にはrouterから渡されたディクショナリが入っています。
キーBだと「次郎さん」が返ってくるはずで、実際に入っていたのでOKです。
ただPrintメソッドはSceneの中にどうもない臭く、以下のように書かなければなりません。
game.Print("C");
game.Print("Press ESC to return");
未確認ですが、おそらくイベントフック系の処理にはgameとrouterがそれぞれ渡されて来るので、シングルトンでGameBaseやらRouterやらを保持するなよ! そういう書き方するなよ! ということなのだと思います。
とにもかくにも、これでシーンごとにデータを受け渡すこともできますね。
夢が広がります。
フォロワー以上限定無料
特典はほとんどありませんが、入ってくださる方が増えれば増えるほど僕が喜ぶプランです(笑)
無料