ゲームにおけるデータ構造・クラス設計・パターン
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2006/08/10(木) 20:27:06ID:BnvyxuCBどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0602名前は開発中のものです。
2007/09/21(金) 22:17:12ID:RhYk6YdFスマートポインタ・pimplイディオムあたりも、そのまま図にすると冗長で
ワケわかめ。
0603名前は開発中のものです。
2007/09/23(日) 23:05:37ID:7hC9eV3oとか言ってみて良い?
実際javaでGCが必要になるケースって言語実装する場合だけど、javaのGCに投げれば良いだけだし。
0604名前は開発中のものです。
2007/09/23(日) 23:32:34ID:/EvVKbRp0605名前は開発中のものです。
2007/09/24(月) 00:13:37ID:5E4o0Iyz文面見るだけだと、集約とコンポジションの区別がつかんけどな。関連との区別も
つかないし。
0606名前は開発中のものです。
2007/09/24(月) 00:36:17ID:N33NsFp0CでもC++でもライブラリでGC使えるようになるよ
とか言ってみて良い?
デストラクタのタイミングがJavaだと曖昧だから、
確実に呼ぶためには明示的に呼び出す必要あるよね
とか言ってみて良い?
0607名前は開発中のものです。
2007/09/24(月) 00:38:43ID:wP3VhiV80608名前は開発中のものです。
2007/09/25(火) 01:43:17ID:cUqDGz0b0609名前は開発中のものです。
2007/09/25(火) 01:59:20ID:Ubo+pWpIアーーーー!!
0610名前は開発中のものです。
2007/09/25(火) 02:50:51ID:j6V698Nyと思って調べてみたら、やはりけっこう面倒になことなっているようですね。
ttp://kikyou.info/diary/?200603
C++でGCをするのは、やはりリスクは大きいんでしょうかね。
挙動をきちんと把握していないと、余計なバグを出しまくると。
0611名前は開発中のものです。
2007/09/25(火) 07:15:30ID:p/ZTpO6Sというか誰のコードが入るか分からんOSSにはBohemGCは向いてないと思う。
0612名前は開発中のものです。
2007/09/25(火) 14:42:50ID:IK+Mi4/+> そもそも呼ばれるか呼ばれないかすら信用できなくなるというのは痛いです。
これってBohemGCというか、
JavaでもC#でも似たような問題抱えてるような気が。
C#はusingでだいぶ良くなる(というか必須)けどね。
0613名前は開発中のものです。
2007/09/25(火) 15:49:03ID:j6V698Nystd::auto_ptrやboost::scoped_ptrが使えるのでは。
まあこの当たりのスコープによる廃棄を使えるのは、データ構造でなくその
呼び出し側のほうになるとは思いますが。
データ構造の内側たるメンバ変数では、結局いポインタwをを使おうとすると、
やはりGCかスマートポインタが(r
0614名前は開発中のものです。
2007/09/25(火) 19:45:25ID:w6OvpTgu0615名前は開発中のものです。
2007/09/25(火) 23:37:49ID:k19pdkx7全然右往左往はしてないので、BohemGCは向いていると思うよ
0616名前は開発中のものです。
2007/09/26(水) 02:49:14ID:9IVyIRI7java6からはそこらへんもVMの仕事だな。
>>615
一時期、他のコードとの相性で苦戦してただろ。
というか吉里吉里は実質一人開発なのでバザールモデル開発時の問題は無縁かも知れん、
がソースを公開してるので誰がどう使うか分からないのでBohemGCは向いてないだろ。
0617名前は開発中のものです。
2007/09/26(水) 04:16:25ID:PN2WWo+U?
0618名前は開発中のものです。
2007/09/26(水) 07:07:41ID:i8F3qiykよく知らないんだけど、BohemGC特有の問題ってなんなの?
>>812はBohemGCだけの問題では無いよ。
0619名前は開発中のものです。
2007/09/26(水) 08:13:44ID:3isC6Gy4w3m も BohemGC 使ってなかったっけ?
俺は C++ だとスマートポインタで十分なケースが多いので、BohemGC は
まず使わないけど。
0620名前は開発中のものです。
2007/09/27(木) 02:23:21ID:+pE/2Wnlほら、言い直した。
「一時期問題があった」だろ?
それなのに>>610-611で2006年から今もずっと右往左往してるかのような印象操作をして、
BohemGCがOSSに向いてないとか、そんな詭弁はやめろ。
お前が古い人間で、よく理解出来ていないガベージコレクションが嫌いなだけなんだろ?
>ソースを公開してるので誰がどう使うか分からないのでBohemGCは向いてない
これとかまったく意味不明。
boostのshared_ptrでも、まったく理解しないで使うと罠がある。
そういう仕組みをまったく使わないで、手作業で開放しても罠がある。
お前の論では、ナニをやろうが向いていないんだよ。
>>619
スクリプト言語の作成は、スマートポインタだけだとしんどいと思う。
var a = [0];
a[0] = a;
これだけでメモリリーク起きるなんて、危なくて使えん。
0621名前は開発中のものです。
2007/09/27(木) 02:44:05ID:VvpaMtLQ技術は何かを実現する手段であって目的ではない
0622名前は開発中のものです。
2007/09/27(木) 07:51:02ID:N1wjX3wO0623名前は開発中のものです。
2007/09/27(木) 08:18:58ID:w2Fnc2yT> スクリプト言語の作成は、スマートポインタだけだとしんどいと思う。
スクリプト言語の仕様にもよるな。
PCのギャルゲーだとスクリプト言語自体をリッチな仕様にして、動的な
メモリ確保なども可能にする(文字列連結とか)場合もあるみたいだけど、
俺はスクリプトでは完全にコンパイル時にメモリ割り当てが確定しちゃう
ようにして、メモリやリソース管理は C/C++ 側のコードでプログラマが
責任を持って行うようにしてる。
スクリプタとプログラマの役割分担どうするかだが、スクリプタ大量投入
するタイプのプロジェクトだと、スクリプトの自由度を下げた方がバグの
発生頻度が小さくなって、結果的に ウマー なことが多いと思う。
0624名前は開発中のものです。
2007/09/27(木) 10:54:43ID:5M+6zylX吉里吉里信者?
0625名前は開発中のものです。
2007/09/27(木) 11:00:37ID:qVZI5NrD0626名前は開発中のものです。
2007/09/27(木) 11:33:55ID:ET62U43b0627名前は開発中のものです。
2007/09/27(木) 12:37:22ID:vs9qugjh0628名前は開発中のものです。
2007/09/27(木) 13:19:16ID:HGokK3wmでも最近少々荒れ気味だから皆落ち着け
0629名前は開発中のものです。
2007/09/27(木) 14:40:58ID:1l0/TfAT元々隔離板の過疎スレだから少数が騒ぐと目立つだけ。
またーりログ読んでるか、生温かい目で見守ってるのが大半じゃない?
0630名前は開発中のものです。
2007/09/27(木) 23:24:46ID:foTLrBw8古典的バカが未だに生き残ってるとは驚きだな
0631名前は開発中のものです。
2007/09/27(木) 23:31:57ID:n9Qt+CRZ0632名前は開発中のものです。
2007/09/27(木) 23:38:28ID:Kt0ma0Lg0633名前は開発中のものです。
2007/09/27(木) 23:47:44ID:CbY2cE68とりあえず、「必死だな」とか言う前に>>620を論破してみれば?
例えば、
1,BohemGCだけにある、もしくはJavaやC#のGCでは解決された重要な問題を列挙する
(数値とアドレス値が識別できないという問題はあるけど、確率的にそれが不都合になることはほとんどない)
2,吉里吉里にはBohemGCが向いていないことを示す他のソースを提示する
とかね。
個人的に1はとても興味があるので、問題があるなら教えて欲しかったりする。
0634名前は開発中のものです。
2007/09/27(木) 23:48:30ID:w2Fnc2yT本題からそれるけど、
> スクリプト言語の作成は、スマートポインタだけだとしんどいと思う。
> var a = [0];
> a[0] = a;
> これだけでメモリリーク起きるなんて、危なくて使えん。
スクリプト言語におけるインスタンスの寿命管理と、C++ インスタンスの寿命管理は
別の話だよね。
俺は VM のスタックは C++ のスタックを使わず、C++ で std::vector<> 使って確保した
記憶域を使ってる。でないとスクリプト一時中断する (co-routine 実装) のが難しい
からさ。
当然スタック上にあるスクリプト言語のインスタンスは全部 VM でトラッキングできる
ので、ガベコレできる。C++ 側のメモリ管理が GC 使ってるかどうかとは無関係に。
0635名前は開発中のものです。
2007/09/28(金) 00:02:16ID:qVZI5NrDようするに実装がスタックレスってことだな。
つかスタックレスでないVMにコルーチンを実装するのは不可能じゃないか?
0636名前は開発中のものです。
2007/09/28(金) 00:23:32ID:l1EYGW9S多少制約がつくけど、Cスタックを保存・切り替えできればスタックフル VM でも
コルーチンは実装できます。
ただ、どうやってもポータブルなコードにはならないし、C++ 例外の実装方法に
よっては問題出るから、お勧めしないけど。
0637名前は開発中のものです。
2007/09/28(金) 01:10:11ID:iJmhMBklスタック切り替えてまでやるかw
猛烈に処理系依存なコードになりそうだな
0638名前は開発中のものです。
2007/11/17(土) 17:10:37ID:iMK/PWngBattleManagerかな…でもManagerは使うなって話もあるし。
0639名前は開発中のものです。
2007/11/17(土) 17:27:39ID:tjJHhoDYManager 使うなって話は、つまり「管理」というあいまいな言葉を使うなって話。
「戦闘シーンの進行管理をするクラス」の役割を見直さずに名前付けだけ考えてても
無意味。
0640名前は開発中のものです。
2007/11/17(土) 17:45:31ID:iMK/PWngレスありがとう
そう、今プログラム素人の子と話してたんだけど、
漠然と「場」みたいなもので考えるから名づけに迷うんであって、
相撲の行司みたいなのがいると仮定して、
そいつに戦闘の進行管理をさせればいいんじゃない?
という意見をもらった。
そこでまた、「戦闘の進行」っていう、時間を伴ったものを、
その「行司」の中に持たせちゃっていいのかなと迷うんだけど、
その辺りは割り切っちゃったほうがいいの?
OOPド素人丸出しでごめん
0641名前は開発中のものです。
2007/11/17(土) 17:53:06ID:3LkIon8XそのManagerが関連する他のクラスに処理を分配して、それを仲介するようなクラスだとMediatorあたりになるんじゃなかろうか
俺が作ってた「Manager」は上記のものがさらにFacadeの役割も果たすってのが多かった
デザパタから借りてるだけで正解とはとても言えんけど、「Manager」よりはマシかな…と
0642名前は開発中のものです。
2007/11/17(土) 18:09:05ID:tjJHhoDY> そいつに戦闘の進行管理をさせればいいんじゃない?
それじゃ何も解決しないでしょ。「管理」という役割が同じなままなんだから。
「管理って、実際のところ何するの?」と問い、「あれして、これする」っていう
もっと具体的な単位に分解できれば、「あれするクラス」「これするクラス」に分割する
ことが考えられる。それらを組み合わせたものを「戦闘シーン」というクラスにすることも
考えられる。
どうしても「管理」としか呼べないんなら、それを Manager と名付けること自体には
何の問題も無い。
「戦闘の進行」と「行司」という切り分けができるなら、前者を Advance() なんていう
関数、後者を Rule とかいうクラスにすることが考えられる。 Advance() は Rule に
従って処理をする、って感じね。具体的な状況がわからないんで、全然ダメかも
しれないけど。
0643名前は開発中のものです。
2007/11/17(土) 18:34:11ID:2u92yTvZ0644名前は開発中のものです。
2007/11/17(土) 18:35:34ID:JxWacONa0645名前は開発中のものです。
2007/11/17(土) 20:30:54ID:/rbqSJ11{
public:
Referee(const class Rule& current_rule);
const bool judge(const class Battle& current_battle);
void bribe(const int price);
inline void win(void) { http://youtube.com/watch?v=ubhW9R-F7cM }
};
0646名前は開発中のものです。
2007/11/17(土) 21:45:56ID:K5pYaEDh?
0647名前は開発中のものです。
2007/11/18(日) 06:00:26ID:D4743XwF0648名前は開発中のものです。
2007/11/18(日) 07:27:13ID:mDvA2is2俺の場合、Manager って名前は使っちゃうな。ただし Manager クラスで
何でもかんでも処理せずに、分割できるところは別のクラスに切り出して
Manager クラスに集約する。
Facade やね。
0649名前は開発中のものです。
2007/11/20(火) 01:41:42ID:Xv2CgjLa2ループもすりゃ十分だろ
0650名前は開発中のものです。
2007/11/20(火) 02:00:34ID:B+/JlwAo何に対して言ってるのか
0651名前は開発中のものです。
2007/11/20(火) 06:51:02ID:x6OdnLNb0652名前は開発中のものです。
2007/11/24(土) 17:27:35ID:5kPj3Eca0653名前は開発中のものです。
2007/11/24(土) 17:36:40ID:BsLqDTe0一部同じインターフェースを持つことはあるだろうけど、普通に考えてまったく同じクラスに
なるとは思えない。
0654名前は開発中のものです。
2007/11/24(土) 19:10:43ID:XdMXhxj/0655名前は開発中のものです。
2007/11/24(土) 21:09:45ID:vFIasKerそりゃ、作るゲームにもよるな。キャラクター数少なくて差異が大きい場合には
クラス分けるが、RPG のように数が多いと基本1クラスでデータ駆動にする。
0656名前は開発中のものです。
2007/11/24(土) 22:25:37ID:Y480fdwm何シューティングか知らないが、
よくある2Dのシューティングなら自機と敵機で違う処理したほうが、
当たり判定の最適化しやすそうだな。
(同じ基底クラスから派生させるとかいう話はおいといて、
0657名前は開発中のものです。
2007/12/23(日) 16:09:31ID:zijTonf7がお勧め。
俺は、クラス志向でやってたら、敵、弾のクラスが200超えたあたりで、死んだ
0658名前は開発中のものです。
2007/12/23(日) 17:43:24ID:j05CibA3数の多さからの管理の複雑化という問題だとしたら、
データでもクラスでも一緒だと思うんだが。
0659名前は開発中のものです。
2007/12/23(日) 17:48:27ID:1bBLAr/Hコード中に書いてたんじゃね
0660名前は開発中のものです。
2007/12/23(日) 18:00:13ID:Uzvq0eJL0661名前は開発中のものです。
2007/12/23(日) 18:27:09ID:a745ZQah0662名前は開発中のものです。
2007/12/23(日) 20:45:04ID:5BsM8MRdhttp://www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=530
キャラクタークラスや技エフェクトクラスにも画像データを持たせたいのですが、描画処理クラスの下に
キャラクタークラスを置くべきでしょうか?それとも多重継承で描画処理クラスのデータを継承させたほうが良いでしょうか?
描画処理クラスでは画像のデータや実際に描画する関数など描画データを統合して持っています。
他にもこうした方がいいというところがあればお教え下さい。
よろしくお願いしますm(_ _)m
0663名前は開発中のものです。
2007/12/23(日) 21:13:08ID:sYkuqm1iキャラクタークラスがコピーする画像の種類、座標と大きさをパラメで持ってればいい
変数5個ぐらいだからあとはそれを描画クラスに渡して描画されるしくみがあればおk
エフェクト関係の位置が微妙に変だと思う
あれは継承?それとも集約(コンポジション)?
あと図の矢印が継承と集約混ざっててわかりにくす
あれが全部継承なら最初から作り直し
0664名前は開発中のものです。
2007/12/23(日) 21:20:38ID:zijTonf7そのとおり
で、途中からやばいことに気づいて(そら100もクラス作ってたら、気づくわw)
スクリプトで外に出したりしてたら、
かなーりカオスに・・・
0665名前は開発中のものです。
2007/12/23(日) 21:22:59ID:zijTonf7矢印の関係、向きがグチャグチャだなおいw
UML関連の入門記事をさらっと読んだ方が、いいよ
本まで買って厳密にやることはないが
0666名前は開発中のものです。
2007/12/23(日) 21:35:43ID:j05CibA3それのどこがやばいのかよく分からないなぁ。
>>664
本当に必要なものならクラス数は増えても良い気がするけど。
0667名前は開発中のものです。
2007/12/23(日) 21:38:17ID:1bBLAr/H派生クラスで全部書いちゃってもいけそうだな
0668名前は開発中のものです。
2007/12/23(日) 21:39:00ID:X8aN6eEVふつーは、プレイヤー弾クラス、敵弾クラスとか作って、そいつがパラメタを
ファイルから読み込む or スクリプト駆動にするわな。パラメタ変更では手に
負えないような差異がある場合(バラバラの弾とレーザーとか)は、そこを
クラスに切り出す。
どこまでプログラムで書いて、どこからスクリプト or データ駆動にするかは
センスの問題。何でもかんでもスクリプトで書くと、結局 C++ で書くより手間
かかるだけだしなw
0669名前は開発中のものです。
2007/12/23(日) 21:41:05ID:5BsM8MRd描画処理にキャラクターのデータを渡すだけでいいのですね。
図は全て継承の意で矢印を書いてしまいました。
継承と集約の相違点と関係を見直してもう一度はじめから考え直してみます。
>>665
確かに書き方が全く成っていませんね・・
ネットでUMLを説明してる所へ行ってみます!
ご指摘ありがとうございました。
大変ためになりました><
0670名前は開発中のものです。
2007/12/23(日) 21:42:05ID:4U1OUhJg一通りかじった方が良いと思うよ。そうしたら、何が悪いか見えてくる。
あと、基本的に継承しまくるのは良くない。継承よりも委譲で処理した方が
スッキリする場面が多い。
0671名前は開発中のものです。
2007/12/23(日) 21:44:24ID:X8aN6eEVまずゲーム上の意味を持たず、単純に描画関連の処理だけ行うクラスを作る。
3Dモデル、2Dスプライトとかな。
その上で、次に、3Dならモデルのモーション制御用のクラスと、2Dスプライトなら
テクスチャアニメーションや拡大縮小アニメーションなどを行うクラスを用意する。
最後に、ゲーム的に意味があるクラス(技エフェクトクラスとか)は、上記クラスの
インスタンスをメンバ変数に持たせて使う。間違っても継承するなよ。
0672名前は開発中のものです。
2007/12/23(日) 23:44:07ID:5BsM8MRd>>671
なんでもかんでも継承すればいいというわけではないのですね・・・
is-a関係とhas-a関係をよく確かめます。
ありがとうございました。
0673名前は開発中のものです。
2007/12/24(月) 01:50:39ID:EusYFrXZ慣れてくると悟れるようになるけど、
HogeHogeUtil
っていう名前にできるものはオブジェクトにしちゃいかんよ。
StringUtil、DBUtil、CSVUtil、DrawUtil、SpriteUtil、etcetc...
こういう「いつでもどこでも使う」ものは、本質的に
状態を持たない(=オブジェクトにはならない)もの。
これらはスタティックに関数を定義しておけばそれでOK。
初心者はここを勘違いして地獄を見ることになる。
ま、慣れてくれば分かるさ。
0674名前は開発中のものです。
2007/12/24(月) 03:14:08ID:vIQmZz28C#の拡張メソッドみたいなものはもっと以前からあって然るべきだった。
0675名前は開発中のものです。
2007/12/24(月) 08:33:00ID:IJjsYfw40676名前は開発中のものです。
2007/12/24(月) 13:19:10ID:1XlkQ3N6スクリプトでも下クラスでも同じだろ?
どっちに記述するかの問題だが
IDEサポートある環境ならクラスのほうが見通しやバグがへる
0677名前は開発中のものです。
2007/12/24(月) 13:28:54ID:XKsRO39k> スクリプトでも下クラスでも同じだろ?
スクリプトとかデータファイルだと、
1) 必要最小限のことしかできないように制限かけておく
2) 少ない記述量で済むようにする
から、量産するときに手間が減る。あとプログラマが一人で全部作る場合は
良いんだが、企画やスクリプタに調整してもらう場合は、開発環境そのまま
渡すのはいろいろコストが高くつく。
0678名前は開発中のものです。
2007/12/24(月) 13:38:18ID:z6srLKkd0679名前は開発中のものです。
2007/12/24(月) 14:26:45ID:1XlkQ3N6いや、データの一元管理をしたいならクラスにまとめてかいとけばいい
だからどこに書くかどうかという程度の問題だからかわらん
外部ファイルだと整合性が取れない場合とかそういうことも考慮しないと
0680名前は開発中のものです。
2007/12/24(月) 14:59:36ID:NAxUuQ7Pむしろ同人以上に仕事でやってるときのほうがソースの中とか見せたら危険すぎだね…
>>657
ま、そのくらいの規模になったらデータ化したほうがいいっすな。
0681名前は開発中のものです。
2007/12/24(月) 15:11:02ID:XKsRO39k> 外部ファイルだと整合性が取れない場合とかそういうことも考慮しないと
外部ファイルも事前にコンバートするから、そこで整合性担保するでしょ。
テキストで書いておいて、ツール使って実行時環境の構造体に直接マッピング
できる形に変換。実行時にテキストパーするなんて、エラーチェックの意味でも
実行効率の点でもありえんので。
開発効率に関してはたとえば、
ATK=100,THROUGH=1
とか書くのと、
struct Shot1 : IShot {
virtual int getAttackPoint() const { return 100; }
virtual bool canThrough() const { return true; }
};
とするのと、どっちが楽かって話だよな。プログラマならともかく、それ以外の人間に
後者はありえんと思う。
0682名前は開発中のものです。
2007/12/25(火) 00:11:32ID:AryQ9OX5その程度がかけない人を使う場合はツールつかうでしょ
0683名前は開発中のものです。
2007/12/25(火) 07:00:22ID:kU76M/LQ> 技術者以外でコードさわらせることってある?
ない。
人数増えると、開発環境をセットアップ・メンテナンスしたり、ソフトウェアの
ライセンス費用だけでも馬鹿にならんし。
0684名前は開発中のものです。
2007/12/27(木) 14:55:37ID:IZhCMn6zタスクシステムとか使うんでしょうか?
0685名前は開発中のものです。
2007/12/27(木) 18:41:38ID:WHA23eKGというかタスクシステムの話は荒れるからやめれ。
0686名前は開発中のものです。
2007/12/27(木) 18:43:32ID:AMPsIlOq単純に書くなら、プレイヤーとかエネミークラスのメンバ変数として状態変数を持たせる。
class Enemy
{
enum STATE { STATE_INIT, STATE_LOAD, STATE_ATTACK, STATE_DOWN } m_state;
public:
void exec() {
switch (m_state) {
case STATE_INIT:
// 必要な処理。状態遷移は m_state の値を上書きすることで行う。
break;
case STATE_LOAD:
break;
}
}
};
入退場動作を記述したいとか、状態遷移が複雑で手に負えなくなったら、
XML なり CSV なりで書いた状態遷移表から C++ のコードを自動生成する
トランスレータ書くとか、階層化状態をサポートするライブラリ (有名どころ
だと Boost Statechart とか) を入手して使う。
0687名前は開発中のものです。
2007/12/27(木) 18:51:03ID:68c9oLh7ゲームならこちらの方がいいかも
(state_chartと違ってコストがポインタ経由の関数呼び出しと同等程度)
0688名前は開発中のものです。
2007/12/29(土) 19:02:05ID:51LlsxT5こちらへどうぞ
タスクシステム総合スレ part2
http://pc11.2ch.net/test/read.cgi/gamedev/1196711513/
0689名前は開発中のものです。
2007/12/29(土) 19:05:56ID:51LlsxT5前に作ってたプロジェクトで、
30個くらい状態ができて、exec相当の関数が長くなりすぎ、
関数内関数にしたものの、死にそうに。
こういうときは、やっぱり、データ駆動にすべきなんかね
0690名前は開発中のものです。
2007/12/29(土) 20:33:51ID:V6gceCEb>>686の状態列挙子を
enum STATE { STATE_INIT, STATE_LOAD, STATE_ALIVE, STATE_DEAD, } m_state;
と変更して、STATE_ALIVEのとき
enum ACT_STATE { STATE_MOVE, STATE_ATTACK, STATE_DOWN, } m_act_state;
を参照するとかね。
0691名前は開発中のものです。
2007/12/31(月) 13:37:37ID:abjuzRp8関数の作成単位を処理毎 (exec(), draw()) から状態毎 (_stateAlive(),
_stateDead()) にして、各関数の中に exec, draw なんかの処理を
書くよう逆転させるとメンテナンスが楽になるよ。
実装はこんな感じ。
ttp://gameobj.issei.org/trac/wiki/HSM
それでも複雑になってきたら、更に状態ごとにスクリプトを貼り付ける。
状態遷移の入場動作でスクリプトを読み込み VM を設定、exec 相当の
処理ではスクリプトの VM を実行するように書く。
どこまで C++ で書いて、どこからスクリプトにするかは、一律の答えが
ないので難しい。作業を一人でやるか分担するかにもよるし、仕様変更を
どこにどれだけ見込むかにもよる。ただリソース(メモリとかテクスチャとか)の
確保・解放が絡んだら、経験上、そこは C++ で処理した方がトラブル少ない。
0692名前は開発中のものです。
2008/01/02(水) 03:34:31ID:JuBEjuNy簡単な非階層型の状態遷移クラスを作って対処してた。
状態ごとに派生クラス作ると、しんどかったので(これもかなりやってた)
結局、できるだけ、簡易的にするために、
draw、exec はメソッドポインタにして、状態遷移クラスに持たせ、
状態遷移クラスのdraw、execでそれらを呼び出すことに。
これなら、派生クラスを大量に作る必要がなく、気が楽(笑)
呼びたい entity に、1状態につき、initialize_hoge、draw_hoge、exec_hoge メソッドを作り、
状態遷移時に(initialize_hoge内で)、状態遷移クラスにメソッドポインタを割り当て、遷移させてた。
まあ、結局、entityのメソッドが増えるのと、階層化ができないのがキズ。
階層化は、状態遷移クラスをさらに持たせて、実現してたけど
0693名前は開発中のものです。
2008/01/02(水) 06:36:13ID:JuBEjuNyありがとう。
あー、逆の発想か・・・
ナルホ・・・
HSMは、(・∀・)イイ! って聞いてたけど、実際の実装を見たことがなかったので、
参考になります。
じっくり見てみる。
しかし、勉強セナあかんな・・・
0694名前は開発中のものです。
2008/01/02(水) 20:15:35ID:chyomhKK> これなら、派生クラスを大量に作る必要がなく、気が楽(笑)
GoF のステートパターンよろしく、状態ごとにクラスを作るか
それともクラス一つで済ませるかも場合によるよね。
AIとかシーンのように、各状態がそれなりに複雑で個別のメンバ
変数を大量に持つような場合は、状態ごとにクラス分けた方がいい。
アクションゲームのキャラクタ程度だと、クラス分けるとクラス間の
データ受け渡しの手間がかかりすぎ。
0695名前は開発中のものです。
2008/01/05(土) 01:21:42ID:fugzpZ900696名前は開発中のものです。
2008/01/05(土) 01:23:01ID:fugzpZ900697名前は開発中のものです。
2008/01/11(金) 13:18:44ID:0lOBaoZM0698名前は開発中のものです。
2008/01/25(金) 11:38:57ID:J9K9o4zc0699名前は開発中のものです。
2008/01/25(金) 20:32:41ID:cpC7cqhh0700名前は開発中のものです。
2008/01/25(金) 20:33:24ID:cpC7cqhh0701名前は開発中のものです。
2008/01/25(金) 20:37:13ID:h6GX/EGa■ このスレッドは過去ログ倉庫に格納されています