ゲームにおけるデータ構造・クラス設計・パターン
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名前は開発中のものです。
2006/08/10(木) 20:27:06ID:BnvyxuCBどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0838名前は開発中のものです。
2008/03/17(月) 21:06:48ID:I1kfClSUストラテジー・コマンド・ステートパターンはよく使うが。
デザインパターンって言ってもgofやgof以外やマルチスレッドなやつとかwebアプリケーション用とかいろいろあるよ。
0839名前は開発中のものです。
2008/03/17(月) 21:46:13ID:6v9SY+1bあと、これも多少使うかなぁ。
・シングルトン ファイル I/O を一括管理するときとか
・オブザーバー 関連するゲームオブジェクト同士の管理(プレイヤーと、それに張り付くエフェクトとか)
実際のコードは、GoF のサンプルとはだいぶ違う形になってるけど、
まぁデザパタは設計のカタログなんで、実装の見た目が乖離する
ことはよくある。
0840名前は開発中のものです。
2008/03/17(月) 23:00:08ID:81oeEqxB0841名前は開発中のものです。
2008/03/17(月) 23:20:40ID:hf8pDjO+勉強になるよthx
まだGOF読んでないから今の段階ではさっぱりわからんけど
読むときに思い出すようにするよ
0842名前は開発中のものです。
2008/03/22(土) 13:55:51ID:bw12F9FG0843名前は開発中のものです。
2008/03/22(土) 20:22:05ID:gzkziAGJ0844名前は開発中のものです。
2008/03/22(土) 21:20:08ID:DCoIdvPZ0845名前は開発中のものです。
2008/03/22(土) 21:55:21ID:qUFi6y55でしょ
0846名前は開発中のものです。
2008/03/22(土) 22:34:31ID:bw12F9FGo がいっこ足らんぞ
Groove on Fightは名作
0847名前は開発中のものです。
2008/03/23(日) 01:18:27ID:Dg07h3ZN0848名前は開発中のものです。
2008/03/23(日) 11:58:11ID:3+fyKl7y0849名前は開発中のものです。
2008/03/23(日) 12:20:13ID:GdFVK2/80850名前は開発中のものです。
2008/03/23(日) 12:56:06ID:2zNLBPZ30851名前は開発中のものです。
2008/03/23(日) 18:28:12ID:4ckcNna2Groove on Fight・・・豪血寺3のサブタイトル
Grove On Fight・・・俺のミスタイプ
0852名前は開発中のものです。
2008/03/23(日) 20:57:34ID:dUwevhCK0853名前は開発中のものです。
2008/03/23(日) 21:19:48ID:PfMuEor50854名前は開発中のものです。
2008/03/23(日) 21:23:02ID:QBAbg4unと思う俺はたぶんまだまだ
0855名前は開発中のものです。
2008/03/23(日) 22:08:36ID:oa0oVRXo0856名前は開発中のものです。
2008/03/23(日) 22:14:12ID:t1TOnFxg基本クラス変数に派生クラス実体が入ってる時に関数を呼ぶと、
もし派生クラスがその関数をoverrideしてたら派生クラスの関数が呼ばれるんだぜ。
便利だと思わん?
0857名前は開発中のものです。
2008/03/23(日) 22:22:19ID:Oei8nD2Z0858名前は開発中のものです。
2008/03/23(日) 22:28:35ID:UjPr9gEx上に出たとおりだと、
いくつかのパターンは使ってる
ただし実装は書籍と違うけど
だと思うんだが。読み間違い?
0859名前は開発中のものです。
2008/03/23(日) 22:51:49ID:t1TOnFxg自分の中で、仮想でないメンバの上書きはシャドウで、オーバーライド=仮想メンバの上書きだと思ってた
0860名前は開発中のものです。
2008/03/23(日) 23:11:46ID:QBAbg4unそういうことができるのは知識としては持っているんだけど
例えば
モンスタークラスの派生でスライムクラス、ドラゴンクラスがあって…
とやらないで
モンスタークラスだけがあって
モンスタータイプっていうenumメンバ変数があってそれによって処理が変わる…
みたいに書いちゃうのね
まだまだスクリプト言語のときの癖が抜け切らないというか
たぶん継承をうまいこと使った方が生産性上がるんだろうけど
0861名前は開発中のものです。
2008/03/23(日) 23:22:02ID:2zNLBPZ3外部ファイル読み込み(ハードコーティングでもいいけどさ)を考えると面倒じゃない?
0862名前は開発中のものです。
2008/03/23(日) 23:40:01ID:QBAbg4unごめん。今の自分のレベルでは
継承だと外部ファイル読み込みが楽になる理由がよくわからない。
0863名前は開発中のものです。
2008/03/23(日) 23:42:50ID:/kBQhQQwノウハウとか捨てずに大事にするよろし
C++だのJavaだのC#だの使っても
最終的にはスクリプトなりテーブルなりで
キャラデータを管理することになるから
そんときに経験は生きるぜ
継承大好きっ子にありがちなハマリ道は
何でもかんでもソースに(ハードコーディングで)
記述してみたりクラス分けしてみたりして
結果として異様に複雑で深い継承木を
こさえて、仕様変更時の手間の多さに
戦慄して初心に返ること
0864名前は開発中のものです。
2008/03/23(日) 23:58:07ID:VUhk8OhJそういう使い方をするものだと思っていた。
今は>>860のスライムクラスみたいな継承の使い方をするの?
データに当たるような部分をコードに絡ませるのはなんか抵抗があるんだが。
0865861
2008/03/24(月) 00:07:17ID:tkEWMZpB言語仕様には開発者の哲学が詰まってるからなあ。
>864
俺の分かりづらい文章(>861)の翻訳dクス
0867862
2008/03/24(月) 00:21:04ID:KE3DiPkZやっぱわかんね。
>>856風の継承が>>860みたいな感じかと思っていたんだけど(違ってたらスマン)
そういう継承の仕方は主流じゃなくて
>>864風の継承(どういうクラス構成なのかはイメージがわかないけど)のが主流なのかな?
0868名前は開発中のものです。
2008/03/24(月) 00:21:28ID:uZDK8kFU実装継承を適当に使うと、そうなりがち。
インターフェース継承は、設計しっかりしてれば問題ないでしょ。
0869名前は開発中のものです。
2008/03/24(月) 00:22:39ID:Yr94LLRUいや、リア厨のときに俺はそれ(>>863)やって
ゲロ吐いたの
でも継承木ビューワの眺めは壮観だったよ
オナニープログラミング
0870861
2008/03/24(月) 00:35:53ID:tkEWMZpBあくまで、RPGっぽい敵のデータを例として挙げたから、それに対してのツッコミってことね。
他のところで使う分には知らん。
で、だ。
RPGを作ったことがないアマチュアの意見なんで、聞き流すだけでいいんだが。
敵データを外部ファイル読み込みで作るとする。
敵の動きを変更したり、敵の種類を増やしたいと思った時は、当然そのデータを弄ることで対応するわけだ。
敵のデータを変えるたびに、ソースコードの中のクラスを書き換えるのか?
敵の種類を増やしたら、派生クラスを動的に生成するのか?
そういうこと。
0871名前は開発中のものです。
2008/03/24(月) 00:42:36ID:nPahSoi8まあ多くても3回以上は継承したくはないよな
キャラ>モンスター>種族特性>個々のモンスター は既になんとやら
>>870
外部ファイルを作らず未だにステータスの固有値を派生クラスに直接書き込んでる俺はどうすrb・・・
0872名前は開発中のものです。
2008/03/24(月) 00:46:42ID:uZDK8kFURPGだと、
struct IEnemy;
class EnemyBase : public IEnemy {};
class EnemyBase : public EnemyBase {}; // 敵ザコクラス
class EnemyBoss1 : public EnemyBase {}; // 敵ボス1
class EnemyBoss2 : public EnemyBase {}; // 敵ボス2
って感じにするな。
ザコは全部一つのクラスで、データファイルとスクリプトで駆動。ボスは
プログラムでの特殊処理が必要なら、個別で作る。
0873名前は開発中のものです。
2008/03/24(月) 00:59:42ID:tkEWMZpBその辺は柔軟に、ってことね
0874862
2008/03/24(月) 01:09:59ID:KE3DiPkZえーと…
ごめん。なんか混乱してきた。
自分が何か読み違えているのかもしれないけど
>>864が>>861の翻訳であるとあったので
>>864に書いてあることを
「モンスター の 派生で スライム みたいな(哺乳類 の 派生で 犬 みたいな)
クラスの構成は間違っている。
外部データを読み込む際に便利なるような継承の仕方が実はあるよん。」
―と解釈したんだけど誤解している?
で、>>870を読むと「継承なんて使わずにデータを弄ることで挙動を変えるんだ」
と解釈したんだけど、それだと>>864の主張と矛盾するのでアレ??と思った。
どっちを勘違いしているんだろう俺は。
0875名前は開発中のものです。
2008/03/24(月) 01:23:08ID:tkEWMZpB0876名前は開発中のものです。
2008/03/24(月) 01:33:58ID:KE3DiPkZ読み違えてはいないけど矛盾もしていない?
余計にわからなくなって混乱してきたので一晩寝て考えてみる。
色々有難う。
0877名前は開発中のものです。
2008/03/24(月) 01:41:01ID:tkEWMZpB>864氏の主張を僕なりに解釈
●前半
敵データを記述するにしても、
テキストファイル(CSV)の場合もあれば、バイナリデータの場合もある。
ゲームによっては、ネット越しにデータベースへアクセスするかもしれない。
そういう部分を汎用的に書くのに継承は有効。
●後半
スライムとスライムベスとホイミスライムとドラゴンとオオアリクイと彷徨う鎧とで
いちいちクラス作ってたら一生終わんなくね?
0878名前は開発中のものです。
2008/03/24(月) 08:29:41ID:lmwW1pW4自分自身の意見としては>>877の通りなんだが、
種類ごとにクラスを作るような継承の使い方が全く見当がつかなかったので質問させてもらった。
本気で全種類分クラスを作るのか、
それともスライムとスライムベスはスライムクラスにまとめてしまうのか、
その場合出現テーブルなど外から参照するときはどうするんだ(クラス名?)とか、興味が尽きない。
実際どうやるんだ?
>>872のはどちらかというと戦闘時イベント(HP半減で台詞とか死亡エフェクトとか)など特殊処理を意識したものだと思うので
>>869の話を聞いてみたい。
0879名前は開発中のものです。
2008/03/24(月) 12:03:07ID:nPahSoi8と869ではないが予想
0880名前は開発中のものです。
2008/03/24(月) 14:53:51ID:GL5PdgnZクラス分けして幾つもの「科」を作り、何十もの「目」を作った
そして何百もの「種」を作ろうとしたとき、僕は秀丸のマクロで
大量のクラス(hpp、cpp)を作っていた
何かを間違えていることに気付き始めたのはその時だった
あれは14歳の夏休みでした
0881名前は開発中のものです。
2008/03/24(月) 14:58:03ID:kALgXEvY0882名前は開発中のものです。
2008/03/24(月) 15:00:11ID:GL5PdgnZ本気で作ったよ。リビルドにかかる時間の長さに興奮した
0883名前は開発中のものです。
2008/03/24(月) 15:00:26ID:T1jBR36AIronPythonでスライムクラスとか全部継承で作ったら面白いかも
0884名前は開発中のものです。
2008/03/24(月) 15:09:53ID:ajtWFMqv0885名前は開発中のものです。
2008/03/24(月) 16:18:36ID:gcKvtXCR>class EnemyBase : public IEnemy {};
まだこんな命名規則使うやつ居たのか
0886名前は開発中のものです。
2008/03/24(月) 16:25:13ID:kALgXEvYおまいは 変数hoge や Func()関数にまで突っ込むのか
0887名前は開発中のものです。
2008/03/24(月) 18:49:57ID:lmwW1pW4ひさしぶりに勇者を見た。
>>883
行動パターンとかをスクリプトにして外出しにするわけか。
でも動的に作成するのはなんだかコストが高そうな気がする。
0888872
2008/03/24(月) 21:24:32ID:KE3DiPkZ昨日のあらすじ
>>864継承使うよ(外部データ読み込むのにね)
>>870継承使わないよ(外部データで弄えばいいじゃん)
>>874(俺)矛盾しているやん!どっちやねん!?
>>875矛盾してるように思えないんだが
>>876(俺)え?!!
↑は置いといて取り敢えず1番の疑問の解消から…
>>864
>継承って、外部ファイル読み込みを外部データベース読み込みに変えるとき楽になるとか
ごめん。この継承の使い方、どんな使い方なのかまるで想像できない。
どんなの?
0889名前は開発中のものです。
2008/03/24(月) 22:09:39ID:kALgXEvY0890872
2008/03/24(月) 22:16:59ID:KE3DiPkZ0891名前は開発中のものです。
2008/03/24(月) 22:45:28ID:kALgXEvY0892872
2008/03/24(月) 22:48:16ID:KE3DiPkZもうちょっと考えてみるわ。
0893名前は開発中のものです。
2008/03/24(月) 22:56:35ID:kALgXEvY>>864継承使うよ(外部データ読み込むのにね)
>>870継承使わないよ(外部データで弄えばいいじゃん)
この時点で間違えてる。
0894872
2008/03/24(月) 23:01:16ID:KE3DiPkZうん。たぶん自分が曲解しているんだろうと
そう思って>>874を書いたんだけど
>>875で矛盾していないっていわれたもんで
>>876 え、別に読み違えていないの?に到って
>>877読めば>>888にはならんだろと言われて余計に????
0895名前は開発中のものです。
2008/03/24(月) 23:23:01ID:kALgXEvY>894の疑問に関してだけ言うとだ。
>874と>888とでは、お前さんの言ってる内容が異なる……と、自分は感じた。
>874の文章を読んだ限りでは、ちゃんと理解しているように見える。
>888は間違って理解しているように見える。
>864は
・データの読み込み方法(外部ファイルとかデータベースとか)については、派生クラスを作るべき
・データだけが違うオブジェクトについて、いちいちクラス分割するのはどうなんよ? 正しいの?(疑問系)
の2点について述べている。
具体的には>877を参照してほしい。
>870は
データが違うだけのオブジェクトについて、クラスを分けるのは最適ではないのでは?と述べている。
データの読み込み方法については何も述べていない。
よって、両者は矛盾していない。
0896872
2008/03/24(月) 23:54:26ID:KE3DiPkZおけ。落ち着いたw
やっと謎が解けた。
俺が単純に 「継承使う」←→「継承使わない」で相反していることをいっているように
感じて何故かそこに噛み付いて「矛盾している!」叫んでいただけで
ずっと
「外部データの読み込みの為には派生クラスを作るけど、
データの違いで吸収できるようなことにまで派生クラス作ってどうすんの?」
って主張してるだけで別に矛盾なんてしてねーじゃん
―と。
うん。それなら問題ない。確かに自分は読み違えてはいなかった。
変な方向にこだわって混乱させてスマン。
元々>>860でいうように継承使わない派だからクラスをうじゃうじゃ派生しない方が
良いのはわかるし。
残る疑問は「外部データを読み込みを楽にするために派生クラス」ってやつ。
これ、さっぱり実現方法がわからない。
0897名前は開発中のものです。
2008/03/25(火) 00:54:06ID:MCdo/Bj3インターフェースさえ揃えておけば
差し替えが楽になるってだけの話でしょ。
virtual void Img::Load(DestPtr* dst, FilePtr* src);
を継承したクラス郡
void Jpg::Load(DestPtr* dst, FilePtr* src);
void Png::Load(DestPtr* dst, FilePtr* src);
void Gif::Load(DestPtr* dst, FilePtr* src);
を作って差し替えるのが楽ってだけの。
0898872
2008/03/25(火) 01:22:10ID:kctvHJ5z有難う。
説明するまでもないほど常識的なやり方なのね。
勉強不足ですまん。勉強になった。
ファイル形式が違うのを読み込むときに記述が楽出来るのね。
0899名前は開発中のものです。
2008/03/25(火) 01:41:22ID:8j9nw6j10900名前は開発中のものです。
2008/03/25(火) 02:09:10ID:+wFlCySYお前は本当に872か?w
0901872
2008/03/25(火) 02:11:16ID:kctvHJ5zそもそも>>860でRPGを例に出したのが間違いだった。
敵の名前を皆が知ってるゲームでぱっと思いついたので安直に選んだ。
今思えばスーパーマリオの方が例としては良かった。
継承アレルギーの自分ならENEMYクラスひとつだけにして
全部データの違いで吸収するかなと。
ゲーム制作中にメットっていうファイヤーボールの効かない亀を思いついたとしても
ノコノコからの特化キャラとして派生させたりせずに
メンバ変数fireArmorを追加してメット以外のキャラを0に設定するかな。
0903名前は開発中のものです。
2008/03/25(火) 03:09:13ID:GnFPDA7Uという理由で継承の木にあてはめてしまうのはダメだよ
ていうかそんなのならやらない方がいいswitch文でよろしい
インターフェイスやスーパークラスを使う側に何が必要かということ
隠蔽のニーズのほうを第一に考えるべき
0904名前は開発中のものです。
2008/03/25(火) 06:25:37ID:lx9o+WS20906名前は開発中のものです。
2008/03/25(火) 14:06:40ID:OGAdbkNY0907名前は開発中のものです。
2008/03/25(火) 21:21:33ID:AbKMyTJI継承は多態が必要なときにしか使わないな。
0908名前は開発中のものです。
2008/03/25(火) 22:47:32ID:qKRP+2ua委譲の形に書き直す際に、書き直す前の委譲元オブジェクトの継承関係を
委譲先オブジェクトがそのまま引き継いでしまうようなソースを書いても
何の疑問も持たない奴が意外と多いから注意な。
どの部分を委譲すればよいか、粒度は適切かどうかを見極めたうえで
コーディングすべき。
0909名前は開発中のものです。
2008/03/25(火) 23:18:21ID:k9P0z5/O0910名前は開発中のものです。
2008/03/26(水) 00:49:14ID:WLaSa3Gs当り前だと認識する(定石・パターンを共有する)のが
設計・パターンの学習の第一歩なわけだから、
>>909は最も必要な思考ではあるが
最もレスしてはいけない文章でもあるな。
0911名前は開発中のものです。
2008/03/26(水) 05:21:20ID:AnrQAT7Uということだよ
そういうローカルな問題を解決するのに使ってしまうと
もっと大局的な構造を記述するために使われている継承との一貫性がなくなる
名前のつけ方からして一貫した目線であるべきなんだよ
ゲームを作ってる俺達はApplicationやSystemやEngineって呼べる一番高い位置から
見ているのだから敵キャラをEnemyと呼ぶのはおかしいよ
こんなのたまたまプレイヤーに敵対的なAIが乗ってるだけのゲームオブジェクト
に過ぎないんだから
データの入出力の種類どうこうはそんなの多分インスタンスが生成される必要も
ないんだろうからswitch文かなにかで書けば充分
「現実世界ではこれは〜の一種類とされています」なんてのを継承で
示してみせたところで後で見たとき何の役にも立たないわけだよ
0912名前は開発中のものです。
2008/03/26(水) 08:27:56ID:WLaSa3GsEnemyクラスを作ろうが、一ゲームオブジェクトの処理内容をベタ書きしようが、
どちらもApplicationが敵を直接意識して操作しているという悪例に他ならず
そういった意味で両者の違いなんてほとんどないに等しいから
「現実世界のものどおりに継承関係構築するのは無意味だ」という主張の
引き合いとして「名前の付け方からして〜」以下の文章を出すのは
あまりにも不適当で意味不明。
0913名前は開発中のものです。
2008/04/08(火) 17:58:37ID:o8llBZSA「1回目にここへ来たときはこっちのシナリオ、2回目以降はこっち」
「○○のアイテムを持ってるときに○○を調べるとこっちのシナリオ」
「○○への好感度が80以上のときに話しかけるとこっちのシナリオ」
様々な切り分け方があると思うのですが、そういう条件式とルートを
統括的に扱えるような設計というかやり方ってあるのでしょうか。
今やってるのはもうごちゃごちゃで、テストが不安で仕方ありません…
0914名前は開発中のものです。
2008/04/08(火) 22:19:28ID:XhbGzrYyいろいろなタイプがあると思うけど、それぞれのシーン内の分岐は
基本的にはif分の羅列になると思うんだ
あとこういう枯れたジャンルなら既にある優秀なツール、例えば
RPGならRPGツクールを、ADVなら吉里吉里とかNスクを
それぞれ参考にするといいんでねの
サンプル見たりチュートリアルに沿って使ってみたりすれば
イベントの基本構造とかが何となく見えてくるぞ
0915名前は開発中のものです。
2008/04/09(水) 10:51:18ID:2MmRi2Sh基本的には if 文の羅列だけど、たとえば RPG なら
・基本となるスクリプト
を用意しておいて、その上で条件が成立したときだけ
オーバーライドする内容を列挙した
・派生スクリプト
を上にかぶせるような作りにしておくと、多少は管理が楽になる。
0916名前は開発中のものです。
2008/04/12(土) 15:28:03ID:yutaDgBeちょっと考えたけど難しいわ。降参。
とりあえず綺麗にソースを書いといて。
シナリオそれぞれに分かりやすい名前付けといたがよさそうね。
300件以上とかあるだろうから、どうやって名前付けるんだろう・・・
0917名前は開発中のものです。
2008/04/12(土) 21:03:35ID:JhGNA0fRif文の羅列で凄まじいネストになってしまったりして見難くなるんだろうなぁ。
まぁそういう制御の部分を、コードではなくスクリプトでなるべく見易くするってのはいいよね。
これらの方法は、全ての状態をグローバルなフラグなどで管理することになるのだろうから
セーブやロードとかの処理は、結構簡単で良さそうだね。
915のいうような感じで、条件や処理を一つのオブジェクトに見立てて
それらを動的に拡張していくような構造なら、いままでのフラグ的なものを
上手いこと隠蔽化してくれそうに思うので、一歩進んでいると感じるなぁ。
ただこれは、とあるポイントに複数の拡張が生じる場合を考えると、
優先順位が必要になると思うので、そこは考慮しないといけないね。
場合によっては一つの拡張の優先順位が複数存在することもありそうだし、
拡張の呼び出し元を拡張要求ってなものにして、それに優先順位と実拡張への参照を持たせるといいのかな。
あと現在の拡張状態をセーブするのがちょっと面倒なのかなって思う。
0918名前は開発中のものです。
2008/04/12(土) 21:12:31ID:mZOjOCQT0919名前は開発中のものです。
2008/04/12(土) 21:40:58ID:mVEHbkLg> 優先順位が必要になると思うので、そこは考慮しないといけないね。
実際には、ほとんど必要ない。そこまでやると、シナリオ担当がついてこられなく
なるから。
0920名前は開発中のものです。
2008/04/12(土) 22:32:44ID:arZb3bS0ステートマシンって一般的な単語なのかな
波動やってないとたぶん分からないきもするが
でもそんなににきがつくならこんなアホな質問はせんか
スクリプトだろうがコードだろうがっどっちも同じプログラムであって根本の話ではないし
0921名前は開発中のものです。
2008/04/12(土) 23:04:47ID:mVEHbkLg> ステートマシンって一般的な単語なのかな
プログラマには常識だと思うな。
学生さんでも、大学で情報系専攻してれば必修だし。
0922名前は開発中のものです。
2008/04/12(土) 23:11:40ID:JhGNA0fRさっき書いた動的拡張をスクリプトにするとして俺ならこんな感じ。
object 村人
abstract action 会話
object 村人A extends 村人
action 会話
message("おいらは村人A!")
action 魔王を倒した
object 喜ぶ村人
action 会話
message("あんたのお陰で村は平和だぜ!")
dynamic extend 喜ぶ村人 on derived(村人)
action なんか知らんが魔王が復活した
cancel dynamic extend 喜ぶ村人 on derived(村人)
>>920
ステートマシンて情報処理系の試験に出ないっけ?
波動(?)と何か関係あるの?
0923名前は開発中のものです。
2008/04/12(土) 23:31:33ID:f378qNQi0924名前は開発中のものです。
2008/04/12(土) 23:37:53ID:jbkv2Yti0925名前は開発中のものです。
2008/04/12(土) 23:45:24ID:arZb3bS0ハードだと普通に使う、というかこの考え方がないと組み込みのコードもかけないだろ
0926名前は開発中のものです。
2008/04/12(土) 23:48:56ID:8n/EoXt3誰でも一度は考えるなw
とはいえ、”いかに綺麗な構造を実現するか”より、
”いかに大量のフラグを管理するか”を中心に据えてツール類を整備した方が
スクリプターも楽だし、メンテもし易く、バグも出づらく、高速なコードができあがるという罠。
0927名前は開発中のものです。
2008/04/13(日) 00:12:34ID:lFCr4Kneがあって、List<Event> に全イベントをステージ最初にぶち込む。
で、各フェーズ毎に全イベントに、発動可能かを問い合わせる。
発動可能なら、キャラの位置を調べて、イベントの位置と合致する
なら実際にイベントを発動。
これ、chain of responsibility
0928名前は開発中のものです。
2008/04/13(日) 00:29:46ID:IybI8btp描画担当をエンティティから切り離すのはいいとして
その描画担当がシーンツリーの奥深くまでLPD3DDEVICEをもっていって
最底辺でd->SetRenderStateとかやってるのは
最近マルチパスレンダリングとか外部ファイルになったシェーダー等を考えるに
適当でないと感じるようになってきた
何かいいデザインがあるでしょうか
0929名前は開発中のものです。
2008/04/13(日) 00:35:14ID:uiXughV8MTFrameworkやPSSG(はちょっと違うが)も似たような方式だし。
[シーンツリー] --(生成)--> [中間パケット配列] --(最適化)--> [最終中間パケット] --> [描画]
って流れで。
DirectX本体は、パケットの配列を読んで実行するのみで、シーンツリーには一切関与しない。
描画部を完全に切り離せる上、最適化部もシーンツリーのトラバースと分離できるメリットがある。
ただ、マテリアルやマルチレンダーターゲットの表現が難しい(的確なパケットを定義しないと冗長になってしまう)から、
パケットの設計が一番大変かと。
0930名前は開発中のものです。
2008/04/13(日) 00:44:07ID:GyzKnOlk確かにその通りだよね。
今目に見えているものだけで動作を予測できるか、
ってとこがポイントなのかな。
自分でも、さっきのスクリプトみたいなのをスクリプターが頑張って書いても、
いざ実行してみて( ゚д゚)ポカーンってなってるのが目に浮かぶし。
でもそれは、専用のスクリプトエディタ的なアプリを作って
今見えているスクリプトに関連する情報を注釈としてオーバーレイ表示して
直ぐに関連を理解させることさえ出来れば結構改善できる気がするんだよね。
プログラムでクラス指向が普及しているのも、IDEによる直感的な補佐の
影響が効いているからだと個人的には思ってるし。
でもまぁ、一般的に想定出来る量の分岐のゲームで
ここまでやることはきっと割に合わないのだろうなぁと思う。
ただ、最近はオブリビオン(やったことないけど)とかいう、
莫大なスクリプトが存在するらしいゲームも出てるらしいじゃん。
そういったゲームリソースの肥大化から考えると、
こういうの考えておいて損はしないと思うんだよね。
0931名前は開発中のものです。
2008/04/13(日) 00:57:00ID:lFCr4Kneこう書いたが良かった。List<Event*>
判定処理はConcreteEventクラス毎に違う
0932名前は開発中のものです。
2008/04/13(日) 02:22:04ID:ojGRG7jT0933名前は開発中のものです。
2008/04/13(日) 04:39:58ID:IybI8btpMTFrameworkとかよくわからんけどデバイスコンテキストを持ちたくないとか、
ステートマシンにかかわりをもちたくないとか
単純なそういうものの隠蔽を望んでるわけじゃないのです
たとえば各個がDraw()を実装するような構造だと、シーンに一回デプスバッファだけ描かせるようにする
とかいう改変をしなくちゃならない場合に全部にDrawDepth()みたいな名前で同じようなことを
しなくちゃならん実装をしないといけないのはちょっと変だと思うわけです。
具体的な描画の手続きが末端におしつけられてる構造がなんとかならないかなと思ってるのかも。
わかりません。
0934名前は開発中のものです。
2008/04/13(日) 05:37:30ID:GyzKnOlk自分でも分かってないのかよwww
まぁ俺は末端の描画処理に上層から介入したいのだと見たよ。
その前提で答えてみる。
現状ツリー上に階層化された描画物は、上層から
IDirect3DDevice*を引数としてリレーしたものを使って描画してるわけだよね。
んでこれらの描画物の描画処理に変化を加えたいということであれば、
上層で、IDirect3DDeviceを拡張したインスタンスを作りそれを下層へ放流すれば良い。
分かるかも知れんが詳細にやり方を書くと、IDirect3DDeviceって確かクラスだったよね?
であれば単純に継承して各メソッドで本物のインスタンスへの委譲メソッドを書く。
そしたら自分が拡張したいメソッド、この場合SetRenderStateか?を好きなように変更する。
そんな感じでどうよ。
もちっと考えると、そもそもIDirect3DDeviceなんかを末端から直接触らせずに
自作クラスでラップしたものを使わせるようにすると見易いし色々と便利かと思うな。
こういう考え方、きっとよく知られてる知識なんだと思うけど、俺はJavaやって初めて知ったよ。
0935名前は開発中のものです。
2008/04/13(日) 09:09:47ID:D4Mfl7O80936名前は開発中のものです。
2008/04/13(日) 10:23:53ID:lFCr4Kneなるほど意味分かった。
形状描画とマテリアル(描画嗜好)分離されてるから それでいいねえ
0937名前は開発中のものです。
2008/04/13(日) 11:40:53ID:GyzKnOlkインタフェースなんだから直接継承しても問題ないんじゃないの?
あれ、ごめん、C++だとIDirect3DDeviceのメソッド郡はvirtualじゃないのか?
となると単純に継承しても元の型でアクセスされると拡張されたメソッドが呼ばれないのか。
じゃああれだ、自前クラスにするだな。
レス数が900を超えています。1000を超えると表示できなくなるよ。