ゲームにおけるデータ構造・クラス設計・パターン
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2006/08/10(木) 20:27:06ID:BnvyxuCBどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0422名前は開発中のものです。
2007/07/18(水) 02:48:50ID:vN51PGaN> ・動作をデータに対してではなくゲーム上のオブジェクトに対して書けること
「データ」と「ゲーム上のオブジェクト」の違いがよくわかりません。
「動作を〜に対して書ける」ってのもよくわかりません。
「〜を引数とする関数を書くことができる」ってことでしょうか?
0423名前は開発中のものです。
2007/07/18(水) 05:52:53ID:1k3Xg7ZP>・データと動作を分離する事と
これのせいだと思う
誰が吹き込んだんだか知らんがまず>>413がしなきゃいけないことはこいつを殺すことだ
0424名前は開発中のものです。
2007/07/18(水) 18:10:13ID:sTmzL7Mkこうすると、CData::valueの型は何になるの?
0425413
2007/07/18(水) 19:28:34ID:xDBgIMCC>つまりテンプレートで実装する意味は無いよね
恐らく既存の構造体を利用するためにこうした筈なんですが
普通にそれらをCDataにスマポで持たせた方がいいじゃんじゃんな気もしてきました
>>421
おっしゃるとおりです
細かいところにとらわれて本質を見失うという悪い例を晒してしまいました…
>>422
>「〜を引数とする関数を書くことができる」ってことでしょうか?
そうです
キャラクタの移動や描画の際は、リソースのハンドラを移動クラスや描画クラスに渡すんでなく
CDataを渡すような形で書きたいわけです
>>423
なんかキャラクタのクラスに座標構造体と移動メソッドを定義してたソースを友人に見せると
値を保持するクラスと操作するクラスは分けろこのスカポンタンとか言われたのでそうするようにしてるんですが
何か思い違いをしてますか…と問うまでもなく明らかにしてますね
>>424
晒したコードでは見事に多重定義のエラーになりました
実際はそれ避けたり多重定義されたIDataのvalueを内部で扱うためにboost::mplとか使って
さらに複雑な事やってるんですが>>417氏の言ってる事に繋がりますね
とりあえず苦労して作った車輪は最発明どころかガラクタですらないナニカだったというオチでした
もっかい一から作り直してみますm(_ _)m
0426名前は開発中のものです。
2007/07/18(水) 20:55:21ID:ux1Fssbs> 値を保持するクラスと操作するクラスは分けろこのスカポンタン
インターフェースと実装を分離するのは一般論としては間違いじゃないが、粒度が違う。
メンバ変数単位ではなく、意味のあるメンバ変数のセットをインターフェースにしろって
意味だと思うよ。
// 衝突判定後に、消灯判定マネージャから衝突回避のために位置をずらされる
struct IMovable {
// 現在位置
virtual void getPosCur(VECTOR3* p) const = 0;
// 移動したい位置
virtual void getPosNext(VECTOR3* p) const = 0;
// 衝突しないようにマネージャがずらした位置
virtual void setPos(VECTOR3 const& v) = 0;
};
class Player : public IMovable { ... };
class CollisionManager { /* こいつは IMovable だけ使用 */ };
こういう話かと。
0427名前は開発中のものです。
2007/07/18(水) 20:55:52ID:ux1Fssbss/メンバ変数のセット/メンバ関数のセット/g
0428名前は開発中のものです。
2007/07/18(水) 23:49:47ID:1k3Xg7ZP>値を保持するクラスと操作するクラスは分けろこのスカポンタンとか言われたのでそうするようにしてる
なんでそうしなくちゃいけないか理由は分からないの?
プログラムは芸術じゃないんだから外の人のどうしたこうしたで中身が変わったりしないよ?
0429名前は開発中のものです。
2007/07/19(木) 00:19:41ID:RaZNmmmqつかこれ自体間違いだろ。
0430名前は開発中のものです。
2007/07/19(木) 00:38:54ID:PDuVn1kaだよな多分
0431名前は開発中のものです。
2007/07/19(木) 05:21:01ID:5YEt12VO触らせたくないなら、関連クラスからのみアクセスとか(C++ならfriend?)
それ以上ってコストかかりすぎねえ?
0432名前は開発中のものです。
2007/07/19(木) 11:40:10ID:LxxDZCLh0433名前は開発中のものです。
2007/07/19(木) 15:01:29ID:3ArgKadV開発期間中に、年単位で空白があったコードを読むこともあるわけで。
そういう場合は、アクセス権は考えといて損はねーですがよ。
0434名前は開発中のものです。
2007/07/19(木) 18:50:40ID:TacCeKvZそんなファイルのパーミッションみたいな機構小規模だろうが大規模だろうがつけたらあかん
というか無駄、損がないというか何の得もない
0435名前は開発中のものです。
2007/07/19(木) 18:59:00ID:ajveBJeZ0436名前は開発中のものです。
2007/07/19(木) 19:27:00ID:3ArgKadV>>432のアクセス制限って、クラスのメンバーに対することで、
>>433のアクセス権ってのもそのことだろ?
0437436
2007/07/19(木) 19:27:51ID:3ArgKadV正しくは、
なんでファイルのパーミッションの話になってるんだ
>>433のアクセス権って、クラスのメンバーに対することで、
>>432のアクセス制限ってのもそのことだろ?
0438名前は開発中のものです。
2007/07/19(木) 19:39:53ID:/RFbeqQbということではなかろうか>ファイルシステムの例え話
個人管理のLinuxなんかだと、最初からrootでログインして使う人もいるくらいだから
それはそれで別に当人の自由だと思う。
要はアクセス権限を分ける方がトクか分けない方がトクかは
ケースバイケースで判断すればいいってことだけど
0439名前は開発中のものです。
2007/07/19(木) 20:12:33ID:TacCeKvZおまえがアクセス権なんていうからじゃん
0440名前は開発中のものです。
2007/07/20(金) 12:39:13ID:vUDuhb3O0441名前は開発中のものです。
2007/07/20(金) 12:40:51ID:vUDuhb3O0442名前は開発中のものです。
2007/07/20(金) 21:52:02ID:+3gqdIHH他のオブジェクトにアクセスして欲しくないメンバは
クラスの中に隠蔽して、プライベートメンバにしておくのがセオリーでは。
アクセス権ってのは本来そうやってコントロールする。
外からオブジェクトにアクセスできるようにしておきながら
アクセスできないように制限する仕組みを作るってのがナンセンス。
0443名前は開発中のものです。
2007/07/20(金) 22:07:32ID:lyxTTGt6特定の状況でのみ●●に大して××させることを許可するとかいう話なら
ソースレベルで静的に操作するのは困難
0444名前は開発中のものです。
2007/07/20(金) 22:32:40ID:+3gqdIHH状態に応じてアクセスを許すかどうかを決めればいいのでは。
0445名前は開発中のものです。
2007/07/20(金) 22:52:28ID:+3gqdIHH今頃boostにそれらしいクラスが含まれていると思うけどね。
例えばnoncopyableはオブジェクトのコピーを禁止するクラス。
こんなレベルのものでも有用さが認められればboostに仲間入りできる。
http://www.kmonos.net/alang/boost/classes/noncopyable.html
でも今現在boostにアクセス権制御のクラスがないってことは、
需要がないってことでは?
まずはプライベートメンバを使ったシンプルな隠蔽によるアクセス制御で
どこまでできるのか突き詰めてみた方がいいでしょ。
今のところ自分はそれで困ったことはないけどね…。
0446名前は開発中のものです。
2007/07/21(土) 00:49:20ID:DMrsrXyJ0447名前は開発中のものです。
2007/07/21(土) 01:16:04ID:oWQ5iQEX動的にアクセス権決めるならgetter,setterを隠蔽してfunction使ってアクセス権を与えたいクラスに
そのgetter,setterを与えてやるって方法もあるけど
functionは1個で40bytes近く食う割と重たい(?)オブジェクトだから無茶かな、無茶だな
0448名前は開発中のものです。
2007/07/21(土) 03:00:31ID:DMrsrXyJ認証の機能の話になってしまうんじゃ?RMIとかそーいった話の流れ方向での
静的だと外側の構造も知らん一クラスごときが誰に使われるのが良いだ悪いだ
決めるとか何いい気になってんだって話だ
>>443
>静的に操作するのは困難
困難どうこうより、そのポリシーを決める根拠をどこにも求められないということだよ
適当に決めてしまえば後で直せなくなる
根拠がどこにもないから
0449名前は開発中のものです。
2007/07/22(日) 02:55:07ID:/VC165Eoインターフェースを多重継承して、必要な時・相手にアップキャストしたものを渡せば。
0450名前は開発中のものです。
2007/07/22(日) 03:36:44ID:jrExVTdK0451名前は開発中のものです。
2007/07/22(日) 13:24:51ID:/VC165Eostruct IFoo { virtual Vec3 getPos(); const = 0; };
struct IBar { virtual setPos(Vec3 const& pos) = 0; };
class CPlayer : IFoo, IBar { ... };
f1(IFoo&);
f2(IBar&);
CPlayer player;
f1(player); // f1には getPos() しかさせない
f2(player); // f2には setPos() でメンバ変数書き換えを許可
0452名前は開発中のものです。
2007/07/22(日) 15:08:54ID:PSHVXCKbfunctionって40byteも食うの?
その半分くらいですみそうなんだけどな。
0453名前は開発中のものです。
2007/07/22(日) 18:59:44ID:jrExVTdK参考になりましたありがとうございます。
0454名前は開発中のものです。
2007/08/05(日) 01:30:04ID:CiKwXSKt0455名前は開発中のものです。
2007/08/05(日) 07:10:10ID:4IAfjfpf小さなオブジェクトが多数 new されそうって意味? 気にしなさんな。
0456名前は開発中のものです。
2007/08/05(日) 07:37:18ID:CiKwXSKtアロケータ作れば何とかなるだろうし。
0457名前は開発中のものです。
2007/08/05(日) 20:35:16ID:ki20ixME0458名前は開発中のものです。
2007/08/05(日) 20:46:45ID:4IAfjfpfふつーにメンバ変数使えばいいだけでは? Task Control Block なんてのは、アセンブリ時代の名残だから、
C++, Java あたりでは使わんでしょ。
0459名前は開発中のものです。
2007/08/06(月) 00:04:42ID:Mz0XA0lP0460457
2007/08/06(月) 00:40:04ID:wjb80OI1こんな感じに組みたいんだけど、javaには関数ポインタがないので、引っかかり中。
0461名前は開発中のものです。
2007/08/06(月) 00:44:36ID:N/EWx1nSまじめに勉強したら?
0462名前は開発中のものです。
2007/08/06(月) 00:45:37ID:N/EWx1nS0463名前は開発中のものです。
2007/08/06(月) 02:03:36ID:dDj8AjaHここはeCosに実装されたwabaを紹介してやるのが筋だろうか
0464名前は開発中のものです。
2007/08/06(月) 03:43:57ID:r8MqGT/t0465名前は開発中のものです。
2007/08/06(月) 07:16:51ID:R+5scQVeJava だとインターフェースもしくは抽象基底クラス使う。
0466457,460
2007/08/06(月) 22:38:48ID:dCjdYchVaを規定クラスにしたb2タスク
b1、b2タスクが混在したリストを作成したい。
C/C++なんかだと、関数ポインタnextなどにタスクをつなげてゆけるところだが・・・
javaだと関数ポインタがないので、配列にしてインデックス参照にするしかないのだろうか?
インデックス参照だと、個々のタスクごとに属性を割り振って、別々に読み出すか32bit以内に押し込むかなどして値を管理し、switchで分岐
して実行する記述が必要・・・。
C++なら多重継承があるので、b1からb2にたどることもも可能だが、javaには多重継承はないし・・・。
インターフェースは同じインプリメントを保障してくれるだけど、結局タスク切り替えのロジックが必要になるし・・・。
関数ポインタに比べて、これだと積極的に使うにはオーバーヘッドが気になるのと、記述が煩雑でプログラム的にCより退化しているように感じてしまう。
(今はリスト構造にせず、配列でタスクリストを持つ方向性で考慮中・・)
0467457,460
2007/08/06(月) 22:41:30ID:dCjdYchV0468名前は開発中のものです。
2007/08/07(火) 00:03:46ID:ziyaQFb30469名前は開発中のものです。
2007/08/07(火) 00:17:53ID:2nrPyfF80470名前は開発中のものです。
2007/08/07(火) 00:42:53ID:lyE3j1c/0471名前は開発中のものです。
2007/08/07(火) 01:25:29ID:/sDbVbxZぐちゃぐちゃ言ってないで書いてみろ。あんまりにも考察がめちゃくちゃで
どこから突っ込んでいいのかわからん。ソース晒してみれば突っ込みも入れやすい。
0472名前は開発中のものです。
2007/08/07(火) 01:55:24ID:sukzLC0P日本語でおk
0473名前は開発中のものです。
2007/08/07(火) 03:33:11ID:jZSDWWPE参照使え馬鹿
0474名前は開発中のものです。
2007/08/07(火) 03:37:03ID:Qoe4Y4zA0475名前は開発中のものです。
2007/08/07(火) 06:44:09ID:vUw1LN3QLinkedList の方が。
0476457,460,468
2007/08/07(火) 07:55:20ID:8/4fXdcaこれのjavaでの代用法が知りたい。
0477457,460,468
2007/08/07(火) 08:07:53ID:8/4fXdcaThanks! >> 475
0478名前は開発中のものです。
2007/08/07(火) 08:09:00ID:/sDbVbxZjava.lang.Runnable func;
0479名前は開発中のものです。
2007/08/07(火) 08:24:51ID:88OVU+XCaを要素にとるコンテナを宣言して
それにb1インスタンスだのb2インスタンスだのを加え、
コンテナを走査して処理メソッドを順に呼び出せばいいだけの話。
データ構造だとかクラス設計だとかいうレベルじゃない。
単にプログラミング言語の勉強が足りていないだけ。
それにお前は多重継承を激しく誤解している。出直して来い。
0480名前は開発中のものです。
2007/08/07(火) 10:39:17ID:98Sz9x7X0481名前は開発中のものです。
2007/08/07(火) 10:48:42ID:TDGAxW6A>>460では関数ポインタ使ってなくね?
0482名前は開発中のものです。
2007/08/07(火) 14:27:28ID:lyE3j1c/0483名前は開発中のものです。
2007/08/07(火) 14:28:52ID:gmxLaOKzSwingでやってハマるとかw
関数ポインタに直感的に一番近いのはjdk7までお預けだな。
javascriptならそのまま
(function(num){ print(num);})(100); //-> 100
だが。
0484名前は開発中のものです。
2007/08/07(火) 15:06:05ID:2nrPyfF8日本語でおけ
0485名前は開発中のものです。
2007/08/07(火) 19:51:36ID:LOGzBd/R0486名前は開発中のものです。
2007/08/07(火) 20:52:36ID:2nrPyfF8>Swingでやってハマるとか
理解できないのはこの部分だ
0487名前は開発中のものです。
2007/08/07(火) 23:28:41ID:rZkCIKw7もしそうなら >478 が言いたいのはRunnableのインターフェースだけを
借りることだろうから話が飛躍してるな。
0488名前は開発中のものです。
2007/08/07(火) 23:51:16ID:vUw1LN3Qだから抽象基底クラスかインターフェース使えと。下のサンプルコードは C++ だが、Java でも
ほとんど変わらん。
#include <boost/foreach.hpp>
#include <boost/ptr_container/ptr_list.hpp>
struct ITask {
virtual ~ITask() {}
virtual void exec() = 0;
virtual void draw() const = 0;
};
class TaskManager {
public:
void exec() { BOOST_FOREACH(ITask& task, m_tasks) task.exec(); }
void draw() const { BOOST_FOREACH(ITask const& task, m_tasks) task.draw(); }
private:
boost::ptr_list<ITask> m_tasks;
};
0489名前は開発中のものです。
2007/08/08(水) 00:01:44ID:2nrPyfF8優しいな
0490名前は開発中のものです。
2007/08/08(水) 07:33:12ID:71C/M+UGさも凄まじいシステムであるかのように
タスクシステムと言う人の気がしれない
0491名前は開発中のものです。
2007/08/08(水) 07:48:40ID:4PM0J5aw歴史を勉強しましょう
0492488
2007/08/08(水) 07:51:26ID:obrNCieZ同意。
アセンブリ言語でハードコーディングしていた時代に初めて見たら「やるな」と思うが、
今時だとふつー過ぎて何も言うことがないよね。UNIX V6 のころのデバドラも、既に
こんな作りだし。
自分でコード書くのもいいけど、もっとコード読もうよ、と思う。
0493名前は開発中のものです。
2007/08/08(水) 07:53:43ID:HMa+110cTCBを弄り回してた時代のことを知らないんだろね
0494名前は開発中のものです。
2007/08/08(水) 08:21:56ID:XmcrCIW0タスクシステム総合スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1173708588/
0495457,460,466,476
2007/08/09(木) 01:21:26ID:WI6u6LTt抽象基底クラスは知っていたが、
仕様上、基底クラスから上位のクラスをたどる必要があったので、
関数ポインタ云々といっていたのだが・・
キャストすればよいだけだった。
javaにはポインタの概念がないから、
javaのクラスは当然キャストできない、というような誤解があったので。
0496名前は開発中のものです。
2007/08/09(木) 01:24:51ID:Tm6LW0Jpそれなんか設計がおかしくないか?
みんなの意見無視ってところか
0497名前は開発中のものです。
2007/08/09(木) 02:27:45ID:RcnrWFRiそんな仕様にするのが悪い。
第一、抽象基底クラスを知っているのならば
そんなところで困ったりしない。
0498名前は開発中のものです。
2007/08/09(木) 02:50:07ID:yVPi3RJq0499名前は開発中のものです。
2007/08/09(木) 03:14:21ID:v8CPCZuZ0500名前は開発中のものです。
2007/08/09(木) 04:12:56ID:k08h5JG9ポリモフィズムをカケラも理解しとらんじゃないか
0501名前は開発中のものです。
2007/08/09(木) 04:46:19ID:BskRNsfrまともな意見すら無視するような勉強不足君は
鮮やかに放置して、次の話題ドゾー
0502名前は開発中のものです。
2007/08/09(木) 05:27:24ID:nQyaGvDb質問者はどちらの属性も持ってるけど
0503457,460,466,476,495
2007/08/10(金) 20:04:16ID:aK9bbQO3>>488
解決のヒントになりました。
ただboostライブラリはjavaにはないような気がします。
>>468
Vectorの案内が最初の解決のヒントになりました。
0504名前は開発中のものです。
2007/08/11(土) 20:49:07ID:AcYB8hIqさんざん情報貰ったんだから、せめてソース晒して恩返ししてみないか?
0505名前は開発中のものです。
2007/08/17(金) 01:53:51ID:7sSY46ad0506名前は開発中のものです。
2007/08/21(火) 16:35:31ID:/oULNmRu例えばRPGで、キャラデータ・アイテムデータ・フラグおよび
ゲーム内システムデータ(ゲーム世界での日付とか)は、
それぞれグローバルなデータクラスにしてるんですが、
もうちっとスマートな設計の仕方はないでしょうか?
ほぼ全てのインスタンスから参照するデータ(例えばフラグとか)って、
いちいち参照やポインターで格納させるよりか、データクラスとしてグローバルに
展開してメソッド経由でアクセスさせたほうがいいような気がするど素人なんですが、
こんな俺はオブジェクト指向として根本的に間違ってますね?
0507名前は開発中のものです。
2007/08/21(火) 18:54:06ID:/OCncB5N0508名前は開発中のものです。
2007/08/21(火) 19:55:25ID:LQCVNOKZ>>507に同意
オブジェクト指向をしたいのか、ゲームを作りたいのか。
書き方に明確な規則やルールがあれば、それだけでいいと思うけどね。
でも自分が「オブジェクト指向的」に組むなら、その辺の情報はグローバルにはしないと思う。
必ずシステム内で生成する。何故なら、ゲームシステム≠ゲームの世界と考えてるから。
1.ゲームシステム=ゲームの中の宇宙を作る(ゲームシステム=プログラム本体)
2.宇宙の中に惑星を一個作る。(ゲーム世界(日付等含む))
3.ゲームの世界の中に、登場人物やアイテムを作る。(キャラクターデータ、アイテムデータ)
4、登場人物とアイテムは、状態を所有している。(フラグ)
単純に現実に沿って状態を作る(これがRPG向きか?と言われると、そうではないけど)
データは必ず1→2→3→4の順にアクセスする。面倒くさいけど、一応これにも利点がある。
・ゲーム内での登場人物の役割を切り替えやすい。
・同時に複数キャラが操られても破綻しにくい。(マルチプレイさせやすい)
・同様に、ゲーム世界以下の要素は増やすのが比較的容易。
まとめて言えば、人や物、物事の取り扱いを現実と同じようにできるってことね。
最初に戻ると、規則があるなら君の好きで良いんじゃないってことで。
0509名前は開発中のものです。
2007/08/22(水) 02:49:01ID:xHfctKqh標準ライブラリが互換性のために未だに使いまくってるんだが・・・。
んで使い勝手悪いからいい加減JCFに移行しろと叩かれてるじゃないか。
0510名前は開発中のものです。
2007/08/22(水) 10:20:41ID:lSyOGrel0511名前は開発中のものです。
2007/08/22(水) 21:45:27ID:HTZJHbeS> 単純に現実に沿って状態を作る(これがRPG向きか?と言われると、そうではないけど)
単一システムで作るのは、結構つらいなぁ。
俺だと RPG はフィールド&シナリオ、戦闘、デモシーンでシステム完全に切り離して
作っちゃうけど。どーしてもフィールドからシームレスに戦闘に入りたいと言われたら
考えるが、工数は開発もデバッグも倍かさむよって感じ。
0512名前は開発中のものです。
2007/08/22(水) 21:58:56ID:9DW3Phydオブジェクト指向とはあんまり関係ない気がする
オブジェクト指向言語は結局構造化手法の流れを汲んでるから関係あるっちゃあるんだけど
「オブジェクト指向的」に批判されることはないと思うんよ
0513名前は開発中のものです。
2007/08/22(水) 22:26:25ID:9DW3Phyd0514名前は開発中のものです。
2007/08/23(木) 00:15:28ID:mSgl7P3T0515名前は開発中のものです。
2007/08/24(金) 15:43:24ID:C1/M3//R>>510みたいなことは流石にやってないけど、マップが複数面あって
自由にキャラクターを選べるのを作ってるから、今のやり方で全く問題なかったりするぜ!
0516名前は開発中のものです。
2007/09/01(土) 13:35:04ID:+CS1vDDV0517名前は開発中のものです。
2007/09/01(土) 15:26:53ID:AAlSvZp8お前って奴は…
0518名前は開発中のものです。
2007/09/01(土) 18:53:13ID:pEzsrlB5クラス名がネームスペース入りのフルネームで書かれてて
>>510と比べてもあまり遜色ないくらい長ったらしい記述になってる
0519名前は開発中のものです。
2007/09/03(月) 18:50:24ID:pkJ0HJ1y0520名前は開発中のものです。
2007/09/03(月) 18:56:19ID:l4kjvmoQ0521名前は開発中のものです。
2007/09/03(月) 20:58:24ID:nm3JiNC1■ このスレッドは過去ログ倉庫に格納されています