C#とYaneSDKでゲームを作る(3)
第3回です。TaskSystemについての勉強。
理論から足場を堅めていくと気がついたら大抵寝てるので、
netにあるsampleを脳を殺して書いてみて、ジンワリと理解することにしました。
参考にしたのは
どらさん(http://d.hatena.ne.jp/xatm092dora/20060412)
akirameiさん(http://d.hatena.ne.jp/akiramei/20060411/p1)
のエントリです。
ひとまずこのソース読んで前回の疑問を埋めることにします。
描画は誰がやるのか
メインループでタスクの値を参考にして描画するのか、 それともタスクそれ自身がBLTとかするのか?
と言う疑問でしたが、御二方のコード見る限り、どちらでも行けそうです。
前者の方法は、どらさんがなさってたみたいです。
Task自体が値を外部に見せられるようにgetterを設定すれば良いようです。そりゃそうだ・・・俺はアホか・・。
TaskInfoを上手く利用するというコメントもコード内にありましたが、
こちらはちょっとまだよく分からないので要調査です。
後者の方法は、akirameiさんがなさっていた方法で、
やねさんのツッコミを考慮に入れた上で実装すると、
gameInfoにIsDrawのboolを持たせておいて、移動計算で1回、
描画時にもう一回TaskLoaderからCallすれば良いようです。
個人的には前者の方法が分かりやすかったので、そちらで実装してみようと思います。
Task間の通信はどうするのか
Taskの保持情報の参照が上手くいかなかった。 そもそもTaskSystemの記法がよく分かっていない気がする。 とりあえず動くtaskSystemで実験してみる
これは上でも書きましたが
Taskもクラス(オブジェクト)であることを完全に理解していないせいで、生まれた疑問でした。
クラス内にgetter用意すれば余裕で参照可能。
あとは記法についてですが、TaskSystemの実コードに寄った理解は
- TaskSystemの頂点にはTaskControllerがあり、個々のTaskBaseをそこにAdd<<これが基本
- Taskを進めるには、TaskController.Call(object)を使う
- SceneControllerもTaskControllerへAddするというTaskBaseの
仲魔仲間。 - SceneControllerは状態遷移を表すのに使える。遷移の管理はTaskFactoryに記述、またScene自体はTaskBaseである。
- タスクの生成時にプライオリティの設定が必要であるが、これは生成する側が管理すべきであろう。
とまぁこんな程度です。。大丈夫かな・・・。
またCall時になぜobjectを渡す必要があるのか?と言う疑問があります。
もうちょっと落ち着いたらYaneSDKのドキュメント読み返して理解を深めたいです。
とりあえずCallが分かっただけで、脳が死んだ状態でもTaskSystem何とか使えそうだ!
プライオリティの設定はどうするのか
Taskを一意に特定するために一意のプライオリティを与えるのはよいが、 あるまとまり(弾全体、敵全体)の状態を得るにはどうすればよいのだろうか? そもそも別種のTaskは同じtaskControllerに入れない方がよいのか?
うーん。
これは時と場合による、と言うのが今の僕の解答です。勘ですが。(勘かよ!)
サンプルを見る限りでは
シーン遷移0-9
敵機だったら10-49
敵弾50-249
自弾250-300
のようにプライオリティの割り当て空間をあらかじめ決めておいて、
プライオリティを元に、一意のTaskに問い合わせて情報を受けたりしてました。
これも良いと思いますが、
それぞれの割り当て空間からどのTaskがoutしたのか(プライオリティNOが空いているのか)の探索方法が
結構泥臭くなりそうです。
なんか想像してたのは敵機のプライオリティを10とか一意の数値にして
ボム発動時にTaskControllerから一斉にプライオリティ10のTaskをout!はy−
って勝手な想像してたんですが・・・・。違うのかな?
とりあえずプライオリティを使ってTaskを一意に特定する、ってのはまだ疑問です。ギモンギモン!
何かそういうメソッドか何かあると思うんだけど・・・・。引き続き調査です。
TaskControllerは1つでよいのか?
自機、敵機、弾)それぞれ種類ごとタスクコントローラーを分割した方がよい? それだと管理が複雑になるのであり得ないと思うけど・・・
TaskControllerを複数にすることは可能と思われます。
管理が複雑になるかどうかは、多分複雑にはならないと思います。勘ですが。(またかよ!)
種別にTaskControllerを設定して、
上でも出たプライオリティ値での探索等がましになると思う。
(;´Д`).。o(きっと理解が進んだ後で見たら全然勘違いしてることが分かるんだろうナァ・・・・)
タスクの実行と停止
タスクをいつ始めるのか。実験としてシーンコントローラーを使ってみる。 最もシンプルなタスクシステムは?
サンプルでSceneControllerの重要性が分かりました。状態遷移ラクショー!はy−
シンプルなTaskSystemは
SceneControllerが登録してあるTaskControllerをMainLoopでCallしまくるとかです。
これはどらさんのソースが参考になりました。
fpsとタスクの関係
タスクはfpsTimerの制御下にあるのだろうか? 恐らくタスクの実行場所に寄るのではないかとも思うが・・・
どうもこの疑問は、
「TaskSystemとは勝手にThreadが立って、登録してあるTaskが延々とCallされてるものを言うのかなぁ」
とか勘違いしていたための産物です。
概念としてのTaskSystemとThreadをごっちゃにしてますね。
1回Callすると1回Taskが呼ばれると言うことです。fpsの影響はちゃんと受けますよ!
中間報告
とりあえず今の知識はこんなとこです。
ちと不安はありますが、
次回は何とかC#ゲームプログラミングのShootingサンプルを書き直して動かすとこまで行きたいです。
EnjoyYaneSDK!