トップページgamedev
1001コメント599KB

タスクシステム総合スレ part3

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名前は開発中のものです。2008/11/09(日) 11:51:40ID:+pjnJyQQ
タスクシステムについての議論、相談、質問、雑談などのスレです

part2 http://pc11.2ch.net/test/read.cgi/gamedev/1196711513/
part1 http://pc11.2ch.net/test/read.cgi/gamedev/1173708588/
0907名前は開発中のものです。2009/01/31(土) 21:14:54ID:8N26Dxd2
>>901
Thanks!
なぜド素人くさいと言ったか分かった。あなたはSceneについてのみ話している。
私はゲームオブジェクトについてのみ話している。そこがまず違う。

まずupdate()という名前のメソッド群があったらそれらを抽象化してまとめて扱いたくなるのは当然。
でもupdate()に引数付けただけの段階ではまだ途中なんだよ。その次の段階に進むことでうまみが出る。
次の段階というのはupdate()を複数のメソッドに分割できるようになること。
つまり
 update(jiki, teki, tama, unko);
は下のように分割できる。
 Jiki::hit_check();
 Jiki::set_hp();
 Jiki::get_hp();
 Teki::get_hit_area();
 Teki::get_attack_point();
 Tama::get_hit_area();
 Tama::get_attack_point();
 ...
それらをこうやって使う。
 foreach t (teki) {
   if (jiki.hit_check(t.get_hit_area())) {
     jiki.set_hp(jiki.get_hp() - t.get_attack_point());
   }
 }
(続く)
0908名前は開発中のものです。2009/01/31(土) 21:21:41ID:8N26Dxd2
(続き)
最後にSceneと統合すると
 SceneXXX::update(void) { ←タスクはシーンだけ
   foreach t (teki) {
     if (jiki.hit_check(t.get_hit_area())) {
       jiki.set_hp(jiki.get_hp() - t.get_attack_point());
     }
   }
   foreach t (teki_tama) {
     if (jiki.hit_check(t.get_hit_area())) {
       jiki.set_hp(jiki.get_hp() - t.get_attack_point());
     }
   }
   ...
 }
こうなる。
Scene::update(void) は >>886 >>887 みたいなやり方で実装するのはアリ。
というかむしろそうしないと確かに「ド素人くさい」。ただそれはSceneにおいての話。

ゲームオブジェクトはSceneとは別枠で扱うべき。つまりゲームオブジェクトはタスクにすべきでない。
理由はゲームオブジェクト間は通信が多いので引数渡しを使用可能としたいため。
タスクでは引数渡しができないのが嫌。

私がupdate()で引数扱えるようにした方がいいって思ってるのはゲームオブジェクトについての話。
ただ、update()という名前で引数を扱うのはタスクシステムを脱出する過程で現れる過渡的、一時的な姿。
複数のメソッドに分割された後はupdate()なんて名前は消えてなくなる(たまたま別の意味付けで残ることはありえるけど)。

Sceneはタスクで良いのでupdate(void)で構わないが、
ゲームオブジェクトはタスクにすべきではないので(過渡的な姿という意味で)update(jiki,teki,tama,unko); が良い。
レス数が900を超えています。1000を超えると表示できなくなるよ。