ゲームにおけるデータ構造・クラス設計・パターン2
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2008/05/23(金) 21:10:59ID:8M1gqhPXどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
前スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1155209226/
テンプレ追加事項あったらよろすく
0265名前は開発中のものです。
2008/07/22(火) 18:36:04ID:Jekk8SUvあ、Dreamcastという例外があるか
0266名前は開発中のものです。
2008/07/22(火) 20:52:26ID:6od3yLDuDirectXそのものを使ってるかどうかは知らないが。
0267名前は開発中のものです。
2008/07/25(金) 15:29:12ID:9vpYBrtF0268名前は開発中のものです。
2008/07/25(金) 20:06:41ID:66T6bhjF板違い
プログラマー@2ch掲示板
http://pc11.2ch.net/prog/
0269名前は開発中のものです。
2008/07/26(土) 01:19:05ID:+2uolo1R0270名前は開発中のものです。
2008/07/26(土) 02:28:02ID:Esaqa0cW0271名前は開発中のものです。
2008/07/28(月) 18:13:52ID:9GhNVVJ3後者はなんだ?状態フラグ読んで条件分岐すればコマンド変化はいくらでも管理できるでしょ
それともzorkみたいなやつかな。それだと構文解析が肝だろうなあ
0272名前は開発中のものです。
2008/07/29(火) 14:37:45ID:kHD6g876なるほど。フラグの状態で、出るコマンドを制御すればいいのか。
サンクス
0273名前は開発中のものです。
2008/07/31(木) 18:14:30ID:ucHp1Nqpメニューオブジェクトを生成してどうこうみたいな。
0274名前は開発中のものです。
2008/07/31(木) 21:20:41ID:Gc2qBZ+Rクラスにしたほうがアクセスの統一をはかれる分いいかなぁ。
まーメニュー触るコードが一箇所ならどっちでもいいんでね?
ようはクラスにするしないじゃなくて
複雑さを無くしたり楽するためにどうするかだから。
0275名前は開発中のものです。
2008/07/31(木) 21:26:22ID:NXR7vyyv0276名前は開発中のものです。
2008/07/31(木) 21:38:09ID:A+bu5iPxだいたい同じインターフェースを実装してる。
0277名前は開発中のものです。
2008/08/01(金) 00:01:16ID:yD3o9/Ufprivateにしたメンバをもつクラスを保持しているクラスから、そのprivateメンバにアクセスしたいときに
get()で呼び出すのが面倒なんだが・・・・publicならそのまま呼び出せるし
0278名前は開発中のものです。
2008/08/01(金) 00:11:49ID:yp70Uz6tクラス使って日の浅い俺はset()、get()作りまくり。確かにメンドイ。
たぶん何か間違っている。
0279名前は開発中のものです。
2008/08/01(金) 00:14:41ID:GzWnlC6Z俺も同じようなこと悩んでて、気がついたら両方混在してた。
「これはクラスじゃない、構造体なんだ!」
って言い聞かせながらところどころpublicにしてたりw
0280名前は開発中のものです。
2008/08/01(金) 00:22:47ID:z2aBgJTr全部にgetter/setter作る意義って、メンバごとに独自処理必要な場合だろ
そういうの不要ならpublicなり言語の提供するアクセサメソッド簡略化機能とうかで構わんて
0281名前は開発中のものです。
2008/08/01(金) 00:28:14ID:4UGZmRTZコード書くのがマンドイだけなんじゃ?
まっしなIDEやプロパティのある言語つかうとかかな。
0282名前は開発中のものです。
2008/08/01(金) 00:32:32ID:GzWnlC6Z例えば、「すばやさ」と「回避率」と「盾の大きさ」というメンバ変数があったとする。
仕様変更により、これら三つを「守備力」に統合しようとしたとき、
各メンバ変数へのアクセスが全てアクセサメソッド経由なら、
そのクラスの変更だけで終わってしまう(ごまかせる)というメリットがあるよ。
0283名前は開発中のものです。
2008/08/01(金) 00:36:38ID:z2aBgJTrすばやさにアクセスしても盾の大きさにアクセスしても「守備力」が変わるって設計で良いなら構わんが……
守備力を出すクラスなりが仲介して、他のパラメータを元から束ねてた場合の話って事かな。
ちょっとエスパー疲れるぞ?
0284名前は開発中のものです。
2008/08/01(金) 00:47:59ID:GzWnlC6Zまあ、そういうこともあるさ(汗)
ここはお茶を濁しながら、オブジェクト間の結合を弱めましょうとか何とか言って、逃げようかな。
あと、全部アクセサメソッドつけたくなる理由は、Java beansに対応させるってのもあるな。
シリアライズしてXMLでデータを吐けるとか特典があったはず(要らない特典かも)。
0285名前は開発中のものです。
2008/08/01(金) 00:54:19ID:b/gVwGdZpublicにした方が使う側は書きやすくでいいんじゃないの?と思うわけ。
ああ、でもsetterに値のチェックとか入れれるのか・・・・
0286名前は開発中のものです。
2008/08/01(金) 01:01:50ID:b/gVwGdZ取得側で配列格納用の変数も用意しないと取得した配列の要素にアクセスできないし、
非常に手間。
0287名前は開発中のものです。
2008/08/01(金) 01:02:58ID:tFL87oCT気が向いたらprivateにして、
それまで直接アクセスしたるところを、
大河の流れのように涙を流しながら直せば無問題。
0288名前は開発中のものです。
2008/08/01(金) 01:07:26ID:b/gVwGdZなるほど。あまりスッキリしないやり方ですが、しょうがないですかね。
いちいちget()で呼んで、呼び側の変数のセットして使うのって、スループット高そうなのもイヤなんですよね。
0289名前は開発中のものです。
2008/08/01(金) 01:09:03ID:b/gVwGdZ0290名前は開発中のものです。
2008/08/01(金) 01:19:38ID:ua9U6ROuメソッドが多くて中で使いまくるならclassで隠蔽。メソッド内でもget、set呼ぶ。
データの集合でしかなくメソッドが簡単な処理しかないならstructでpublic化かな。
コンストラクタ、コピーコンストラクタ、代入、比較演算あたりまでならstructで。
0291名前は開発中のものです。
2008/08/01(金) 01:32:56ID:b/gVwGdZこういうのって、センスが必要ですね・・・・。
ちょっと気になった事があるんですが、
自分のクラスのpublic関数が、内部で自分のクラスのprivateなメンバを使う場合、
わざわざgetterで呼び出して使う必要はないですよね?
class Foo{
private int a;
public int get(){ return a;}
public int calc(){
return get() * 2;
}
このようなcalc()の書き方に利点はあるのでしょうか?
0292名前は開発中のものです。
2008/08/01(金) 02:26:05ID:ua9U6ROu内部だけで使うprivateメンバ変数と意識して区別できるとか
関数内のローカル変数と名前が被ってもメンバ変数を指してるのが一目瞭然とか。
命名規則で見分けられるようにするのが良いんだろうけどなるべくそうしてる。
0293名前は開発中のものです。
2008/08/01(金) 03:52:45ID:eorE7C0S0294名前は開発中のものです。
2008/08/01(金) 04:12:11ID:gQhqelIhまず public なインターフェースが決まって、その後で必要なメンバ変数を private で考えるのが筋だろ。
0295名前は開発中のものです。
2008/08/01(金) 18:37:49ID:YDkT93Ih今まで作ってきたゲームの焼き直しなら、現実的なやり方だね。うん。
0296名前は開発中のものです。
2008/08/01(金) 19:02:25ID:m4Vy5Xwk個人製作なら気に入らなければ壊して作りなおせるからそれでもいいけど
それにこだわって完成させられない場合が多い気がする
0297名前は開発中のものです。
2008/08/01(金) 20:43:12ID:mQpnHwPhプライベートメンバ変数にはアクセッサを用意すべき。
単なるクラスだけでプログラムするんだったら、位置とか角度とか見たいなアクセス頻度の高い
メンバはパブリックのほうが良いかと思う。
0298名前は開発中のものです。
2008/08/02(土) 00:14:18ID:n2w2ONnP0299名前は開発中のものです。
2008/08/02(土) 00:25:25ID:MidBaG0Q0300名前は開発中のものです。
2008/08/02(土) 06:50:04ID:xZ8r6Jdxプロパティが欲しいと。
0301名前は開発中のものです。
2008/08/02(土) 11:52:40ID:eytLWJfu0302名前は開発中のものです。
2008/08/02(土) 23:43:30ID:Pnu26psa0303名前は開発中のものです。
2008/08/03(日) 02:53:56ID:DVblpxWKもう少し具体的に
0304名前は開発中のものです。
2008/08/03(日) 16:40:36ID:HN+lqKwd現行のゲーム機はまだC++なんだよな
0305名前は開発中のものです。
2008/08/03(日) 21:47:19ID:XQeDRsrLシーンってのが何を指してるのかが微妙すぎ。
VMCに分けろじゃないけど、
Visual面だけでシーンを切り分けるのがいい時もあるし、
Dataの読み込みや各種準備の時が切り分けにてきしてる場合もある。
そうじゃなくて、Loopを二つぐらい回しながら、
片っぽでバックの処理こなしつつリアルタイム進行で、
残りで、Interfaceを回してくタイプとかもあるし、
結局どんな処理が必要などんなゲームなのか?
どれを止めると不味いか、どれは止めても復帰させれば問題ないか?
とかによると思う。
0306名前は開発中のものです。
2008/08/03(日) 21:52:25ID:qGD4tU/fタイトルー本編ーゲームオーバ
てな感じジャンか。細かいところは違えども。
ゲーム全体の状態遷移をどうするか聞いてんじゃないの?
0307名前は開発中のものです。
2008/08/03(日) 22:00:54ID:0ZCECk8Oウィンドウ管理、イベント管理、衝突判定、FPS調整、各オブジェクト行動などがセットになっとるでごわす。
シーンの切替えはこのセットをまるごと取り換える作業なのですたい。
0308名前は開発中のものです。
2008/08/03(日) 23:21:42ID:HN+lqKwd0309名前は開発中のものです。
2008/08/03(日) 23:31:02ID:+gPnPllxDigital Anime Artwork(1/2)って本が内情ノウハウ溢れてて参考になった。
ほんとフォルダ分けの徹底とワークフロー統一にどこも頭悩ませてるようだ。
いまどきだとプロジェクションマップとか多用する規模の物も多いしな、美術、撮影、合成と
0310名前は開発中のものです。
2008/08/03(日) 23:31:41ID:+gPnPllxうわ俺凄く恥ずかしいマジレス?
0311名前は開発中のものです。
2008/08/03(日) 23:31:45ID:0ZCECk8Oムービーシーンなんて作ったことないからわからんですたい。
脳内妄想では、ムービーを再生できるオブジェクトが登録されてるシーンに移行するだけですたい。
0312名前は開発中のものです。
2008/08/04(月) 17:38:42ID:OcXTlg2n馬鹿にしないでください><
0313名前は開発中のものです。
2008/08/04(月) 23:28:56ID:Vp8LYTR0こらあげにまっことすまんかったぜよ。
0314302
2008/08/04(月) 23:40:39ID:OTznAvMdそうそうそんな感じ。
1シーンの処理は画像やその他のデータの読み込み、メインループ、
次のシーンに移る前の要らないデータの破棄のような感じにするつもり。
前のシーンに戻れるように階層構造を使ったりしたら難しくなりそう。
0315名前は開発中のものです。
2008/08/07(木) 02:18:10ID:iFGNdN4xしーん…
0316名前は開発中のものです。
2008/08/07(木) 15:44:15ID:J5sJkFaL∴∵
0317名前は開発中のものです。
2008/08/24(日) 00:35:34ID:kCbI2Ziv0318名前は開発中のものです。
2008/08/27(水) 21:03:35ID:pp3RgERm例えばマリオなら、
enum { SMALL, BIG, FIRE };
enum { STAR, NOT_STAR };
のように、直交した状態ごとにenumで列挙して、ifで場合わけするのでしょうか?
stateパターンでは無理???
0319名前は開発中のものです。
2008/08/27(水) 21:31:52ID:tgwWcjRqFCマリオならそのenumに加えて、ゲームステータスとして「巨大化アニメ進捗」を示すカウンタ用意すれば十分だと思う
ステータス変化中に他の画面止めていいのか、それとも無敵時間とか起きながら遷移中にも時間は動かすのか前提がもうちょい欲しいかも。
その辺の細部を徹底的に見つめていくと、
適するパターンがあるのか、それとも独自な設計選ぶべきかが見えてくるんじゃないかな。
マリオにしてもSFCのヨッシーとかFC版3での画面奥行き潜りとか、色々
実装したい事を見据えて行くと変数の数やステータスのまとめ方が見えて来るだろうしね。
0320318
2008/08/28(木) 00:48:01ID:Z+eKsEJGいろいろ考えないといけない事多いですね。
この手のものを実装する方法として、stateパターンとenumとifで場合わけの他に何かあるんでしょうか?
状態の種類と数が複雑になってくると、enumとifを使う方法しかない気がしてきます。
ifで場合分けって、コードが汚く感じてあまり好きじゃないんですよね。
でも、こういうケースでは、これがベストなのかなぁ。
0321名前は開発中のものです。
2008/08/28(木) 01:16:45ID:q3w3U78u好みと言うより仕方がない気も。
よくわからんなら下手に「なんとかパターン使うべきなのかな!」って
考えるより、ベタで汚いながらも「いじりやすい」単純なコードからはじめてさ、
あとはめくらめっぽう試した方がいいよ。
ifでの場合分けさえ、インライン展開される事を知ってるかどうかで汚くても使う訳で。
で、知ってる人にはそういうのやら三項演算多用した分岐の方を「美しい」って言っちゃったりするからねw
0322名前は開発中のものです。
2008/08/28(木) 01:34:35ID:O/+Qqs/2世間じゃどういうのが正しいんだろうとか考えて自分のコードが全然すすまねぇ
今ではなんだかんだで破綻するギリギリまで「動けばいいや」の精神で書いてる
仕事じゃないからこそだな
0323名前は開発中のものです。
2008/08/28(木) 03:20:26ID:tq3ymPlL可視性に問題が出てきそうで自分では使ってないけど。
0324名前は開発中のものです。
2008/08/28(木) 09:12:41ID:y2qhH8VC0325名前は開発中のものです。
2008/08/28(木) 10:11:26ID:MS2hHN8x全く別のオブジェクトを「発射」して、自分を「消滅」させることで状態の変化を表現してた。
0326名前は開発中のものです。
2008/08/28(木) 11:46:09ID:Qlb2/Pnm0327名前は開発中のものです。
2008/08/28(木) 11:57:21ID:MS2hHN8xJavaの場合は、状態クラスを作って、それを持つようにすればいいんだよ。
0328318
2008/08/28(木) 17:59:10ID:Z+eKsEJG汚いコードって書き直したくなってくるんですよね。
綺麗に書けないと達成感がないというか・・・。
また、本などで知識をつける毎に、今まで書いてきたコードが正しくない書き方だったな〜と思うことが多くて(プログラミング始めた頃はダライアス継承とかやってたw)。
完成させることが第一と思っていてもついつい・・。
>>323,327
stateパターンですよね?
>>325
そういう方法でやってるところもあるんですね。
でも、オブジェクトのコピーが効率悪そう。
0329名前は開発中のものです。
2008/08/28(木) 18:35:54ID:CuTVRbF+それよりも自分の達成感の方を優先したいならそっちを選べば良いさね。
つか、コードの正しさ、綺麗さ、効率の良さ、読みやすさってどういうものだとして使ってる?
0330名前は開発中のものです。
2008/08/28(木) 19:03:37ID:Jt4Hw7jN次のプログラムからは気に入った表記で。
昔の事は忘れましょう。
0331名前は開発中のものです。
2008/08/28(木) 19:43:21ID:MS2hHN8x>>328
>stateパターンですよね?
パターンのことはよく知りませんが、ポリモーフィズム(多態性)です。
0332名前は開発中のものです。
2008/08/28(木) 20:37:26ID:xedxyhWb敵が爆発する瞬間とかだとやっちゃうなあ……。効率悪いんだろうか。
0333名前は開発中のものです。
2008/08/28(木) 21:28:28ID:MS2hHN8x他に良い方法があるならどうぞ。
MHz世代のCPUで通用してた方法だから、致命的な効率低下があるとは思わないよ。
0334318
2008/08/28(木) 21:30:31ID:Z+eKsEJGコードの正しさ、綺麗さの2つは曖昧な表現で使うべきではなかったですね。
私はコードには、実行効率、保守性、読みやすさの3つがあると思っています。
今問題にしてるのは、主にこのうち後者2つです。
ただ、読みやすさは人それぞれなのかもしれません。
>>331
状態毎に仮想関数をオーバーライドするのが、まさにstateパターンですね。
0335名前は開発中のものです。
2008/08/28(木) 21:59:24ID:O/+Qqs/20336名前は開発中のものです。
2008/08/28(木) 22:18:17ID:qtCAmqfQ0337名前は開発中のものです。
2008/08/28(木) 22:22:03ID:xedxyhWb爆発オブジェクトを自身と同じ場所に生成して、自身を削除する
って認識で合ってる?
0338318
2008/08/28(木) 23:04:17ID:Z+eKsEJG保守性については、仕様変更により、状態を追加したり、廃止したりする時、影響する部分を探し出すのがめんどくさいというかすっきりしないというか。
読みやすさは個人的な好みかもしれません。
保守性、読みやすさともにstateパターンの方が好きです。
でも、直交した状態群が複数あるとき、stateパターンで実装するのが難しそうなので悩んでいました。
うまい方法が見つからなければ、enumとifでいくつもりでした。
>>336
ダイアモンド継承の方が一般的な呼び方なのかもしれません。
仮想継承を使うことによって、継承グラフが菱形になるやつです。
0339名前は開発中のものです。
2008/08/29(金) 00:44:03ID:hcEje8O4英語だと Multiple Inheritance あるいは Diamond Inheritance と言うようだが。
あとダライアス(Darius?)はペルシャ人の名前のようだ。
まゆに唾つけて聞いておこうかな
0340名前は開発中のものです。
2008/08/29(金) 00:50:36ID:rESH+j3Cデザパタへの無駄なこだわりとか、初心者がなんか変な用語がいっぱい並んでる本だけ読んで惑わされてるだけに見える
0341名前は開発中のものです。
2008/08/29(金) 02:39:33ID:VLtb7ZED違う概念だが...というかダライアスっていうとシューティングゲームしか思い浮かびませーん
0342名前は開発中のものです。
2008/08/29(金) 06:43:42ID:gdp2Jatd0343名前は開発中のものです。
2008/08/29(金) 10:26:08ID:ESvglHwU合ってると思うよ。
問題があるとすれば、状態を変化させるだけの場合、ライフとかのパラメータ引き継ぎどうすんねんとか。
そこんとこがツクールVじゃ無理だった。(最近の(95とか)はシラネ)
0344名前は開発中のものです。
2008/08/29(金) 14:31:33ID:UaA8GGvx>ダライアスっていうとシューティングゲームしか思い浮かびませーん
ダライアスの面セレクト画面が菱形継承図っぽいところから生まれた俗称だったりしてw
0345名前は開発中のものです。
2008/08/29(金) 14:34:13ID:nV9hYRuEいやだったりしてっつーかそれしかなくね
0346名前は開発中のものです。
2008/08/30(土) 13:56:18ID:vqGqt03LC3 MRO の解説でしか見たこと無いが。
0347名前は開発中のものです。
2008/08/30(土) 14:18:00ID:gGJd0yLwこれはいいアニメ。 ... ドラえもん 藤子F不二雄 アニメ
ドラえもん後期 ドラえもん本編 教育アニメ コメント非
表示推奨 緑 ...
http://ex-co-jp.8866.org/gourmet/080803.rar
0348名前は開発中のものです。
2008/08/30(土) 14:23:18ID:h7pQaJrI0349名前は開発中のものです。
2008/08/30(土) 14:32:04ID:hoYQeFVI0350名前は開発中のものです。
2008/08/30(土) 14:40:33ID:vqGqt03L0351名前は開発中のものです。
2008/08/30(土) 15:36:27ID:h7pQaJrI0352名前は開発中のものです。
2008/08/31(日) 15:40:22ID:5jP5dBFCAで作ったEをDで使うために、Aから呼び出したB、Bから呼んだC、Cから呼んだDのそれぞれの関数の引数に
Eを渡していくのはいいのかな?
0353名前は開発中のものです。
2008/08/31(日) 15:45:26ID:eaWcmeF00354名前は開発中のものです。
2008/08/31(日) 15:47:56ID:fQJxWw7jEの役割によってはABCD全てからアクセスできる領域に置くのもアリかもね
なんにせよその構成だけじゃいいとも悪いとも言えない
0355名前は開発中のものです。
2008/08/31(日) 15:54:48ID:5jP5dBFC>>354
サンクス
AからDは直接呼べないけど、Eを使うのはDなので、
AからDにEを渡したいけど、それだけのために間にクラスでEをたらし回しにするのがどうかな〜と
思ったんだよね
0356名前は開発中のものです。
2008/09/02(火) 03:29:08ID:m23QvXa70357名前は開発中のものです。
2008/09/02(火) 03:31:07ID:m23QvXa7コンポジッションの視点、あるいはチェインズ・オブ・レスポンシビリティの視点で言えば、
それは普通にアリ。 っていうか、>>354 も言ってるけど、その構成だけだと(意図する形の意味づけが見えないと)
本当はいいとも悪いとも言えないが。
0358名前は開発中のものです。
2008/09/02(火) 17:16:20ID:BpB/a+5NTireクラスもCarクラスを持っていてCarクラスの関数を使えるという設計はいいんでしょうか?
0359名前は開発中のものです。
2008/09/02(火) 17:22:14ID:Kf1ObPTzTireクラスでCarクラスを生成するとかなら論外
0360名前は開発中のものです。
2008/09/02(火) 17:30:36ID:BpB/a+5Nいいということでしょうか?
0361名前は開発中のものです。
2008/09/02(火) 17:36:03ID:NydWLubYTireが常にCarのポインタを持っている必要もなくて、
CarがTireのメソッド呼び出し時に必要なポインタを渡すのもアリだと思う。
0362名前は開発中のものです。
2008/09/02(火) 17:40:44ID:IXiySr/S0363名前は開発中のものです。
2008/09/02(火) 17:42:28ID:NydWLubY0364名前は開発中のものです。
2008/09/02(火) 17:44:29ID:IXiySr/S■ このスレッドは過去ログ倉庫に格納されています