ゲームランチャーの実装のはなし
こんばんは! YuZakuroです。
今日はテスト初日でした。そして2014年度ANCTGCCアドベントカレンダー初日でもあります。
何について書こうかテスト中に考えたところ、ランチャーについて書くことにしました。
ランチャーとは?
明石高専祭に来ていただいた方はご存知かと思いますが、ANCTGCCでは毎年高専祭でゲームを展示しており、その際ゲームだけではなく、ゲームを起動するためのランチャーを制作しています。
ちなみに、ここ数年は担当者が毎年新しいランチャーを作成しています。当然ゲーム制作も並行して行っているため結構大変です。
実装
先述の通り、ここ数年は毎年実装方法が違うので、2014年度、つまり今年度の高専祭で展示したランチャーに焦点を絞って、実装方法を説明していきたいと思います。
使用言語・ライブラリなど
C# + WPF4.5 + Modern UI for WPF + YamlDotNet
部内の非プログラマからは比較的評判の良かった今年のランチャーですが、プログラマには手抜き実装であることはバレていたようです。
UI部分はほぼModern UI for WPFのデフォルトです。テーマカラーを変更する機能もサンプルにあるものをそのまま流用しています。
ロゴ
ランチャーの右上部分にANCTGCCのロゴアイコンがありますが、これもModern UIの機能を使用しています。
ロゴはmini-languageで書きます。Blendを使って書くこともできますが、諸事情により直接入力しました。ロゴの定義部分を抜粋します。
LogoData="F1 M -1.05,-1 H1 V-0.9 H-1 Z M -1,-1.05 V1 H-0.9 V-1 Z M -1.05,1 H1.05 V0.9 H-1 Z M 1,-1.05 V1.05 H0.9 V-1 Z M -0.80,-0.75 H0.75 V-0.65 H-0.75 Z M -0.75,-0.8 V0.75 H-0.65 V-0.75 Z M -0.8,0.75 H0.80 V0.65 H-0.75 Z M 0.75,-0.8 V-0.2 H0.70 V-0.75 Z M 0.75,0.8 V0.2 H0.70 V0.75 Z M -0.55,-0.5 H0.5 V-0.4 H-0.5 Z M -0.5,-0.55 V0.5 H-0.4 V-0.5 Z M -0.55,0.5 H0.55 V0.4 H-0.5 Z M 0.5,-0.55 V-0.2 H0.4 V-0.5 Z M 0.5,0.55 V0.2 H0.4 V0.5 Z M -0.25,-0.25 H0.25 V0.25 H-0.25 V-0.25 Z M 0.75,0.2 H0.25 V0.1 H0.75 Z M 0.9,-0.2 H0.25 V-0.1 H0.9 Z "
自動読み込み
このランチャーの便利な機能として、Gamesディレクトリ内にあるゲームを全て自動で読み込むという機能があります。
実装方法は簡単で、Gamesディレクトリ内を(サブディレクトリも含めて)探索して、Game.ymlというファイルをすべて読み込みます。
このファイルにはゲームの実行ファイルのパスやスクリーンショットのパスなどが書かれているので、その情報を使用してランチャーでゲームの情報を表示したり、起動したりします。
昨年度のランチャーではC#との親和性の観点からxmlが採用されていましたが、今年度は書きやすさを優先してyamlを採用しています。
ゲームごとのページ作成
ランチャーを起動してもらえるとわかりますが、ゲームの一覧が画面左側に表示され、画面右側にはゲームの詳細情報が表示されます。
これもModern UIの機能で、xamlファイルを文字列で指定することによってこのような画面が作成できます。
ただ、この方式ではxamlファイルはコンパイル時に存在していなければならないため、コンパイル時にゲームの一覧を作成できない自動読み込み機能を実現できません。
この時点で、Modern UIを使うことを半ば諦めかけていましたが、ソースコードを読んでみるとどうやらIContentLoaderを実装したクラスを使用することが出来るらしいということが判明。
xamlファイルのuriはキーとして使われるので重複できないため、各ゲームごとに乱数で生成したダミーのuriを割り当てておき、実際に読み込むときには、引数を無視して共通で使用するxamlファイルを返すようにしています。
まとめ
今年度のランチャーはWPFで実装されてるよ!
ほとんどライブラリの機能 or サンプルの流用だよ!
でも時々ちょっと頑張ってるよ!
明日は副部長のスペードくんに任せることにします。最近なにやら色々と勉強しているようなので、期待しましょう!