TaskQuest「TaskQuest」をどんな感じで作っていったか軽くまとめておきたいと思います。(新)制作の動機これまでちょっとしたタスク管理を個人的に行う際に、メモ帳などのテキストエディタで行ったり、エクセルで行ったり、アナログな付箋紙で行ったりしていましたが、どれも不便に感じていました。テキストエディタだと、進行中のタスクや完了したタスクのグループ分けを手作業でやるというのは非効率すぎます。エクセルのソートやフィルタでそのあたりは吸収できますが、以下のような不満があります。こちらはVBAでボタン作ったりすればフォローできますねそこで「Backlog」のようなすっきりしたルックでWindows用のスタンドアローンなツールがあればなあと思っていました(Webベースだと個人でラフに使う分には、リストのコピペなどレスポンス良くできずあまり好みでは無いので)。C#でWindowsフォームアプリを作るようになってからは、タスク管理アプリも「いつか作りたいな」といった感じで制作候補の1つになっていました。ちなみに、ドット絵のキャラが成長する要素は最初から入れたいと思っていました。「Yahoo!知恵袋」でもスコアを稼いでグレードを上げていくようなシステムが入っていますが、こういったゲーミフィケーション的な要素は世の中の色んなものに入っていて欲しいと昔から思っていたので、タスク管理を楽しくするためにも欲しい機能だなあと。制作開始したきっかけとは言え、Windowsフォームで使えるコントロール(ボタンやリストなどのGUIパーツ)を使ってどうしたら再現できるのか悩んでいました。デスクトップアプリ入門」の家計簿アプリをあらためてなぞってみた際に「家計簿アプリのアレンジでいける!」と思って、具体的にアプリの中身を考え始めました。草案みたいなものスマホのメモアプリに最初にざーっと必要な要件を書き出したのがこちらです(長い!)。実工数を付け忘れそうタスクが終わったら完了にする流れはこの方が習慣付けやすいかも。基本ジョブが全て埋まると勲章アイコンが画面に付く全ジョブが埋まるとマスターアイコンが画面に付く◆リリース方法Booth500円でどうかGUMROADお値段を決めて買ってもらうサービス簡単な1ページ説明書おまけでメイキングPDF付ける?ざっと見ても分かる通り、タスク管理としての機能よりもキャラ成長要素の仕様をどうするかのメモの方が多いです。ちなみに、大体のRPGではレベルが上がるほどに必要な経験値が増えますが、タスクから得られる経験値が一定なのと、使用して月日が経つほどにレベルアップの頻度が落ちていくのは寂しいと思い、レベルが上がっていってもある程度一定のペースで上がり続けていくバランスに落とし込みました。Wizardryのようにレベル1000とか上がってもいいじゃない。Ogre」「FF」あたりが混ざっています。忍者とかロードとか入れたいですよね!それからオミットとなったアイデアも色々とあります。TaskQuestというからにはタスクも敵キャラとしてドット絵を用意して戦闘画面風の演出を入れたかったりはしましたが、「完成がかなり遠のきそうだ」と思って諦めました。こちらが、上記メモを書いていた時のツイートです。タスク管理アプリに着手し始めた。大体イメージができてきたので今は経験値とレベルアップの仕組みを考え始めていてとても楽しい。2018制作開始!まずはコントロールを配置しながら大枠のデザインを決めて、エクセルの表のような「DataGridView」というコントロールに、タスクを登録できるところまで実装しました。2018会社から帰宅したら作るという感じで1週間ほどすると根幹となる機能は入りましたが、まだまだ実装を予定している機能が大量にあり、また色んな不具合や不便な要素に困っている状態でした。タスク管理アプリ作成の残りタスクを作りかけバージョンで管理するの巻。行数が増えてくるとDataGridViewのスクロール表示がややチラつくのに涙。ダブルバッファが有効ということで入れてみたら少し改善されたけど、中のデータはList<T>で独自仕様にした方が速いっぽい。2018成長要素の導入とクラス分け1つのCSファイルにズラズラっと全ての変数や関数を書いていると可読性が下がり大変になってきたので、クラス分けの先駆けとして「ツール設定を管理するクラス」「キャラのステータスを管理するクラス」を用意して移し換えました。経験値取得とレベルアップとジョブチェンジのベースは完成!ジョブのドット絵を用意して差し替え表示が入れば粗方の体裁は整う。2018実はここで初めて「プロパティ」を試しました。プロパティという単語自体はアーティストでも色んなツールを使う上で普段から慣れ親しんでいるものですが、プログラム初心者の身からすると変数と何が違うのかよく分からない訳です。使ってみようと(結局、クラス内で変数のようにしか扱っていないので変数で良かったかなという感じではありますが)。この頃、C#を触り始めて1年半ほどでツール制作にも徐々に慣れてきてはいましたが、仕事ではコーディングしないのであくまで趣味の範疇です。文法は知らないことばかりで初めて試すものも多く、また「構造体」「インターフェース」「デリゲート」など全く分からない状態でした。その時の気持ちはこちら。タスク管理アプリで今回初めて連想配列・参照渡し・white文・プロパティなど使ってみて、文法周りの知識はまだ全然よちよち歩き状態で。3Dソフトで例えると頂点掴んで移動と面にエッジを追加する2つの操作だけでモデリングしていたところに押し出しを覚えてこりゃ便利っていう状態に近いかなと。2018また設定を管理するようなクラスはアクセス修飾子をstaticにしてメモリに常駐させ、newしなくてもいつでもプロパティの中身を読み書きできるようにすると便利ということに気付いて、後から全てstaticに書き替えたりしました。それまでクラスのアクセス周りはよく分からずに困ることが多かったのですが、例えば子となる別のフォームから親となるメインフォームを制御したい場合に、メインフォーム自身をコンストラクタの引数として渡してあげたら可能だというのも今回の制作でようやく理解した感じです。それも「多分スマートではない方法なんだろうな」と思いつつ、他に方法を知らないのでとりあえずメインフォームやそれに属するコントロールを別のフォーム生成時にコンストラクタで渡すというのを非常に多用しています。下記のような成長要素を暫定で入れましたが、このようにメッセージボックスを表示するだけなら非常に楽です。後にちゃんとデザインした独自のフォームに表示させようとした際に中身が複雑になってかなり苦労しました。16種のジョブのドット絵完成っ。ネタバレになるので少しだけ。ジョブは「ベイビー」から始まり「見習い」を経て各種ジョブに変わっていきます。ステータスに応じたフィルタリングを入れましたがここでかなり躓き、データベース・DataSet・DataTableと、それらの値を表示するDataGridViewとのやり取りの基礎的なあたりを色々調べたりしました。表のフィルタ表示がようやく入りました。これだけのことが分からなくて結構調べるのに時間がかかってしまった。ブログにDataGridVIew関連の記事を5つほど備忘録としてアップしています。2018また、複数セルへの一括入力や一括ペーストにも対応しました。こちらは必須だろうと。DataGridViewのイベントを取得するタイミングが色々とあるものの、それぞれのタイミングで色んな問題が噴出し、不具合に悩まされることとなります。キャラステータス画面やオプション画面も入りました。いった縦横に自由に敷き詰めるレイアウトで画面を作ると、設定項目が1つ増減するだけでレイアウトに大きく影響するのであまりよく無いですね。色を選択するためのフォームを作ったり..初起動時の設定画面を作ったり..ジョブ図鑑を作りました。ジョブを新たに取得するごとにシルエットがオープンになる感じです。いったオマケ的な要素は、デザインするのは楽しいですが実装すること自体は単純なので面倒ですね。気分転換したい時にはドット絵を修正したりしていました。タスク完了>レベルアップ>ジョブチェンジの演出のためのフォームを作って差し替えましたが、RPGメッセージ風にテキストを表示するために同期&非同期処理について調べたり、GIFアニメ画像を載せたりするためにコントロールのレイヤー周りについて調べたりして結構大変でした。結局のところ「Windowsフォームは制約が多すぎて、コントロールに重なるようにビジュアル的な演出を入れるのには向かない」という結論に達し、ここは色々と割り切りました。作ったイメージ画像ですが、たったこれだけのこと(コントロールにまたがるようにGIF画像を上に載せて表示する)ができないんですよね。いう訳で、着手を始めて1ヶ月ほどであらかたの機能が入りました。この後にも実行ファイルにアイコンを適用したり保存データを暗号化したり不具合を取り除いたりと、1ヶ月ほど追加でちょこちょこと作業はありましたが、大体の機能はこのあたりで入った感じです。優先度に応じた背景色を付けたので、これで予定していた大体の機能は入った!ちなみに全ジョブをコンプリートした際のちょっとしたおまけ要素も入ったものの、コンプリートが厳しいので別の条件で解放させたりと調整中。2018テストしてくれる方とslackでやり取り今回は当初より「販売する」というのが1つの試みでもあったので、不具合満載の商品をリリースする訳にもいきません。そこで会社の同僚やTwitterのフォロワーさんに何人かにテストをお願いして触ってもらい、不具合報告や要望などをいただきながら開発を進めていました。ありがたいことにTwitterですぐにお声掛けをいただき、slackで専用のプロジェクトを用意してそこでやり取りさせていただきました。最新の実行ファイルもどんどんアップしていけますし、とても便利でした。分からない時にどうしたのか大体はココナラで有料で質問して解決しています。Takayama」さんになります。sw(@Callisto_n)さんに泣き付いて、勉強会の帰りにカフェで不具合を見つけていただいたのですが、その際にソースコードをざっと見渡して改善ポイントまで教えていただいたりしました(swさんその節はありがとうございました..!)。諦めたこと一番大きいところでは、複数人でのタスク管理です。「TaskQuest」はあくまで個人のちょっとしたタスク管理を想定しているため、お仕事で使うには正直厳しいと思っています。複数人で1つのプロジェクトを同時編集したいと思った場合には、恐らく以下のようなあたりの実装が必要なのかなと..。こちらは今の自分には厳しいと思って諦めました。・複数アカウントの同時編集の仕組みこちらに関しては「Googleスプレッドシートなど元からクラウド上で複数人の編集が可能になっているサービスを利用すれば楽にできるのでは?」というアドバイスをいただいたことがあり、それならもしかしたら手軽にいけたりするんでしょうか。機会があれば試してみたいです。次に、スマホアプリとしてのリリースです。こちらは「Xamarin」とか使う感じでしょうか。軽く調べた感じでは面白そうではあるのですが、今の自分にはまだまだ敷居が高そうな印象がありました。そのうち試してみたくはあります。それから、アンドゥとリドゥの実装。Qiitaこちらで概念から解説されていて「これは今の自分には無理だ」と即諦めました。リストと複数セルの選択ができるのだから、複数行を一括削除もしたいものと思います。これはアンドゥとリドゥが実装されている前提になると思いました。うっかりミスで複数行を削除してしまった場合に悲劇となります。こちらも同時に諦めました。全タスクの文字列の検索・フィルタリング・置換データベースとDataGridViewの理解が怪しいため不具合の温床になりそうで諦めました。販売してみる今回は自分が作ったプログラムを初めて販売してみました。世の中に非常に優秀なフリーソフトが大量にあることは勿論知っていますし、例え50円や100円のお値段設定だとしてもクレジットカード決済やコンビニ振り込み等のハードルから触ってもらえる機会が大幅に失われるだろうと思いましたし、「素人が作った不出来なものを売って良いのか?」という自問もありましたが、「どれくらいの人に買ってもらえるのだろう?」という純粋な興味が大きくありました。目標としては40人の方にご購入いただいて2万円を売り上げることです。すれば、C#関連書籍の購入とココナラの取り引きの費用などを回収できる感じです。現在リリース10日ほどで18本売れたので、このまま40本達成できたら嬉しいなという感じです。Formの主なプロパティよく忘れるのでメモ。)連絡先moko.vfx★gmail.comお気軽にご連絡くださいはてなブログをはじめよう!moko_03_25さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。