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

ゲームにおけるデータ構造・クラス設計・パターン

レス数が1000を超えています。これ以上書き込みはできません。
0001名前は開発中のものです。2006/08/10(木) 20:27:06ID:BnvyxuCB
具体的なゲーム名を挙げて、
どのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。

関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0953名前は開発中のものです。2008/04/16(水) 21:55:02ID:oFemimm/
>>951
>ググってみたけどこれに近いの?各個が描画処理を持ってる。
そんなかんじです。drawをもってるcompositeパターン
>>952
>ほんとの要求は、「描画先バッファを上層で制御したい」ってことだよね
制御できるかできないかという意味では
シーングラフがdrawを実装した今のままでも十分制御できます。
リファクタリングの動機は不可能を可能にとか、そういうところにはないと思います。
0954名前は開発中のものです。2008/04/16(水) 23:08:47ID:R79eU4Cu
>>953
Visitor風の実装に変えてみたら?
シーングラフはモデルとマテリアル情報だけ持って、
Visitorがシーングラフをトラバースして必要があれば描画する
ポストエフェクトを切りたければ、ポストエフェクトのVisitorを無視すればいい、的な。

でも、どんなに描画とデータを分離したところで、実際にゲームを作ることになれば
ノード単位でのエフェクト制御(シャドウを落とすかどうか、とか)がどうしても必要になってきて、
末端に細かいフラグが蓄積してしまってあまり意味がないんだよね。

結局、描画エンジンに限っていえば、データと処理の分離は、
最大公約数的な情報を末端のノードに持たせることになって、逆に効率を落としちゃうし、
タイムクリティカルなゲームの最適化を阻害するのが実情。

先進的なエンジンほど、制約がきつい(拡張性が無い、固定機能ばかり)のが現実だから、
何かいい構造を思いついたら発表すれば、一儲けできるかもよ?
0955名前は開発中のものです。2008/04/16(水) 23:24:47ID:6tcgJhqC
>>953
君のシーングラフというのは
ノード(特にdrawインタフェース付きのやつ)同士の接続は何を表しているの
まぁ典型的なものなら座標系(例えば姿勢行列)の親子関係になるわけなんだけど
この場合、巡回目的は行列スタックを積み上げてながら仮想空間上の各ノードの
ワールド座標を得ることだったりするわけだが、その処理の中でdrawを呼び出すの?
0956名前は開発中のものです。2008/04/17(木) 03:10:24ID:3m8+g+3b
>>954
大枠のコンセプトとしてはVisitorということになるのかもしれません。
ただ、VisitorそのものはC++ではその真価を発揮できない、
Compositionツリーの方に新しい要素が頻繁に追加されることが予想される
等、その弱点がちょうど今回のケースにあてはまり、そのままでは適用しずらそうです。
さらに個人的な感想をかけば、型と場合に応じて関数がいくつもできあがるのは好みません。

それこそ中間描画パケットのようなローテクなアプローチが必要なのかもしれないです。
0957名前は開発中のものです。2008/04/17(木) 07:36:26ID:FHbVDin2
>>956
> ただ、VisitorそのものはC++ではその真価を発揮できない、
コードを書いてみてくれ。なんか勘違いしてるような気がするんで。
0958名前は開発中のものです。2008/04/17(木) 10:20:54ID:CViJCy2o
>>956
ゲームに使う分には、ノードに種類フラグを持たせて、適切にアップキャストするのが常套手段だね。
Visitorは対応している種類のノードだけ処理する。
Visitorの関数の数の爆発にも、ノードの種類の増加にも簡単に対応できる。
ダブルディスパッチが目的ではないから、Visitorとはコンセプトが少し違うな。
イテレータに近いかも。
0959名前は開発中のものです。2008/04/22(火) 22:42:37ID:Z5McnRHO
>>956
つNVSG
Traverserあたりを調べればそういう基本的な悩みは解決すると思う。
0960名前は開発中のものです。2008/04/23(水) 18:23:23ID:BqXPf/Oa
>>959
とても参考になりました。
シーングラフはあくまでデータの一群であって
それぞれの目的をその名に冠したtraversalがそれを利用してそれぞれの目的を果たすと。
レンダリングもtraversalの一種に過ぎないと。そんな解釈みたいですね。

ただコレ、NodeHintsなるものとか、ShadowMappingがなぜか埋め込まれてるとか
ちょっと気味が悪い部分もありますね。
0961名前は開発中のものです。2008/04/23(水) 19:09:53ID:U3C9KQJ3
>ちょっと気味が悪い部分もありますね。

具体的に言ってごらん
0962名前は開発中のものです。2008/04/23(水) 20:47:19ID:M28cm74p
>>960

>>954 に
> ノード単位でのエフェクト制御(シャドウを落とすかどうか、とか)がどうしても必要になってきて、
> 末端に細かいフラグが蓄積してしまってあまり意味がないんだよね。

ってちゃんと書いてあるじゃねえか
NVSGはその典型例だよ
0963名前は開発中のものです。2008/04/25(金) 00:41:21ID:vc7Q6jEY
ノード毎の付加情報はあってもいいでしょ。各々のトラバーサーが自分に必要な
属性を処理すればいいだけ。C#のAttributeなんかが同じ要求から出てきたものじゃないかと思う。
プロパティグリッドの情報はオブジェクトにとって本質的じゃないけど、オブジェクト側に埋め込んでおきたい
みたいな。
0964名前は開発中のものです。2008/04/25(金) 00:47:43ID:zJzd1rCb
C#のAttributeは型とメンバにメタデータを付ける機能だよ
オブジェクトには付けられない
0965名前は開発中のものです。2008/04/25(金) 01:13:35ID:vc7Q6jEY
インスタンスって意味でオブジェクトって使ったわけじゃないんだけど・・・。
じゃまぁ、s/オブジェクト/クラス・メンバ/ということで。
0966名前は開発中のものです。2008/05/05(月) 14:08:00ID:+Zvy5eoD
ほしゅ
0967名前は開発中のものです。2008/05/11(日) 16:38:51ID:5xrxRK37
プログラム板のデザインパターンスレから誘導されてきました。
ゲームを作ろうと思い、デザインパターンの勉強をしてるんですが
Singletonをどんな風に使うのか今一ピントきません。

Singletonじゃないと困る場合。
Singletonだと助かる場合。
出来たら例を示して貰えないでしょうか。
0968名前は開発中のものです。2008/05/11(日) 16:57:46ID:XzXZ0r0X
シングルトン滅びろ
0969名前は開発中のものです。2008/05/11(日) 17:02:04ID:tAMxfx7F
バカほど背伸びしてアレコレ使いたがるよな。
0970名前は開発中のものです。2008/05/11(日) 17:24:11ID:3Mda4QHx
やる気になってる馬鹿が一番伸びるだろ。
いい気になってる自称天才が一番伸びねえよ。
0971名前は開発中のものです。2008/05/11(日) 17:28:01ID:iOBnIUaU
背伸びしてアレコレ使わないとバカとやらを脱出できないだろう。
少なくとも「糞だって他の人が言っていたから」
という理由だけで、一度も使ったことのないモノを非難する人よりはマシ。
0972名前は開発中のものです。2008/05/11(日) 17:42:18ID:J2J0EAvR
デザパタの中でシングルトンが一番わかりやすいと思うんだけどなあ
0973名前は開発中のものです。2008/05/11(日) 17:52:03ID:GgT2def3
>968-971を俺なりに要約すると、
・基本的な仕組みが判ってれば問題無い。
・ゲームを作っていけば、自ずと使う場面がわかるはず。
・判らないようじゃ、ゲーム制作に向いてない。
・むしろ技法を知らなくても何時の間にかそれっぽく書けるのが理想。
・使う言語が決まってるなら、そのスレを当たるのお勧め。
0974名前は開発中のものです。2008/05/11(日) 18:00:20ID:esEBS9+0
>>967
「クラスのインスタンスがひとつだけであることを保障する」というシングルトンの目的が
必要になる場面なんてほとんどないから、ピンとくるわけがない。

グローバル変数大好きなやつが免罪符みたいに使ってることのほうが多いから、
強いて言えば「グローバル変数が使いたいとき助かる」と言えるかもしれない。
0975名前は開発中のものです。2008/05/11(日) 18:16:18ID:PCcZcAXj
>>974
画像を先読みしておいて使いまわしたい時には、
シングルトンで先読みして、
必要な時にクラス作って呼び出すってやってるんだけど、
これってもしかして、間違えてる?
0976名前は開発中のものです。2008/05/11(日) 18:30:24ID:esEBS9+0
>>975
それのどこでシングルトンが必要なのかわからない。
0977名前は開発中のものです。2008/05/11(日) 18:36:53ID:tOAeonzF
>判らないようじゃ、ゲーム制作に向いてない。
はじめから知ってろってことか
0978名前は開発中のものです。2008/05/11(日) 18:40:49ID:GgT2def3
(明示的な)グローバル変数が無い言語(java?)なら必要かもしれないけど、
ハナからある言語ならシングルトンなんてスパゲティ抑止策としか思えない。
そういう言語だとシングルトンは必要と言えば必要だし、いらなきゃいらない。

と言うわけでお前等落ち着け。
0979名前は開発中のものです。2008/05/11(日) 18:41:31ID:PCcZcAXj
>>976
つーことは。間違えてるのか。
描画クラスをダレに持たせるかが分からなくて、
ダレにも持たせないのを選択したのが、悪いのかな?
0980名前は開発中のものです。2008/05/11(日) 18:42:43ID:PCcZcAXj
書き忘れ。C++でウインドウズ用のプログラムを作ってました。
0981名前は開発中のものです。2008/05/11(日) 18:53:03ID:5xrxRK37
コンストラクタやデストラクタが、近いように見受けられますが
それで済むなら、シングルトンは必要ないですよね。
一つしか存在しないのを分からせる為の目印と言うには分かりにくいですし…
となると、シングルトンが作られた目的というか、用途があるはずですが
例えば、データを受け取って、それをファイルへセーブするクラスはどうでしょうか。

キャラ毎に進行状況やフラグをセーブするような場合や
キャラリストファイルから特定のキャラを選び、探索チームを作成し
そのチームのキャラデータのみをキャラリストファイルへ反映させる場合です。
wile(チームの終わりまで) {
 Team[ chara_pos ].save()
}
(そんなごちゃごちゃしたセーブのやり方をするなと言うツッコミはなしで)
0982名前は開発中のものです。2008/05/11(日) 18:57:03ID:6C+qLPF1
>>979
描画クラスは一つ一つのキャラクターが持つはず。
画像は同じでもアニメのパターンが違ってたりするので。

>>976
STGのザコ敵で、同じ画像を使っていて、何百匹も出る場合です。
0983名前は開発中のものです。2008/05/11(日) 19:03:55ID:GgT2def3
gdgdだなぁ…

クラスに画像が固定ならシングルトンでも良いけど、
可変なら微妙じゃね?
(シングルトンで可変な数の画像読むなら別だろうけど、
それはそれでアクセス方法がシングルトン的じゃなくなりそうw)

つか、必要か不要か二元論な奴は、
議論する暇あったらミニゲームでも作って、
いろいろ試したらどうよ…
0984名前は開発中のものです。2008/05/11(日) 19:38:15ID:tAMxfx7F
質問する方も答える方もバカでワロタw
背伸びしすぎw
0985名前は開発中のものです。2008/05/11(日) 19:38:35ID:Y1IG+/zm
> 一つしか存在しないのを分からせる為の目印と言うには分かりにくいですし…
・シングルトンを知っていれば分かる
・知らずに2個インスタンスを作ろうとしても作れない
これ以上に分かりやすい目印はないと思うが。
0986名前は開発中のものです。2008/05/11(日) 20:27:08ID:5xrxRK37
今、自分は、地図を開いて「このマークはわかりにくい」と言ってるような
現状だというのは分かっています。
マーク単体の意味は分かっても、それを利用する為の判断基準のようなものが
自分の中にまだ備わっていないので、先達の方に例を示して貰えないかと来てみたわけです。
0987名前は開発中のものです。2008/05/11(日) 20:50:58ID:GgT2def3
いい加減くどいな。ゲーム作り始めれば判るよ。お前だって
「自転車のハンドルを右にきる理由は理解してるのですが、タイミングは何時ですか?」
と聞かれたら「転んで憶えろ」と言うしかないだろ?
0988名前は開発中のものです。2008/05/11(日) 20:51:58ID:3RvB3bNr
シングルトンて言葉にするの、何か恥ずかしくね?
「このクラスはシングルトンです。」
とか真顔で言える気がしない。
唯一のインスタンスを保障するだけの癖に
大層な名前がついてるなって思う。
0989名前は開発中のものです。2008/05/11(日) 20:52:35ID:iRDlbSEv
とりあえず言わせてくれ。
みんな話題待ちすぎwww突然レスがつきすぎだぜ
0990名前は開発中のものです。2008/05/11(日) 21:04:49ID:9L6x2D0A
>>967
ハンドルとか設定とかを持たせるときとか
0991名前は開発中のものです。2008/05/11(日) 21:05:29ID:MO+nJU1n
シングルトンは人に説明するのに便利すぎる
他のパターンと違って誤解される可能性が低いのと他よりは知名度高いからよく使ってる

でも、デザパタって意外と知ってる人少ないよね
普通に会話に使うもんだと思ってGoF勉強したけどほとんど通じない
0992名前は開発中のものです。2008/05/11(日) 21:07:20ID:iRDlbSEv
ところで、シングルトンは
インスタンスがなければ生成してから返し、ある場合は既にあるインスタンスを返す関数が在るってことであってる?
個人製作なら自分ルールで最初にその手のインスタンスは初期化する、って決めておけばいらなそう。

複数人で開発する場合で、その手のインスタンスを前もって初期化したくない場合は効果がでるかもわからん

0993名前は開発中のものです。2008/05/11(日) 21:07:32ID:5xrxRK37
>>987
不幸なことに、シングルトンが必要と思われるケースのプログラムを
今までに組んだことがありません。
極端な言い方をすれば、この先シングルトンを使う場面に遭遇しなければ
シングルトンが何なのかさえ分かりません。
知っていて使わないのと、知らないで使えないのでは大きく意味が違うと思います。
0994名前は開発中のものです。2008/05/11(日) 21:29:15ID:2XRRQTqQ
ム板のデザインパターンスレに戻った方が良いと思うよ。
ここはGoFすらろくに知らないで設計語ってるスレだから
0995名前は開発中のものです。2008/05/11(日) 21:32:50ID:FPktO55d
業務系とゲーム系だとまた求められてるものが違うから

スコープはコンテナが管理するというのが今の流れだよね
シングルトンであるとかプロトタイプであるとかで構成は変えないしね

ゲームなら面とかでスコープかえると初期化が楽になるかもしれないけど
メリットはあまりないかと

オンラインゲームなら必須の知識ではあるけど
0996名前は開発中のものです。2008/05/11(日) 21:45:37ID:GgT2def3
>>993
だったら使うなよ。くだらん豆知識さっさと忘れてゲーム作れ。
気がつけば「あ、これシングルトンだったね」と気がつく日もあるだろう。
0997名前は開発中のものです。2008/05/11(日) 21:55:34ID:5xrxRK37
>>996
失礼ですが、他の人が言ったことを繰り返して言っているだけの言動からは
貴方がデザインパターンを理解しているとは到底思えません。
0998名前は開発中のものです。2008/05/11(日) 22:13:28ID:GgT2def3
挙句の果てに、妄想で批判とか、折角ゲーム作るように促してやってるのに困った奴だな…
0999名前は開発中のものです。2008/05/11(日) 22:24:00ID:5xrxRK37
>>998
スレタイを確認した方が良いんじゃないですか?
1000名前は開発中のものです。2008/05/11(日) 22:24:58ID:5xrxRK37
他の方々のレスは大変参考になりました。
ありがとうございました。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。