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

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

Making of TaskQuest

TaskQuest」をどんな感じで作っていったか軽くまとめておきたいと思います。

 2019.1.11 実装編も書きました!
 Making of TaskQuest<実装編> - ゲームエフェクトデザイナーのブログ (新)

 

制作の動機


これまでちょっとしたタスク管理を個人的に行う際に、メモ帳などのテキストエディタで行ったり、エクセルで行ったり、アナログな付箋紙で行ったりしていましたが、どれも不便に感じていました。

テキストエディタだと、進行中のタスクや完了したタスクのグループ分けを手作業でやるというのは非効率すぎます。。

エクセルのソートやフィルタでそのあたりは吸収できますが、以下のような不満があります。

・起動にちょっと時間がかかる
・タスク管理面では必要以上にメニュー等が多くて余分な面積を取る
 なのでウインドウサイズを小さくして画面の隅っこに置いて使うには不向き
・「完了」などタスクのステータスに応じたフィルタリングの操作がやや煩雑
  ⇒ こちらはVBAでボタン作ったりすればフォローできますね


そこで「Backlog」のようなすっきりしたルックでWindows用のスタンドアローンなツールがあればなあと思っていました(Webベースだと個人でラフに使う分には、リストのコピペなどレスポンス良くできずあまり好みでは無いので)。

C#Windowsフォームアプリを作るようになってからは、タスク管理アプリも「いつか作りたいな」といった感じで制作候補の1つになっていました。

ちなみに、ドット絵のキャラが成長する要素は最初から入れたいと思っていました。

例えば「Yahoo!知恵袋」でもスコアを稼いでグレードを上げていくようなシステムが入っていますが、こういったゲーミフィケーション的な要素は世の中の色んなものに入っていて欲しいと昔から思っていたので、タスク管理を楽しくするためにも欲しい機能だなあと。

制作開始したきっかけ


とは言え、Windowsフォームで使えるコントロール(ボタンやリストなどのGUIパーツ)を使ってどうしたら再現できるのか悩んでいました。

当時は「ListFusen」のように2カラムなスタイルにして、左側にはタスクをリスト上に並べて、クリックすると右側に詳細が表示されるような形かな~となんとなく思っていましたが、こちらでも紹介している書籍「作って覚えるVisual C# 2017 デスクトップアプリ入門」の家計簿アプリをあらためてなぞってみた際に「家計簿アプリのアレンジでいける!」と思って、具体的にアプリの中身を考え始めました。

草案みたいなもの


スマホのメモアプリに最初にざーっと必要な要件を書き出したのがこちらです(長い!)。

タスク管理アプリ「Task Quest」

◆トップ画面

今やっているタスクをトップに表示する?
→ 悪くないが頻繁にアプリにアクセス必要になる 面倒がられそう

そしてタスクリストは普段消しておき、ボタン押下ですぐリストの開閉ができるようにする?
→ 同上

また、今やってるタスク表示の横に完了ボタンを置くとなお快適に?
→ 完了ボタンをトップに置くのはありかも 但し実工数を付け忘れそう

タスクが終わったら完了にする流れはこの方が習慣付けやすいかも。
また、画面もスッキリする。

敵と戦ってるようなキャラアニメも乗せたい

アイコンは
・新規タスク追加
・選択タスクの削除
・完了にする

情報は
・タスク総数 0 / 0 (個)
・総工数 0 / 0 (日)
・Lv
・経験値 見せない方が良いかも

◆リストの挙動

タスクをダブクリで設定画面が開く
タスクの難易度に応じた敵アイコン
概要欄は文字数を制限して省略する

◆リストの表示モード

フィルタは完了以外、完了、すべて
大カテゴリでのフィルタも?

検索ありにする?
大カテゴリ、内容、ID、備考で可能?

◆設定画面

ボタンはOK、トップに表示、完了

完了時には実際の工数を入力させる?
オプションで選べると良さそう
最初に設定した工数と差分を出して見積もり精度を表示する?

◆リスト

大カテゴリ プルダウン?
内容
ID
難度 プルダウン 固定
工数
進捗 プルダウン 固定
備考

カテゴリのプルダウンはどうする?
ありの方が快適になるが、後から変更すると一気に全て変わってしまうが‥
あると登録時には快適になる
しかしカテゴリ登録の手間は増える
カテゴリ登録の画面と設定保存が必要
とりあえず無し?

設定ファイル書き換えも可能にする?

◆レベル

累計の経験値でレベルが決まる
タスク完了時にレベルアップ判定
専用のメッセージと演出を入れたい

経験値
タスク登録
・基礎10 * 難度 * 工数h
・難度倍率は 1, 2, 3
例:難易度中の8時間作業
10 * 2 * 8 = 160
・難度は含めない方が良いかも
工数は時間単位
工数は含めない方が良いかも
固定値でいくなら基礎ポイントは高め
50くらい?
タスク最初に20個登録して1000
1タスク平均3hとして1日3タスク消化
150取得、1週間750、1ヶ月3000
1年36000 タスク登録だけで

タスク変更
・ひとまず考慮しない?
・ちゃんと差分を増減させる?
・タスク完了を差し戻した場合は考慮しないといけない
何もしなくても経験値を増やせちゃう

タスク削除、未完
・ひとまず考慮しない?
・登録と同じ経験値をマイナスする?

タスク完了
・基礎30 * 難度 * 実工数
・難度倍率は 1, 2, 3
例:30 * 2 * 8 = 480
難度小1日240、中480、大720
難度中で1週間2400、1ヶ月9600
1年115200
タスク登録を足すと151200

細かくタスクを登録した方がメリット持たせるには、タスク登録は固定の経験値が良いかも
実装も計算もシンプルになる
レベルダウンも無くせる wiz..

予定より早く終わらせた場合は?
ボーナス?
見積もり精度の方が重要かも

見積もり精度も考慮させたい
見積もり精度ボーナス?
見積もり精度の計算
工数を1として実工数の割合を出す
1はボーナス * 1.2
0.8〜1.2はボーナス *1.1

全タスク完了ボーナス?
タスク沢山登録するメリット無くなる

どれくらいLvUpさせる?
1年使ってくれたら万々歳すぎる
Lv50くらい?
1年の経験値が150000としたら
単純に均等割りで1Lvに3000
対数的にする?
最初だけはサクサク上げたい
使い始めの初日、200でLv2とか
500でLv3、900でLv4、1400でLv5
タスク20個登録の難度中8hでLv5

◆レベルアップ時の演出

ファンファーレを入れたい
メッセージを入れたい
・レベル、タスク総数、総工数
・キャラステータス持たせる?
ランダム要素に上がりやすさを加える
難度(優先度)高い 力
難度(優先度)低い 素早さ
工数大きい 体力 3h〜くらい?
工数小さい 素早さ 1〜2hくらい?
コメント書いてたら 運の良さ
見積もり精度高いと 賢さ
二律背反は無いが、力と体力どちらも高い時は素早さが低い

レベルアップ時
優先度 80% 力or素早さ+1 20% 無し
工数 80% 体力or素早さ+1 20% 無し
コメント 80% 運+1 20% 無し
総合見積もり精度を出す
70%以上で賢さ+1 満たないと無し

ステータスの偏りでグラ変える?
一定条件で忍者/ロード/侍とか wiz

○下級クラス
Lv10以上
見積もり精度関係なし
最も高いステータスの割合で決まる
力 = ウォーリア
体力 = クレリック
素早さ = ローグ

○中級クラス
Lv20以上
見積もり精度関係なし
力 + 体力 = ナイト
力 + 素早さ = アーチャー
体力 + 素早さ = ビーストテイマー

○上級クラス
Lv30以上
見積もり精度が高い役職
特定の値を超えてかつ割合で決まる
見積もり精度が満たない場合は中級
賢さ + 力 = パラディン
賢さ + 体力 = ドラグーン
賢さ + 素早さ = ウォーロック
賢さ + 力 + 体力 = ○○○○
賢さ + 力 + 素早さ = ○○○○
賢さ + 体力 + 素早さ = ○○○○

○その他
Lv10以上 運が一番高い = ○○○○
Lv30以上 運が一番高い + 賢さ = ○○○○
確率的にはレアにしたい
バランス良いタスクで几帳面だとなる
可能性がある感じ

◆難度の定義

カンタン、ふつう、ムズい

カンタンは単純作業
リスト記入、報告、会議出席
バウンディングボックス設定

ふつうは普段の制作作業
テクスチャ、モデル、エフェクト

ムズいは新表現の模索、検証など
成功するか不安なもの
できた時に仲間から尊敬される作業

◆優先度


ほかの作業より先に提出する必要あり
作業の遅れが開発全体の遅れに直結


普通の作業


後回しにしてOK
または最悪やらなくて良い 努力目標

◆名前と性別の入力

必要に思う!
性別はナイーブなので扱わない?
でもあった方が良い
しかしグラフィックは倍大変

変数を用意
Strings name;
Bool male;
初めてアプリ起動時に聞く

オプション設定から変更できる

◆経験値取得とレベルアップの実装

○経験値取得処理
int exp;
只々足していき、消費やマイナス無し

・タスク追加時 50固定
exp += 50;
経験値バー更新

・タスク削除時 何も無し

・タスク完了時
モンスターを倒すグラフィック再生
優先度と工数に応じて変わる
exp += 30 * *
次にレベルアップ判定に行く

○レベルアップ処理
int lv;
こちらも只々足していく
int lvupNext = lv+ 1;
int lvupNow = lv;
int lvupNextExp =
int lvupNowExp =
必要経験値 lvupNext - lvupNow
現在経験値 exp - lvupNowExp
現在 ÷ 必要 * 100 = %

・タスク完了時
While 条件を満たさなくなるまで
次のLvUp条件を満たした
経験値バーを一旦100%にする
グラフィック表示 + SE
メッセージ
○○は Lv 00 になった!
○○が ○ あがった
LvUpしたフラグON
Break;
ジョブチェンジ判定
今は何のジョブになるか?
今と同じジョブなら終了
別のジョブなら
グラフィック表示 + SE
メッセージ
○○ は ○○ にジョブチェンジ
ジョブチェンジしたフラグON
終了判定
経験値バー更新
フラグに合わせてヒントを表示
"工数を入力すると良いことが!"
"見積もりに近いと良いことが!"
"ステータスでジョブが変わる!"
"タスクは細かく分けよう!"
フラグを全てOFF
OKボタンを表示(消しておく)

◆グラフィックデータ

下記 * 性別分

デフォルトの絵 赤ちゃん Lv1専用
冒険者見習い Lv2〜9まで
ジョブ14種類
計16種

敵の種類
優先度3 * 工数3 * バリエ3 = 27種
バリエはレベルに合わせる?

倒す演出エフェクト GIFアニメ重ねる
殴り、一閃、フラッシュ

消滅エフェクトきらきら GIFアニメ

ボタンアイコン 6種
追加、編集、検索、複製、削除、歯車

◆保存

CSVの形で保存
なのでエクスポート機能は無し

◆おまけ要素

○アプリ情報

メールアドレス
ブログ
ツイッターとアイコン
作成日とバージョン
バージョンアップボタンで対応

○デジタル証明書

プロジェクトのアセンブリ情報のプロパティで設定できる模様?

○未処理で完了

モンスターが逃げる演出とSE

○カラーチェンジ

オプションで色変え
帯の色を自由に変えられる
アイコンは中間色にする必要がある
Lv10で解放とか?

○ジョブ図鑑

オプションでレベルと経験値をリセットできるようにする

ジョブ図鑑でなったジョブが表示

基本ジョブが全て埋まると
勲章アイコンが画面に付く
全ジョブが埋まると
マスターアイコンが画面に付く

◆リリース方法

Booth
500円でどうか

GUMROAD
お値段を決めて買ってもらうサービス
簡単な1ページ説明書
おまけでメイキングPDF付ける?


ざっと見ても分かる通り、タスク管理としての機能よりもキャラ成長要素の仕様をどうするかのメモの方が多いです。楽しいですね。。

ちなみに、大体のRPGではレベルが上がるほどに必要な経験値が増えますが、タスクから得られる経験値が一定なのと、使用して月日が経つほどにレベルアップの頻度が落ちていくのは寂しいと思い、レベルが上がっていってもある程度一定のペースで上がり続けていくバランスに落とし込みました。Wizardryのようにレベル1000とか上がってもいいじゃない。

また、ジョブはネタバレになるので一部伏せていますが、元ネタとしては「Wizardry」「Tastics Ogre」「FF」あたりが混ざっています。忍者とかロードとか入れたいですよね!

それからオミットとなったアイデアも色々とあります。TaskQuestというからにはタスクも敵キャラとしてドット絵を用意して戦闘画面風の演出を入れたかったりはしましたが、「完成がかなり遠のきそうだ」と思って諦めました。。

こちらが、上記メモを書いていた時のツイートです。

 

制作開始!


まずはコントロールを配置しながら大枠のデザインを決めて、エクセルの表のような「DataGridView」というコントロールに、タスクを登録できるところまで実装しました。

会社から帰宅したら作るという感じで1週間ほどすると根幹となる機能は入りましたが、まだまだ実装を予定している機能が大量にあり、また色んな不具合や不便な要素に困っている状態でした。

 

成長要素の導入とクラス分け


1つのCSファイルにズラズラっと全ての変数や関数を書いていると可読性が下がり大変になってきたので、クラス分けの先駆けとして「ツール設定を管理するクラス」「キャラのステータスを管理するクラス」を用意して移し換えました。

実はここで初めて「プロパティ」を試しました。

プロパティという単語自体はアーティストでも色んなツールを使う上で普段から慣れ親しんでいるものですが、プログラム初心者の身からすると変数と何が違うのかよく分からない訳です。でもとりあえず使ってみようと(結局、クラス内で変数のようにしか扱っていないので変数で良かったかなという感じではありますが)。

この頃、C#を触り始めて1年半ほどでツール制作にも徐々に慣れてきてはいましたが、仕事ではコーディングしないのであくまで趣味の範疇です。まだまだ文法は知らないことばかりで初めて試すものも多く、また「構造体」「インターフェース」「デリゲート」など全く分からない状態でした。

その時の気持ちはこちら。

また設定を管理するようなクラスはアクセス修飾子をstaticにしてメモリに常駐させ、newしなくてもいつでもプロパティの中身を読み書きできるようにすると便利ということに気付いて、後から全てstaticに書き替えたりしました。

それまでクラスのアクセス周りはよく分からずに困ることが多かったのですが、例えば子となる別のフォームから親となるメインフォームを制御したい場合に、メインフォーム自身をコンストラクタの引数として渡してあげたら可能だというのも今回の制作でようやく理解した感じです。それも「多分スマートではない方法なんだろうな」と思いつつ、他に方法を知らないのでとりあえずメインフォームやそれに属するコントロールを別のフォーム生成時にコンストラクタで渡すというのを非常に多用しています。

さて、下記のような成長要素を暫定で入れましたが、このようにメッセージボックスを表示するだけなら非常に楽です。しかし、後にちゃんとデザインした独自のフォームに表示させようとした際に中身が複雑になってかなり苦労しました。

 

色々な機能を実装


必須機能として「完了以外」「完了」などのステータスに応じたフィルタリングを入れましたがここでかなり躓き、データベース・DataSet・DataTableと、それらの値を表示するDataGridViewとのやり取りの基礎的なあたりを色々調べたりしました。

また、複数セルへの一括入力や一括ペーストにも対応しました。こちらは必須だろうと。

しかしDataGridViewのイベントを取得するタイミングが色々とあるものの、それぞれのタイミングで色んな問題が噴出し、不具合に悩まされることとなります。

f:id:moko_03_25:20190110163500g:plain

キャラステータス画面やオプション画面も入りました。

こういった縦横に自由に敷き詰めるレイアウトで画面を作ると、設定項目が1つ増減するだけでレイアウトに大きく影響するのであまりよく無いですね。。

f:id:moko_03_25:20190110163604g:plain

色を選択するためのフォームを作ったり‥

f:id:moko_03_25:20190110163717g:plain

初起動時の設定画面を作ったり‥

f:id:moko_03_25:20190110164156j:plain

ジョブ図鑑を作りました。ジョブを新たに取得するごとにシルエットがオープンになる感じです。

こういったオマケ的な要素は、デザインするのは楽しいですが実装すること自体は単純なので面倒ですね。。気分転換したい時にはドット絵を修正したりしていました。

f:id:moko_03_25:20190110164237g:plain

タスク完了>レベルアップ>ジョブチェンジの演出のためのフォームを作って差し替えましたが、RPGメッセージ風にテキストを表示するために同期&非同期処理について調べたり、GIFアニメ画像を載せたりするためにコントロールのレイヤー周りについて調べたりして結構大変でした。。

結局のところ「Windowsフォームは制約が多すぎて、コントロールに重なるようにビジュアル的な演出を入れるのには向かない」という結論に達し、ここは色々と割り切りました。残念です。。

f:id:moko_03_25:20190110170949g:plain

下図は After Effects で作ったイメージ画像ですが、たったこれだけのこと(コントロールにまたがるようにGIF画像を上に載せて表示する)ができないんですよね。。

f:id:moko_03_25:20190110171616g:plain

という訳で、着手を始めて1ヶ月ほどであらかたの機能が入りました。

この後にも実行ファイルにアイコンを適用したり保存データを暗号化したり不具合を取り除いたりと、1ヶ月ほど追加でちょこちょこと作業はありましたが、大体の機能はこのあたりで入った感じです。

 

テストしてくれる方とslackでやり取り


今回は当初より「販売する」というのが1つの試みでもあったので、不具合満載の商品をリリースする訳にもいきません。そこで会社の同僚やTwitterのフォロワーさんに何人かにテストをお願いして触ってもらい、不具合報告や要望などをいただきながら開発を進めていました。

ありがたいことにTwitterですぐにお声掛けをいただき、slackで専用のプロジェクトを用意してそこでやり取りさせていただきました。

f:id:moko_03_25:20190110173033j:plain

最新の実行ファイルもどんどんアップしていけますし、とても便利でした。

分からない時にどうしたのか


大体はココナラで有料で質問して解決しています。
有料だと気兼ねなく聞けるのが良いですね!

いつもお世話になっているのはこちらの「Kazuki Takayama」さんになります。

他にも、ある不具合の原因が分からずに困っていた時 sw(@Callisto_n)さんに泣き付いて、勉強会の帰りにカフェで不具合を見つけていただいたのですが、その際にソースコードをざっと見渡して改善ポイントまで教えていただいたりしました(swさんその節はありがとうございました‥!)。

諦めたこと


一番大きいところでは、複数人でのタスク管理です。

「TaskQuest」はあくまで個人のちょっとしたタスク管理を想定しているため、お仕事で使うには正直厳しいと思っています。特に複数人で1つのプロジェクトを同時編集したいと思った場合には、恐らく以下のようなあたりの実装が必要なのかなと‥。

こちらは今の自分には厳しいと思って諦めました。

・データベースの知識
 サーバ上でリストを管理して、クライアントのアプリからアクセスする形

・アカウントを登録&管理するような仕組み
 パーミッションとかも含めた色々な設定

複数アカウントの同時編集の仕組み


こちらに関しては「Googleスプレッドシートなど元からクラウド上で複数人の編集が可能になっているサービスを利用すれば楽にできるのでは?」というアドバイスをいただいたことがあり、それならもしかしたら手軽にいけたりするんでしょうか。また機会があれば試してみたいです。

次に、スマホアプリとしてのリリースです。

こちらは「Xamarin」とか使う感じでしょうか。軽く調べた感じでは面白そうではあるのですが、今の自分にはまだまだ敷居が高そうな印象がありました。でもそのうち試してみたくはあります。

それから、アンドゥとリドゥの実装。

C#でUndo/Redoを実装した - Qiita

こちらで概念から解説されていて「これは今の自分には無理だ」と即諦めました。。

複数行の一括削除。

リストと複数セルの選択ができるのだから、複数行を一括削除もしたいものと思います。でもこれはアンドゥとリドゥが実装されている前提になると思いました。うっかりミスで複数行を削除してしまった場合に悲劇となります。。なのでこちらも同時に諦めました。

全タスクの文字列の検索・フィルタリング・置換

データベースとDataGridViewの理解が怪しいため不具合の温床になりそうで諦めました。。

 

販売してみる


今回は自分が作ったプログラムを初めて販売してみました。

世の中に非常に優秀なフリーソフトが大量にあることは勿論知っていますし、例え50円や100円のお値段設定だとしてもクレジットカード決済やコンビニ振り込み等のハードルから触ってもらえる機会が大幅に失われるだろうと思いましたし、「素人が作った不出来なものを売って良いのか?」という自問もありましたが、「どれくらいの人に買ってもらえるのだろう?」という純粋な興味が大きくありました。

目標としては40人の方にご購入いただいて2万円を売り上げることです。
そうすれば、C#関連書籍の購入とココナラの取り引きの費用などを回収できる感じです。

現在リリース10日ほどで18本売れたので、このまま40本達成できたら嬉しいなという感じです。

C#で3Dモデルを表示したい場合の方法メモ

色々と方法はあるようですが、古さ・情報の多さ・手順の煩雑さ・不具合の有無などそれぞれに色々なメリット・デメリットが存在するようです。

とりあえず調べて分かった範囲で雑にメモしておきます。

 ※随時更新

Managed DirectXを使う方法


Managed DirectX というもののおかげで C# でも DirectX を扱うことができるようです。

怖いものなんてない!!: C#で「using Microsoft.DirectX;」をすると参照エラーになる

 Visual Studio Community 2017をインストールするとDirectX SDKも同時にインストールされている様子。しかしusingディレクティブでDirectX関連のネームスペースを指定してもエラーになるので、関連するDLLファイルを直接参照してあげる必要があるようです。

C#でゲームプログラム講座 - DirectX - DirectGraphics①

 DirectXでゲーム用に3Dモデルを描画することについて丁寧に説明されています。
 ただしテクスチャを貼ってアルファブレンディングするところで更新が止まっています。

ステップアップ (Managed DirectX Direct3D) - ソーサリーフォース

 モデルの描画・ライティング・カメラと一通り丁寧に解説されています。
 ただし今の自分の環境ではサンプルの実行ファイルが起動できません。
 また、提示されているコードを試してみるとフォームが表示されず。。

C#でツールを作る その1-Direct3Dの初期化- - while( c++ );

 順に更新記事を辿っていくと記事も多く色々と試されています。

3D でウインドウを表示

01 - DirectX + C# 3D basic Terrain Generator Tutorial (setting up DX plus 1 basic triangle) - YouTube 

SlimDXを使う方法


SlimDX - Wikipedia

 SlimDXC# で DirectX11 を使うためのラッパーだそうです。
 Microsoft公式のラッパーよりも使い易いとか。
 SlimDXの公式サイトが見れない状態ですが、Visual StudioからNuGetで検索してインストールすることで無事に動作しました。

C#でDirectX11入門一覧 (SlimDX入門)|Memeplexes

 SlimDXを使った3D表示についてかなり丁寧に解説されています。
 しかもカメラ・ライティング・テクスチャなど一通り取り上げられています。
 こちらをベースに勉強していくと良さそうです。
 掲載されているコード自体にはコメントを記載されていないので、とりあえずコードを移植したら、解説をじっくり読みつつ自分で該当箇所にコメントを入れていく感じで見ていっています。

C#でDirectX 軽い気持ちでSlimDXを使うとき用ライブラリSlimDXSketchを作りました - 渋谷ほととぎす通信

 ひとつ前のSlimDX入門の記事をアレンジして解説されています。
 こちらの「三角形を描画する」の記事では、「myEffect2.fx」という名前のファイルを追加して、記事中で解説されているシェーダのコードをこちらに記載し、実行ファイルと同じ場所に置いてやればOKです。

という訳でとりあえず三角形の描画ができました!

f:id:moko_03_25:20190108171148j:plain

 

OpenTKを使う方法


OpenTK(Open Toolkit Library)は C#OpenGL を使うためのラッパーだそうです。
こちらもNuGetからインストールするので良いようです。

Index | #region OpenTK

 OpenTKの使い方をかなり多岐に渡って解説されています。
 Windowsフォームに組み込む際に関しての解説もあります。

MonoGameを使う方法

 

MonoGame

 C#で記述できてDirectXを扱い易くしたというXNAは終了しましたが、マイクロソフト自身がXNAを移植したものがMonoGameだそうで、XNAのコードがほぼそのまま動くそうです。

 ちなみにこの記事を書いた2019.1.13 時点では、公式サイトでDLできる最新バージョンは 3.7.1 で、インストーラーにVisual Studio 2017のTemplateが含れていました。

MonoGameで2Dゲームを作る(前書き) - Qiita
MonoGame入門Ⅰ - Qiita
MonoGame で 3D 描画 - Qiita

 MonoGame自体の解説が少なそうですが、XNAのサンプルが活用できるようなのでそのあたりでカバーできて良いかも知れません。

かんたんXNA4.0 (XNA入門)|Memeplexes

 SlimDXの項目でもリンクを貼っていますが、こちらではXNAも豊富に解説されています。
 ただMonoGameだとすんなり画像が読めないなどあるのでこちらを参考にしてうまくいきました。

ActiVizを使う方法


Kitware - Experts in Visualization Technologies and Image Processing
VTK - The Visualization Toolkit

 ActiVizC# で VTK(The Visualization ToolKit)を使うためのラッパーだそうです。
 こちらもNuGetからインストールするので良いようです。

C#で3Dモデル表示(VTKのC#ラッパActiVizによる方法) - whoopsidaisies's diary

SharpDXを使う方法


C# de げぇむプログラマー - SharpDX(DirectX) Top

C# ハイトマップからノーマルマップを生成してみた

C#による画像処理の練習がてら、ハイトマップからノーマルマップの生成を試してみました。
プルダウンで選んでいる数字が高いほど法線の傾斜が緩くなっています。

f:id:moko_03_25:20190107013038g:plain

こちらをざっくりと解説してみます。

続きを読む

使用条件 / 免責事項

作者 / 著作権


moko

動作確認済みのOS


Windows7(64bit)/ Windows10(64bit)

使用条件


商用・非商用に関わらず(プライベートでもお仕事でも)ご自由にお使いください。

配布条件


作者の許可無く、本ソフトウェアを複製・第三者に配布しないでください。

免責事項


本ソフトウェアは予告なく機能を変更することがあります。
本ソフトウェアは動作環境を満たす全ての環境で正常に動作することを期待していますが、保証はできません。
本ソフトウェアの使用により生じたいかなる損害に関して、作者は一切の責任を負いません。

問い合わせ先


不具合やご質問などのお問い合わせは、Twitterの作者のアカウントまたはメールアドレスまでお願いします。

https://twitter.com/moko_03_25
moko.vfx@gmail.com

Q&A

『TaskQuest』の機能について


Q:アンドゥー / リドゥー は無いの?

A:残念ながらありません

Q:タスクを親子関係にしたい

A:残念ながらできません

Q:1つのプロジェクトを複数人で共有したいけどできる?

A:SaveData.txt の複数人の同時編集に対応していないため、残念ながらできません

※随時追加していきます
 Twitterやメールでもお気軽にご質問くださいっ
 また、不具合が起こった際にもお知らせいただけるとありがたいです!

保存ファイル

『TaskQuest』から出力される保存ファイルの種類


本アプリでは「保存」が実行された際に、プロジェクトのセーブデータ(タスクリストの情報)・アプリの設定情報・キャラクターのステータス情報をテキストファイルで出力します。

f:id:moko_03_25:20181228174012p:plain

 

プロジェクトのセーブデータについて


3つのプロジェクトをそれぞれ「SaveData0.txt」~「SaveData2.txt」のファイル名で保存します。

ロード画面」で保存先を変えることができますが、デフォルト設定であるアプリ本体と同じ場所から変えない方がトラブルが起こりにくいためおすすめです。

テキストファイルの中身はタスクリストの情報で、CSVのようにカンマ区切りで保存します。

f:id:moko_03_25:20181228224843p:plain

もしもタスクの情報としてカンマが使われていた場合、デフォルトでは <Comma> に置き換わります。同様に改行が使われていた場合、デフォルトでは <br> に置き換わります。

アプリの設定情報について


本アプリの設定情報を「Settings.txt」のファイル名で保存します。

テキストエディタで開いて編集することが可能ですが、書式が崩れると正常に読み込めなくなるので慎重に編集するようお願いします。
※アプリ起動時にファイルが読めない場合は「ようこそ画面」から開始します
 ですが全ての項目は設定し直すことができるため、大きなダメージにはなりません

アプリ起動時にウインドウが画面外に移動してしまったような場合には、「Setting.txt」内のウインドウの座標の記述を編集するか、または「Settings.txt」を削除して再起動すると良いです。

「Setting.txt」内の具体的な説明についてはこちらのページにまとめています。

キャラクターのステータス情報について


キャラクターのステータス情報などを「Status.dat」のファイル名で保存します。

中身は暗号化していますが、絶対に編集しないようにしてください。

f:id:moko_03_25:20181228225038p:plain

また、ファイルを別の場所に移動しないようにご注意ください。
アプリ起動時にファイルが読めない場合は、キャラクターが初期状態で開始してしまいます。

これら保存ファイルが出力されるタイミング


以下のタイミングで出力されます。

・手動セーブ時(タスクリスト上で Ctrl + S)
・オートセーブ時(オプション画面で設定している場合)
・ロード画面でOKを押した時
・アプリ終了時


特に「ロード画面でOKを押した時」「アプリ終了時」は必ず保存されるためご注意ください。
※もしもうっかり操作ミスをしてタスクリストを変更してしまった際などに保存せずに終了したい場合は、お手数ですがWindowsのタスクマネージャーを起動してプロセスタブで『TaskQuest.exe』を終了させてください

「Settings.txt」の内容説明

『TaskQuest』のアプリ自体の設定情報を保存している「Settings.txt」内の各設定項目は下記のようになっています。

[Path] セーブデータの保存先(基本はデフォルトの空白がおすすめ)

[PJ S] 現在のプロジェクト番号(0~2)
[PJ 1] セーブデータ1のプロジェクト名
[PJ 2] セーブデータ2のプロジェクト名
[PJ 3] セーブデータ3のプロジェクト名

[<br>] タスク編集画面の詳細パネル内で改行を表す記号
[ , ] タスク内の文字列内でカンマを表す記号

[MaiR] アプリのメインカラー R値
[MaiG] アプリのメインカラー G値
[MaiB] アプリのメインカラー B値

[DonR] 経験値取得済みタスクの背景色 R値
[DonG] 経験値取得済みタスクの背景色 G値
[DonB] 経験値取得済みタスクの背景色 B値

[PosX] アプリ起動時の位置 X座標
[PosY] アプリ起動時の位置 Y座標
[SizX] アプリ起動時のウインドウサイズ 幅
[SizY] アプリ起動時のウインドウサイズ 高さ
[Si2X] タスク編集画面のウインドウサイズ 幅
[Si2Y] タスク編集画面のウインドウサイズ 高さ

[Unit] 工数の単位(0~2)

[LNo ] 列「No」を表示するか(True / False)
[LCtg] 列「カテゴリ」を表示するか(True / False)
[LCnt] 列「内容」を表示するか(True / False)
[LPri] 列「優先度」を表示するか(True / False)
[LSta] 列「進捗」を表示するか(True / False)
[LHo ] 列「工数」を表示するか(True / False)
[LHoR] 列「実工数」を表示するか(True / False)
[LDAd] 列「登録日」を表示するか(True / False)
[LDDn] 列「完了日」を表示するか(True / False)

[MsEr] 工数の入力エラーを表示するか(True / False)
[Wrap] タスク編集画面の詳細パネル内での折り返し表示(True / False)
[MsDn] 経験値取得演出の表示(True / False)
[FViw] 最前面表示 ※未実装
[TTip] ツールチップの表示 ※未実装
[ASav] オートセーブの間隔(0~3)
[ABak] オートバックアップの間隔(0~2)
[PBak] 前回のバックアップ日時(西暦月日時分の12桁の数字)

[HigR] 優先度の列が「高」の場合の背景色 R値
[HigG] 優先度の列が「高」の場合の背景色 G値
[HigB] 優先度の列が「高」の場合の背景色 B値

[MidR] 優先度の列が「中」の場合の背景色 R値
[MidG] 優先度の列が「中」の場合の背景色 G値
[MidB] 優先度の列が「中」の場合の背景色 B値

[LowR] 優先度の列が「低」の場合の背景色 R値
[LowG] 優先度の列が「低」の場合の背景色 G値
[LowB] 優先度の列が「低」の場合の背景色 B値


ここでしか設定できない項目は「改行記号」「カンマ記号」「優先度の列の背景色」になっています。

キャラクターの成長

キャラクターの情報


メイン画面の右上に、キャラクターの「レベル」「ジョブ」「経験値」「次のレベルまでの経験値バー」「名前」「ジョブのドット絵」が表示されます。

f:id:moko_03_25:20181228170808p:plain

またキャラクターのドット絵をクリックすると「ステータス画面」が表示され、現在のステータスが確認できます。「見積もり精度」は0に近いほど精度が高いことを表します。

f:id:moko_03_25:20181228171130p:plain

「ステータス画面」左下のジョブ図鑑ボタンを押すと「ジョブ図鑑」が表示されます。
新しいジョブにチェンジすると、こちらのドット絵もオープンします。
コンプリートすると良いことが‥!?

f:id:moko_03_25:20181228171136p:plain

 

経験値の入るタイミング


タスクを追加・複製すると経験値が少し入り、逆に削除するとその分経験値が引かれます。

また、タスク完了時には工数に合わせて経験値が入ります。
工数の単位が「日」になっていれば「時間」の8倍の経験値(1日8時間換算)が‥
「週」になっていれば40倍の経験値(週5営業日換算)が入ります。

タスクを完了して経験値取得済みになるとそのタスクはグレー表示になります。
※色は「オプション画面」で変更可能です

f:id:moko_03_25:20181228172529p:plain

本アプリでは、工数の見積もりと実工数を入力する前提になっています。
キャラクターを早く成長させたい場合は、なるべく入力するようにしてみてください。

また、作者はタスク管理時にはタスクの大きさをなるべく細かくすることを推奨しており、本アプリでもタスクを細かく登録して完了していく方が経験値取得の上でとてもお得です。

 

各ジョブの取得条件について


どのようなジョブになるかはレベルアップ時のステータスで決まりますが、Lv10以上で下級ジョブ・Lv20以上で中級ジョブ・Lv30以上で上級ジョブが解放されます。

ただし上級ジョブは一定以上の「かしこさ」と「見積もり精度」が必要です。
「かしこさ」は見積もり精度が高いと上がりやすいです。

新しいジョブにチェンジした際には、Twitterにスナップショットを投稿してくださったりすると作者が喜びます!

オプション画面

オプション画面の開き方


オプションボタンを押すと、本アプリの各種設定が可能な「オプション画面」が開きます。

f:id:moko_03_25:20181228164531p:plain

 

オプション画面の各設定


こちらでは、名前や工数の単位の変更、表示する列の指定などができます。
まず最初にオートセーブバックアップの間隔を確認してみてください。

各項目にマウスカーソルを置いて少し待つとヘルプが表示されるので、詳しい説明はそちらをご覧いただければと思います。

f:id:moko_03_25:20181228165129p:plain

 

アプリ情報


「オプション画面」左下のアプリ情報ボタンを押すと、作者のtwitterや当ブログURL・バージョン情報・メールアドレスなどが表示されます。

もし不具合など見つけられたらtwitterやメールにてご報告いただけると大変助かります!

f:id:moko_03_25:20181228165834p:plain

 

リストの操作 / ソート / フィルタ

リストの操作とショートカット


タスクリスト上ではエクセルと近い操作が可能になっています。

f:id:moko_03_25:20181228160025p:plain

十字キーで選択セルの移動

・セルを選択状態でクリック、またはF2キーで編集モードへ移行
 ※セルに文字を入力できる状態になります

・編集モード時にEnterで文字入力を確定して編集モードを終了
・編集モード時にEscで文字入力をキャンセルして編集モードを終了


また、リスト上では以下のようなショートカットが使用できます。

・Ctrl + A セルの全選択
・Ctrl + C 選択中のセルの値のクリップボードへのコピー
・Ctrl + V 選択中のセルに値をクリップボードからペースト

・Ctrl + テンキーの "+" リストを新規追加
・Ctrl + D 選択しているリストを複製
・Ctrl + E 編集画面を開く(セルをダブルクリックでも可能)
・Ctrl + S タスクリストやツール設定等のデータを保存
・Delete 選択しているリストの削除

・Ctrl + PageUp / PageDown フィルタの切り替え

 

複数セルの同時編集


複数のセルを選択しておいて、一括で文字を入力することができます。
※ただし元々編集ができない「No」「優先度」「進捗」には反映されません

f:id:moko_03_25:20181228161947g:plain

また、クリップボードから複数選択したセルに一括ペーストすることも可能です。
こちらは「優先度」「進捗」の列に対しても可能です!

f:id:moko_03_25:20181228161957g:plain

 

タスクのソート


列ヘッダーをクリックすると、その列の内容でソートができます(クリックする度に 昇順ソートと降順ソートがトグルします)。

f:id:moko_03_25:20181228163742g:plain

 

タスクのフィルタリング


タスクリスト上部のタブをクリックすると「進捗」の内容でフィルタリングすることが可能です。
普段は「完了以外」でフィルタした状態でタスク管理すると便利です。

f:id:moko_03_25:20181228162716g:plain