制作作品:TETOLOAD
[制作環境:VisualStudio2019/DirectXToolKit] [制作期間:4ヶ月間(2022/06~2022/09)] [制作人数:1人]
作品について
概要:就職作品
目的:就職作品として制作。また、DirectXToolKitに触れるため制作
技術:ステートパターン、ステートマシンを使用したキャラクタークラス
外部ファイル(CSV、JSON)を用いたステージ、背景、UI管理
任意の位置、回転、切り抜きで描画可能な3D板ポリ描画クラス
ゲームルール
・色付きのブロックが4つ以上並ぶと消える
・自動で動くキャラクターをゴールまで導くとクリア
プレイ動画
作品データ
使用した技術、アピールポイント
1.ステートパターンを使用した自身で判断し動くキャラクターの実装
キャラクタークラスの状態
・待機
・歩き
・登る
・降りる
・落下
・向きを変える
をクラス化し、ステートマシンクラスで状態遷移時に生成しています。
ステートマシン実装時当初は unordered_map を用いて生成済みの各状態を切り替え実行していたのですがプログラミングの理論的には状況に応じた破棄や再生成を行うほうが良いと考え、変更しました。以下はこれまで実装・改良してきた内容です。

実装時:状態毎の関数をunordered_mapの値に関数オブジェクトを用いて使用。
----------------------------------------------------------------------------

変更①:各関数をクラス化し、生成したインスタンスをステートマシンに渡し、管理。
(常にCharacterの各状態が1つ存在する状態)
----------------------------------------------------------------------------

変更②:各状態が必要になったら生成し、以前の状態は破棄。
(ステートマシンは常に1つのインスタンスを所有)
2.外部ファイルを用いたデータ管理
外部ファイルを用いて背景配置、ステージ構造、UIの管理を行いました。
UIは当初各シーンの所有するUIクラスに画像IDや配置、スケール、一部のUIにのみ必要な処理を直打ちしており、まずCSV形式に変更しました。その後、各データの視認性、拡張性を考えJSON形式に変更しました。名指しでデータを検索、取得できる利点から、画像の切り抜きのオンオフなどの一部データは必要時のみ用意し使用するようにしました。
3.シェーダーを用い板ポリで画像を切り抜き/回転表示するシングルトンクラスの実装
シェーダーを使用した板ポリでの描画、エフェクトの作成を学びました。そのまま作品に使用するには不必要な処理や無駄なメモリ確保、使い勝手の悪さがあったため、新たにSprite3Dクラスをシングルトンで実装しました。
はじめに実装した時点では、板ポリの比率が1:1固定のみ、画像切り抜きが出来ない等、使い勝手が悪い状態でした。現在は改良を重ね上記の二点や細かい部分を改良しました。
使用する際は画像ID、位置、回転、α値、ビルボードの有無などを引数に持つAddTexture関数を呼び出し描画データを設定、最後にDraw関数を呼び出すことで内部でソートされた描画データを全て描画することができます。描画処理に触れずに画像や位置などの値だけで描画することが出来るのでスムーズに制作することが出来ます。

AddTexture関数
新たにシェーダーの切り替えや追加を行いたい場合はシェーダーを入れ替え再コンパイルしたり、複数のシェーダーを読み込み、引数にIDを用意し切り替えることで使用できます。
4.ステージ選択シーンにおける描画処理の削減
実装時は各ステージの見た目を描画する際にステージのマス一枚一枚をSprite3Dクラスで描画しており、端がカクカクしてしまう等の問題がありました。そこで、まず一枚の画像として描画した後に3次元に描画するよう改良しました。その結果、描画処理にかかる時間をおよそ94%削減することができました。

実装時:毎フレーム何度もループし描画
------------------------------------------------------

変更後:画像を生成し、毎フレーム生成した画像を描画
苦労した点
・「色付きのブロックが4つ以上並ぶと消える」というアルゴリズムを実装するのにかなりの時間がかかりました。(制作時Post)
・UIを外部ファイルで管理するにあたり、本作品に必要なUIの洗い出し、制作が大変でした。これまでキャラクターやブロック等のオブジェクトは設計が意識出来ていたものの、UIをオブジェクトとして考えることが出来ていなかったと実感しました。
今後の展望など
・Unityを用いてAndroidなどで公開したいと考えているため、ステージの追加やUIの追加を行いたいと考えています。
使用した外部ツール
1.CRIWARE ADX2 LE URL
使用用途:音の再生
2.IbisPaiint URL
使用用途:ゲーム内のイラストなどの作成
3.GIMP URL
使用用途:ゲーム内のイラストなどの作成
