ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

Making of TaskQuest<実装編>

TasukQuest」をどうやって作ったかのメモ書きの続きです。

前回の記事はこちらです。

 

最終的なコード量


最終的に17個のCSファイル、全部で約6000行ほどになっていました。。

CSはファイルは以下のような感じです。

・アプリケーションのメインエントリーポイント(20行)
・メインフォーム(2600行)
・ようこそ画面フォーム(50行)
・プロジェクト選択画面フォーム(210行)
・タスク編集画面フォーム(150行)
・オプション画面フォーム(150行)
・アプリ情報画面フォーム(60行)
・キャラステータス画面フォーム(60行)
・ジョブ図鑑フォーム(480行)
・経験値入手演出フォーム(90行)
・ステータスアップ演出フォーム(160行)
・レベルアップ演出フォーム(60行)
・アプリの設定の管理クラス(120行)
・キャラステータスの管理クラス(1250行)
 ※経験値の計算、レベルアップ周り、ジョブ関連のメソッド含む
・アプリとキャラステータスの設定の読み書きクラス(230行)
・カラーダイアログクラス(230行)
・暗号化クラス(80行)

未使用のCSファイルが2つ。

・マウスホイールを非アクティブのフォームに反映させるクラス(90行)
 こちらを参考に実装を試してみましたが動作に問題があったので結局未使用
ジョブチェンジアニメーションクラス(60行)
 そもそもコントロールをまたがって描画できない問題を解決できず未使用

6000行を超えているとは言えコメントや空行を大量に入れているので、そのあたりを省くと1/3くらいになるのではと思います。

あとは単純に素人のコーディングになっていると思うので、かなり煩雑な書き方になっていると思います。本職のプログラマさんならさらに1/2になったりするのでしょうか。。

実装したもの


ListFusen」の時と同じようにズラズラっと並べてみました。

■アプリ起動時

起動時にアプリ設定ファイルが無ければようこそ画面を表示
起動時にアプリ設定ファイルがあれば設定に反映
起動時にキャラステータスファイルがあれば暗号化を復元して反映
起動時に各プロジェクトのタスクリスト(セーブデータ)があればリストに反映

■タスク管理関連

プロジェクトのロード画面の表示
プロジェクト名の直接編集を可能に

3種類のフィルタリングの切り替え

タスクの追加(経験値をプラスする)
選択中のタスクの複製(経験値をプラスする)
選択中のタスクの削除(経験値をマイナスする)
タスクの追加・複製時にスクロールして先頭に表示しセルを選択状態にする

タスク編集画面の表示
オプション画面の表示
 さらにカラー選択画面の表示
 さらにアプリ情報画面の表示
キャラステータス画面の表示
 さらにジョブ図鑑の表示

各操作のショートカットキーをエクセルライクにする形で実装

リストの描画が更新される度に経験値取得済みの行を専用色で塗り潰す
リストの描画が更新される度に優先度設定に応じた色で優先度のセルを塗り潰す

列ごとにIMEモードを設定(数値入力だけの列はIMEを無効にするなど)

選択中の複数セルへ入力した値を一括反映
 ただし数値や特定の文字しか受け付けない列は入力内容を判定して反映させない
選択中の複数セルへクリップボードからの一括ペースト
 ただし数値や特定の文字しか受け付けない列は入力内容を判定して反映させない
セルのクリップボードへのコピーはエクセルで貼り付け時にセル分けされるよう対応

ドラッグ&ドロップによるセーブデータの読み込み対応

セーブデータのテキストファイルでの保存
 CSVのようにカンマ区切りにしているのでカンマ使用時に専用の文字列に置換して対策
 データに改行が含まれているとまずいので専用の文字列に置換して対策
アプリの設定データのテキストファイルでの保存
キャラステータスのテキストファイルでの保存
 自由に改変できないようAES方式で暗号化

■タスク完了時

タスクの内容に応じて取得経験値を計算
 優先度ボーナスを加える
 見積もり精度ボーナスを加える
  見積もり精度の算出は相対誤差をベースにアレンジ
  相対誤差の計算方法と意義 - 具体例で学ぶ数学

経験値を加算する演出の表示
 非同期処理でメッセージ表示(途中でボタンを押せばスキップできる)
 RPG風に一文字ずつウェイトを入れてメッセージを表示
 経験値と経験値バーの表示の更新

時に次のレベルの必要経験値に達していたらレベルアップ処理
(レベルアップしなくなるまでループで回す)
 レベルアップ演出
 ステータスアップ判定
  必ず1つはステータスがアップするよう対策
  アップしたステータスが少ない場合にランダムにステータスアップのチャンスを設定
 ステータスアップ演出
 ジョブチェンジするか判定
 レベル・ジョブ名・ジョブのドット絵などの表示の反映
 ジョブをコンプリートしたかどうかの判定
 完了したタスクに経験値取得フラグを立てる

■キャラ関連

キャラ名、レベル、ジョブ名、経験値、ジョブのドット絵の表示と更新
次にレベルアップするまでの経験値をバーにして表示
ステータス表示
ジョブ図鑑
 ToolTipとしてジョブの一言説明文を用意
 コンプリート時のおまけ要素でいくつかの実装

■ようこそ画面

ユーザーによる名前の入力と反映
ユーザーによる工数の単位の入力と反映

■ロード画面

3つのプロジェクトをロード画面で切り替え可能に
各プロジェクトのセーブデータの保存先を指定可能に
保存先のフォルダを開くボタン
ロード画面でOKボタンを押すとそれまでのセーブデータを自動保存
ロード画面でOKボタンを押すと選択していたセーブデータを読み込んでリストに反映

■アプリの設定関連

キャラの名前の管理

工数の単位の管理
工数の入力エラー判定とエラーメッセージを表示するかのフラグの管理

タスクリストに表示する列の設定の管理

オートセーブの設定の管理
 一定時間経過するごとにオートセーブ
オートバックアップの設定の管理
 前回のバックアップ日時を記憶しておき、一定時間経過したら再度バックアップを取る

アプリの色と経験値取得時の色の管理
タスク編集画面の詳細パネルの文字の折り返しのフラグの管理
経験値取得演出を表示するかどうかのフラグの管理

アプリの位置とサイズを覚えて次回起動時に反映

■補助的なもの

ありとあらゆるところにToolTip(バルーンヘルプ的なもの)を用意

ありとあらゆるところにTry & Catchで例外回避してエラーメッセージを出す仕込み

DataGridViewの描画を高速化するためにダブルバッファを有効化

 

‥といった感じです。

セルの一括入力、一括ペーストあたりが不具合が色々出て大変でした。。

例えば複数選択中のセルに入力した値を一括反映させる際に、セルの編集モードが終了したタイミングのイベントで実装すると、カレントセル(セルを複数選択すると最後に選択したセルがカレントセルとなります)が編集モードになっている状態で別のセルをクリックした場合に、その時のカレントセルの値が新しく選択したセルにいきなり反映されてしまうという問題が起きたり‥

コードの中身は素人丸出しな感じだとは思うのですが、「ListFusen」よりは大分マシになったのではと。。とりあえず「よく頑張って作った」と自分を褒めてあげたいと思います!