ゲームにおけるデータ構造・クラス設計・パターン
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2006/08/10(木) 20:27:06ID:BnvyxuCBどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
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:nm3JiNC10522名前は開発中のものです。
2007/09/03(月) 21:43:06ID:l4kjvmoQ0523名前は開発中のものです。
2007/09/03(月) 22:51:36ID:4m5q0iOiUniverse.MilkyWay.SolarSystem.Earth
しかし、こんな話題しかないものか。
0524名前は開発中のものです。
2007/09/03(月) 23:01:33ID:nm3JiNC10525名前は開発中のものです。
2007/09/04(火) 00:01:23ID:aU+sltFhそんなこと言いだしたらjavaのエンクロージング型の完全修飾名は恐ろしいことになる。
0526名前は開発中のものです。
2007/09/04(火) 00:51:30ID:SZHcTWC/0527名前は開発中のものです。
2007/09/04(火) 01:36:58ID:aBG3sZkWDelphiはわかりにくいと申すか
0528名前は開発中のものです。
2007/09/04(火) 01:47:09ID:h5r4WGWI俺は氏の思想は好きだが
0529名前は開発中のものです。
2007/09/04(火) 09:17:06ID:/fq60VcD0530名前は開発中のものです。
2007/09/04(火) 14:17:11ID:A5VD8KopVSがIDEなだけで。
0531名前は開発中のものです。
2007/09/04(火) 17:20:53ID:/fq60VcD#regionとかpartialとかIDE向けの機能があるのは確か
http://www.atmarkit.co.jp/fdotnet/insiderseye/20060215cscommunity/cscommunity_03.html
>Q.C# 3.0では、型推論によって読むのが難しいコードになってしまうのではないか?
>A.Visual StudioのIDEを強化すればおk
さすがにスレ違いだなすまん
0532名前は開発中のものです。
2007/09/04(火) 18:32:28ID:1MQtcsKRというかC#は既存言語の枯れたパラダイム
てんこもりにしただけのくせに信者が騒ぎだすんだろうなぁw
0533名前は開発中のものです。
2007/09/05(水) 22:29:15ID:wushZy2l0534名前は開発中のものです。
2007/09/06(木) 00:13:48ID:XDEo8NLL0535名前は開発中のものです。
2007/09/06(木) 01:04:58ID:ojjbKURb0536名前は開発中のものです。
2007/09/07(金) 00:33:06ID:B51b23c5タスクシステムのワーク領域のキャストってどうやるのかな
0537名前は開発中のものです。
2007/09/07(金) 00:44:42ID:GaWvLQQX今どきそんなC時代の古典的「タスクシステム」に無理矢理合わせようとしないのが正解。
0538名前は開発中のものです。
2007/09/07(金) 00:54:28ID:qKvVhzB0だからインターフェース継承しろと。どうせメモリ管理は GC 入ってるんだし。
0539名前は開発中のものです。
2007/09/07(金) 09:56:16ID:+KS6LJ+FまぁC++でもそんなコードかいてたら殴り倒すけど
0540名前は開発中のものです。
2007/09/07(金) 10:04:18ID:puv664XKシューティングゲーム プログラミング
松浦 健一郎 (著)
この本ではC++でワーク領域のキャストしてたけど、殴るの?
0541名前は開発中のものです。
2007/09/07(金) 10:07:03ID:ODKwq4Ib0542名前は開発中のものです。
2007/09/07(金) 11:36:49ID:+KS6LJ+F0543名前は開発中のものです。
2007/09/07(金) 12:02:42ID:xHXwrHzM普通に使ってたよ
本を書いてる人を殴れる程、出来るプログラマーなの?あなたは
0544名前は開発中のものです。
2007/09/07(金) 12:51:19ID:6U+LdAPY松浦 健一郎 (笑)の間違いだろ。
0545名前は開発中のものです。
2007/09/07(金) 13:28:52ID:43uHszUC0546名前は開発中のものです。
2007/09/07(金) 13:54:05ID:NUmtK/nu継承使わずにやるやり方にページ割くくらいならさわり程度でも継承教えたほうがためになりそうだが・・・
■ このスレッドは過去ログ倉庫に格納されています