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

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

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2006/08/10(木) 20:27:06ID:BnvyxuCB
具体的なゲーム名を挙げて、
どのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。

関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0063名前は開発中のものです。2006/08/25(金) 11:50:36ID:cXY4CALt
>>61
総まとめクラスにインデックス値を吐かせてるのは
それがフレーム管理もやってるから。
インデックス値はCEnemyには持たしていない。
毎回背景から再描画してるんで、
前回スプライト位置は保持していない。メンドイし。
0064名前は開発中のものです。2006/08/25(金) 14:31:51ID:7Z0tsXKn
>>63
>総まとめクラスにインデックス値を吐かせてるのは
>それがフレーム管理もやっているから
いやそれ全然理由になっていないと思うぞ…。
0065632006/08/25(金) 20:56:45ID:cXY4CALt
あれ?自分で書いておいて訳わかんねw
作ったまとめクラスよく見たらフレーム管理はしてなくて、
1フレーム進めるメソッドがあるだけだった。
んで、そのメソッドを実行するたびに
0〜(アニメーション数-1)までくるくる回す
インデックス値のメンバがそこにあった。
数ヶ月前に書いたソースを思い浮かべながら書いたら
記憶があいまいで勘違いしてた。スマソ
0066名前は開発中のものです。2006/08/26(土) 02:58:51ID:MLjkH/sO
>>65
それをやると、敵を生成したタイミングにかかわらず
同じ敵が同じ状況で常に同じモーションをとることになるな(行進みたいに)。
俺はモーションをバラにさせたいときは>>62みたいなクラスを敵クラスに持たせ、
あえて統一したいときはそれを敵リストクラスに持たせている。
0067名前は開発中のものです。2006/08/27(日) 01:28:02ID:AkzK5166
簡単なことを難しくやる典型例みたいな…
やっぱしゲームには過度なオブジェクト指向は必要ないかなあ
0068名前は開発中のものです。2006/08/27(日) 01:36:32ID:ksgBJOiI
3Dゲームはオブジェクト指向無しではやってられまへん。
0069名前は開発中のものです。2006/08/27(日) 01:58:03ID:8IJYN4+M
>>67
このスレに書かれているようなクラス設計を
どんな規模のゲームにでも毎回採用している奴はいないだろう。
採用した方がむしろ簡単になったり、差し替えが楽になったり
するようなところに適用すればいい。
パックマンとかシューティングとかは説明例に利用されているだけだし。
ゲームに過度なオブジェクト指向は必要ないというのはちと早計。
0070名前は開発中のものです。2006/08/27(日) 09:16:10ID:6AN46lHX
0071名前は開発中のものです。2006/08/27(日) 11:43:57ID:1/1wdIdP
こんなスレが出来てたのか。

いわゆるタスクシステム的な、個々のオブジェクト同士の依存関係の記述は、
ここの考え方と同じ方針でやってる。
ttp://www.issei.org/blog/archives/000225.html
0072632006/08/27(日) 12:10:26ID:f+3tvpuV
>>66
まぁ漏れの場合はそこまで凝ったシューティングじゃなかったし。
もっと拘ると最終的にそれに近くなってくるだろうなぁ。

>>67
難しいか?このくらいじゃ慣れの問題でしょ。
大規模なゲーム作るとなると設計をちゃんとしなければ
取り返しがつかなくなって訳若布になる。
それに、そこで作ったコードを再利用するなら
他のゲームも自動的にオブジェクト志向なコードになる。
0073名前は開発中のものです。2006/08/27(日) 13:24:46ID:DcPmG1mi
そこに時間という足かせとのバランスを考慮するんだろ
0074名前は開発中のものです。2006/08/27(日) 14:46:15ID:Iv3Ktm5x
過度のオブジェクト指向はゲームじゃなくても要らないっしょ。
過度なんだから。

まぁ、でもパックマンに >>9 ぐらいの設計は全然アリだよね。
CEnemyを直接継承しちゃうかな。俺は。
0075名前は開発中のものです。2006/08/27(日) 20:51:21ID:e75LZdTl
ゲーム固有のコード全てを持つクラス の名前ってどんな風に付けますか?

Game だと(他のタイトルのコードと)紛らわしいし、ゲームタイトルって選択もあるだろうけど
開発を始めたばかりの頃に気の訊いたタイトルを思いつけるとも限らないし・・・
参考までに聞かせてください
0076名前は開発中のものです。2006/08/27(日) 20:59:17ID:91MNPNDq
ゲームのすべてのコードが含まれてるなら後で変更しても問題ないんじゃないの
0077名前は開発中のものです。2006/08/28(月) 06:10:31ID:ylt7gNTk
たとえばJavaならeclipse様の力で名前なんかどうにでもできるんだが、
そういうツールがない場合、開発コード名をつける。
0078名前は開発中のものです。2006/08/29(火) 08:01:09ID:ewOrOlMJ
>>75
namespaceで区切る。
0079名前は開発中のものです。2006/08/30(水) 08:47:32ID:nhdG+7sO
良スレだと思うのだがなかなか伸びないな。
やはりこの板は設計論より実装論が先立ってしまう人が多いからだろうか…
0080名前は開発中のものです。2006/08/30(水) 10:33:46ID:/npQLrEC
単に内容について来られる奴が予想以上にいない説。
スクリプタやプログラム初心者が多いこの板では
このスレでメインに置かれているC++自体がまず敷居高し。
加えてタスクシステムやデザインパターン等の前提知識が必要だし、
ある程度作り慣れた人でないと語られている手法の有用性がわからない。
っていうか>>2が端的にこのスレの性格を表している気がしなくもない。
0081名前は開発中のものです。2006/08/30(水) 10:42:16ID:ywEU+7yH
イベント駆動型で作れないかな
0082名前は開発中のものです。2006/08/30(水) 11:31:13ID:9Enygb8x
パズルゲームとかなら
0083名前は開発中のものです。2006/08/30(水) 19:00:19ID:/p+hSpd6
むしろ糞スレ化せずに80以上のまともなレスがあるのが奇跡だよなぁ。
0084名前は開発中のものです。2006/08/30(水) 23:25:09ID:YwiXGvRz
実装論先行型が多いと思う

デザインパターンって人に伝えるために作られたものだと思う
一人で作ってる分には必要ないんでない?

あとオブジェクト指向はホント必要、いやまじで、ないと軽く逝ける
どこまでやればオブジェクト指向ってのかは謎だけど

とりあえずデザインパターンとあまり関係ないんだが
クラスの作り方どうやってるか聞きたい
複雑な行動パターンをお手軽に実装できる方法とかない?
0085名前は開発中のものです。2006/08/30(水) 23:37:00ID:zbf6UWXA
C++で、クラス関連の機能から触り始め
テンプレートの書き方やSTLライブラリまで一通り勉強したけど
デザインパターンにはまだ触れたことがない
今のところ、機能ごとに切り分けたクラスを作りためながら
自前のゲーム用ライブラリを構築するだけで満足してしまってる
0086名前は開発中のものです。2006/08/30(水) 23:42:43ID:5F9omhv6
どうでもいいことを突っ込まずにはいられない
>85
>STLライブラリ
頭痛が痛いです
0087名前は開発中のものです。2006/08/31(木) 00:11:24ID:HS89R3Gm
知ってるがな
どうでもいいことには突っ込まずにいてください
0088名前は開発中のものです。2006/08/31(木) 00:17:43ID:RTC9z+se
プログラムを勉強し始めて間もなく
多くの人が感動したアルゴリズムと同じく、
綺麗なクラス設計を示したのがデザパタだ
みたいなことを誰か言ってたな。
0089名前は開発中のものです。2006/08/31(木) 00:47:27ID:q0N5Gk6x
83が変なコトいうから微妙な空気が漂ってきた。
0090名前は開発中のものです。2006/08/31(木) 03:24:35ID:LuxRambo
デザインパターンの意図については語る必要はない気がする。
こっちは利用する側なんだし。実際このスレではパターン名で疎通が取れているし
パターン自体も色々な使用例が挙げられていて役立っているからそれでいい。

>>84
>複雑な行動パターンをお手軽に実装できる方法とかない?
なんとなく、このスレでは扱わない具体的な実装面に踏み込む内容な気がする。
どちらにしろ具体例を挙げてくれないと意見しにくい。
行動パターンがコロコロ変わるというのであれば>>9の方法でいいんじゃないか?
0091名前は開発中のものです。2006/08/31(木) 17:27:49ID:AP7414ou
こういうスレは、この板では貴重だと思う。
当たり判定のアルゴリズムはわかっても、
それぞれの物体の座標をどうやって取得するか等を語れるスレは少ないし。
0092名前は開発中のものです。2006/08/31(木) 18:34:51ID:H1On9wAl
>>90
前にSTG作った時に敵の数を20以上作れと言われた
一つ一つ行動パターンを作っていくのがえらいめんどくさかった
既出ですまそ、そしてありがとうございます
0093名前は開発中のものです。2006/08/31(木) 19:32:51ID:FYTUeEKw
「複雑な行動パターン」ってどういうもん?
キャラの状態が色々あってステートの変化の組み合わせが多い(格ゲー系にありがち)とか、
行動の流れが複雑でプログラムがめんどくさい(シューティングにありがち)とか、
カテゴリはいくらでもありそうだからなぁ

でも大抵はスクリプトを使えば割と面倒なタスク処理が解決すると思うので紹介
タスクを実装するのにvirtual Update() = 0;な関数を用意したクラスを使うのは皆よくやると思うのだが
キャラにとっては一連の流れ(=関数)を一々タイムスライスしてやらなきゃならんのは面倒だ。
そこでスクリプトを使うと結構その辺が簡略化されるよ
例えばシューティングゲームで360度回転しながら弾を撃つ処理を書くときとかが良い例だと思うのだが

class Hoge
{
 float m_Angle = 0;
 Update() {
  m_Angle += AngleVel;
  Fire(m_Angle);
  if( m_Angle >= 360.0f )
   Destroy( this );
 }
};
と書くよりは
HogeThread() {
 for( float Angle = 0; Angle < 360; Angle += AngleVel; ) {
  Fire(m_Angle);
  Wait(1);
 }
}
と書きたいわけだな。Wiat(1)みたいなのはスクリプトの得意技だ
>>9の例を使うと、class ScriptStrategyみたいな感じのクラスを作るのがいい感じ。
0094名前は開発中のものです。2006/08/31(木) 19:34:21ID:FYTUeEKw
それにしてもひどい文法エラーだと自分でつくづく思った。
0095名前は開発中のものです。2006/08/31(木) 21:15:01ID:XOYGLdi+
>>93
ゲームプログラムとしては前者のコードの方が自然だから
わざわざ後者にしたいという理由がわからない。
0096名前は開発中のものです。2006/08/31(木) 21:43:04ID:WNbosGuA
IEnumerator<IAction> GetAction()
{
 for( float Angle = 0; Angle < 360; Angle += AngleVel; ) {
  yield return new FireAction(m_Angle);
 }
}

C#でこういうのどうだろ
0097名前は開発中のものです。2006/08/31(木) 21:52:59ID:q0N5Gk6x
>>93の例は微妙に不適当な気がする。
”複雑な状態遷移をスクリプト(というよりこの場合fiber/coroutine)で処理した方が簡単”
というのは言えると思うが、
”毎フレームUpdateを呼ぶよりもHogeThreadを1回だけ起動する方法にしたい”
なんて思う人はごく稀だと思われる。

この場合、>>9のStrategyのサブクラスとしてScriptStrategyを定義して、
excuteが呼ばれるたびにコンテキストを復帰して起動する処理を作る方が自然。
0098名前は開発中のものです。2006/09/01(金) 00:30:03ID:r4ifVKGE
>>95
そんなことは無いですよ。BulletMLはまさしく後者の方法の一種です。
わざわざこのためにpythonのマイクロスレッドを利用する人もいるくらい。

>>96
まさにその考え方です。
ただC#ではIteratorでしかyieldが使えないので…

>>97
なんか表現を誤った気がします。
結局はおっしゃるとおりコルーチンってことです。
0099名前は開発中のものです。2006/09/01(金) 22:44:26ID:gcVCkYdV
人それぞれといわれかねない質問だが・・・、
衝突判定は何処で行う?
キャラが他のキャラクタと当たるかどうかを各々チェックする?
衝突クラスなるものがキャラと他のキャラとをチェックする?
0100名前は開発中のものです。2006/09/01(金) 23:18:48ID:m70wFV1r
衝突判定の対象になるキャラを、障害物クラスに登録しておき、
キャラのメソッドで、判定用ベクトルを格納するクラスを生成し、
その判定ベクトルクラスを、障害物クラスに渡している。
障害物クラスで扱うデータは、
オリジナルだったり複数種のFVFだったりするので、
判定そのものはテンプレートにした。
0101名前は開発中のものです。2006/09/01(金) 23:37:56ID:PZ94qqHg
5000個くらいのキャラの衝突を総当りでやってたらうざったいもんな。
キャラの最小サイズを1ピクセルになるようにマップを縮小したものを容易。
キャラを移動させたらその位置を塗り替えるが、その場所が既に塗り替えられてれば衝突、もしくは
詳細の衝突判定を行う。
クラスにするまでもないと思うが。
0102名前は開発中のものです。2006/09/01(金) 23:50:16ID:KqJnfdNw
俺は衝突クラスを作るかな。
実装は>>101みたいな感じだけど4分木を使ってもっと大雑把にやる。
まあ実装に関してはこのスレの範囲外だけど。
0103名前は開発中のものです。2006/09/02(土) 18:17:30ID:NT+ChiaN
衝突判定でよく話題になるダブルディスパッチだけれども
boost::variant使うと継承無しで実現できちゃうよ。
中身はswitch caseのコンパイル時自動生成してるだけだけど。
継承関係なしで仮想関数の真似事もできるんで、
たまには役に立つかもしれない。
0104名前は開発中のものです。2006/09/02(土) 18:26:27ID:AcWLcw3K
GameObjectは型クラスの概念に近いことが多いから、
ある程度規模が大きくなると、コンパイル時のダブルディスパッチの確定だけじゃ追いつかなくなるんだよね…
UnrealEngineではスクリプトに完全に委譲してしまってるみたいだけど。
0105名前は開発中のものです。2006/09/02(土) 18:36:54ID:NT+ChiaN
variant型なんだからもちろん実行時型識別してくれるよ。
具体的には型にid振ってswitch caseしてるだけ。
メモリアロケーションも発生しないからなかなか優秀。
ただオブジェクトサイズが最大のものに揃っちゃうけど。
0106名前は開発中のものです。2006/09/02(土) 18:40:42ID:NT+ChiaN
こんな感じね。↓

#include <boost/variant.hpp>

using namespace boost;

class visitor : public static_visitor<> {
public:
void operator () (int n, int m) const {}
void operator () (char n, char m) const {}
void operator () (char n, int m) const {}
void operator () (int n, char m) const {}
};

・・・・
variant<int, char> v0, v1;
v0 = int(2);
v1 = char(3);
apply_visitor(visitor(), v0, v1);
v0 = char(2);
v1 = char(3);
apply_visitor(visitor(), v0, v1);
0107名前は開発中のものです。2006/09/02(土) 21:49:46ID:AcWLcw3K
>>105
いや、突き詰めていくと、同じ型であってもゲーム上で異なる意味を持つ場合がよくあって、
そういう場合は(言語としての)型でのディスパッチだけでは不十分で、
結局、ゲームにあわせたIDなり名前なりで自前のルーチンを組むことになるって話。

特にRTSやFPSみたく、プログラマは基本的な構造とツールを提供するだけで
後はデザイナーの仕事、のように分業されてるゲームではそうなりやすいでしょ。

って書いてて気づいたけど型クラスじゃなくて型オブジェクトだったよ(´・ω・`)スマソ。
0108名前は開発中のものです。2006/09/03(日) 02:35:53ID:zkit7pB+
それは単に振る舞いを型まで落としきれてないだけでは。
仮に振る舞いが外部設定可能だったとしても
型をパラメータ化したファクトリ作れば良いし。
0109名前は開発中のものです。2006/09/03(日) 02:45:46ID:zkit7pB+
ああ、”ゲームオブジェクト”のディスパッチでは
足りない、ということであれば同意。
上のは当たり判定オブジェクトを別に作ってそっちで
ディスパッチする前提で話してた。
0110名前は開発中のものです。2006/09/03(日) 20:53:10ID:IzfZGbvV
てかここまでくるとスレ違いじゃね?
0111名前は開発中のものです。2006/09/03(日) 21:18:48ID:2Y2SZ/cc
>>110
何故?
0112名前は開発中のものです。2006/09/03(日) 23:09:12ID:H5xQl2Ix
>>109
そう、そういう意味ですた。
パックマンやテトリスみたく、型とオブジェクトの振る舞いが1:1で対応するようなゲームであれば
boost::variantやLokiのStaticDispatcherで事足りるし、その方が高速なんだけど
ツールでカスタマイズ可能なオブジェクトを導入したとたんに破綻しちゃうんだよね…
普通はどうするもんなんでしょうか。
0113名前は開発中のものです。2006/09/04(月) 00:35:37ID:Q7Y7fGRp
>>110
話題が無いよりマシ

>>112
>>108>>109にも書いてあるけどStrategyパターン使ったら?
0114名前は開発中のものです。2006/09/04(月) 22:45:10ID:rb/d93oY
衝突は悩みますよねー。
まぁ、衝突判定のためのクラスを作って、そこに対象をごっそり
addしていくような感じですかね。わたしは。
0115名前は開発中のものです。2006/09/04(月) 23:02:41ID:IU7YOKU2
2Dの衝突判定の話と3Dの衝突判定の話が混在しているから困るw
0116名前は開発中のものです。2006/09/04(月) 23:16:45ID:FM5ShwwG
次元1つ違うだけジャン
0117名前は開発中のものです。2006/09/04(月) 23:41:18ID:sQ13V/oj
判定アルゴリズムを語っているわけではあるまいし、問題ないだろう。
0118名前は開発中のものです。2006/09/05(火) 00:52:09ID:ZZN1keOu
さすがに>>101のやり方は3Dじゃやらんだろww
0119名前は開発中のものです。2006/09/05(火) 01:15:43ID:XCG3Ame9
画像だとめんどいけど多次元配列にすればいけるんじゃね?
0120名前は開発中のものです。2006/09/05(火) 01:32:48ID:N2PWUf7J
>>119
普通はAABBのツリー構造にするけどな
0121名前は開発中のものです。2006/09/05(火) 04:06:58ID:9I8P67h+
グリッドでやるのは現実的じゃないけど、オクツリーなら。
0122名前は開発中のものです。2006/09/05(火) 05:52:03ID:b0Le55Md
こういう話題も一応『データ構造』の内に入るのかな?
レンジ広めな良スレだな。
0123名前は開発中のものです。2006/09/05(火) 07:11:57ID:WVxlLvIu
まとめ
・形状衝突判定とゲームオブジェクト衝突判定の話が混在してて紛らわしいお
・VisitorパターンはAcceptor側の個数が暴発するときには使いづらいお
・挙動をStrategy化すればAcceptorが暴発しにくくなるお
・次元を問わずグリッドよりツリーのほうがお勧めだお
0124名前は開発中のものです。2006/09/08(金) 23:55:09ID:NaDeRAxZ
群体を制御するプログラムのいい案ない?
複数の個体で整列したり陣形を作るっていうのが目標

どっちかというとAIの分野に入ると思うけど
そこまで複雑な物じゃなくてもいいかなと思ってる
0125名前は開発中のものです。2006/09/09(土) 00:04:25ID:htHhZzlR
チーム全体の行動を担うダミーエージェントを用意して、
そいつが全エージェントの操作を行うというのが楽なんじゃね?
昔からある多間接キャラとかはこういうタイプなんだろか

個々のエージェントが周囲の状態を見て次の移動地点を決めたりするのは
まさしくAIって感じだが果てしなく重くなりそう
0126名前は開発中のものです。2006/09/09(土) 00:27:32ID:8XOJrFUy
>>125
> 個々のエージェントが周囲の状態を見て次の移動地点を決めたりするのは
> まさしくAIって感じだが果てしなく重くなりそう
そうでもない。
今のクラウドシミュレーションの基礎になってるレイノルズの方法では
3つの単純な操作を各個体に適用するだけでリアルな挙動を作り出せる。

これに、基準になる目標点を個々に与えたり、パラメータを調節・追加することで整列や陣形も表現できる。
といっても完璧に意図した陣形にしたければ、予め動きを指定しておくしかないけど。
0127名前は開発中のものです。2006/09/09(土) 03:06:35ID:KrPaatUc
boidっ言ってちょ。1行目だけ読んで「レイノルズって誰だ?」とか思っちゃった。
ツリー的な構造にしてセパレーション以外の適用範囲を限定したりすると、
複数の集団が扱えるし、(影響力の強くした)ツリーの親で操作できて手軽。
01281242006/09/09(土) 11:31:36ID:c7q33UAv
まとめると
チーム全体の指揮をするエージェントを作る
個々に単純な操作や状況判断する機能をつける
ツリー構造で処理する

思い出したんだがそういえば鳥の群れのシュミレーションとか参考になりそうだと思った
ttp://www.red3d.com/cwr/boids/

>>125>>126のやり方を組み合わせられれば理想的なプログラムになりそう
0129名前は開発中のものです。2006/09/09(土) 13:29:03ID:QcPvLvjH
階層ステートマシーンってどんなものか知ってる人いる?
0130名前は開発中のものです。2006/09/10(日) 00:43:16ID:20rok1qS
>>129
従来のステートマシン(全てのステートが完全に等価)に
クラスなりパッケージ化で階層を加えて
オブジェクト指向との親和性を高めた物って認識をしてたけど、違うのかな?
0131名前は開発中のものです。2006/09/10(日) 06:09:51ID:lBlbiG31
>>128
リンク先の動きが魚っぽい。
0132名前は開発中のものです。2006/09/13(水) 09:43:56ID:NFAfFOse
魚に吹いたw
0133名前は開発中のものです。2006/09/17(日) 13:13:30ID:w8QCz84O
2chからリンクされていたから何かと思ったら、こういう話かw 一安心。

>>129
ふつーのステートマシンだと全ての状態が対等なので、状態×入力に
比例して記述が増えていく。似た状態をまとめて、必要な記述量を減ら
そうってのが階層ステートマシン。

たとえば RPG の主人公キャラなら、まず「生きてる」「死んでる」で状態を
分けて、さらに「生きてる」の中に「通常」「混乱」「スリープ」とか入れ子に
して挙動が異なる部分だけ書く。

>>130
> オブジェクト指向との親和性を高めた物って認識をしてたけど、違うのかな?
直接は関係ないです。OOPL を使ったほうが書きやすいかな、って程度。

むかし、ゲーム屋さんやってたときに作った代物があるので、どーぞ。
ttp://www.issei.org/diary/?20040208#08

参考書
ttp://www.amazon.co.jp/exec/obidos/ASIN/1578201101
0134名前は開発中のものです。2006/09/17(日) 13:24:01ID:yvndUkUn
strategyのstrategyみたいなもんか。
0135名前は開発中のものです。2006/09/22(金) 22:18:45ID:u76SSGNK
質問です。

まず、動的にメモリ上に作成されたオブジェクト、AとBがあります。
ある時、オブジェクトBはオブジェクトAへの参照を保持したとします。
しかしその後、オブジェクトAは消失してしまいます。

こういった場合に、オブジェクトBの保持していたオブジェクトAへの参照が
無効になったことが分かる、良い参照構造がありましたら教えてください。
スマートポインタをちょっと調べてみましたが、あれってこういう場合に使うものではないですよね?(むしろ逆のような感じ)

言語はC++です。
0136名前は開発中のものです。2006/09/22(金) 22:33:30ID:zpdtl+m6
>>135
boost 使うなら shared_ptr と weak_ptr 組み合わせて使う。

或いは、非参照オブジェクトに

bool isTerminated() const;

みたいなメンバ変数を持たせて、参照側はスマートポインタで保持。使う前に

if (p->isTerminated())
 p = NULL;

みたいなチェックを入れる。私は intrusive_ptr 好き人間なので、後者で統一
してました。
0137名前は開発中のものです。2006/09/23(土) 10:55:14ID:gkZ8TjvK
>>135
インスタンスのポインタのポインタ持たせておけばおk。
Aのインスタンス開放時は必ずぬるぽを指定する。
0138名前は開発中のものです。2006/09/23(土) 14:31:03ID:HUIkr9ZU
>>136
weak_ptr使ってみました。これは良いですね。
セットされていたshared_ptrが消失すると以降のlock()が無効になる。
これで私の希望は叶ったように思います。
ただ・・これって内部ではどのような処理が行われているのでしょうか?
ソースを読んでみようかと思いましたが・・私にはちょっと難しかったです。
どなたか、簡単に解説していただけませんでしょうか?

intrusive_ptrについては、よく分かりませんでした。

>>137
Bがインスタンスのポインタのポインタを持つとして、
その「インスタンスのポインタ」にあたるデータは
Aが持つのでしょうか?それとも違う者が持つ?または誰も所有しないのでしょうか?
ちょっと具体的なイメージが沸きませんでした。
宜しければサンプルコードみたいなものを書いて頂けるとありがたいです。
0139名前は開発中のものです。2006/09/23(土) 15:44:06ID:LShRrPtb
>>138
# boostは使ってないけど、weak_ptrの実装に興味あったのでソース見てみた。
# 間違ってたらごめんね。

intrusive_ptrは参照されるオブジェクトに参照カウンタの仕組みが備わっている場合に
使えるスマートポインタ。shared_ptrは参照カウンタをヒープに確保してて何にでも使える
汎用性がある代わりにオーバーヘッドがありゲーム用ならintrusive_ptrが好まれるという
ことだと思われる。

weak_ptrはそのヒープに確保される参照カウンタ(オブジェト)自身の参照カウンタを
上げ下げするもので、weak_ptrが全部消えるとその参照カウンタオブジェクトが
消えるという仕組みのようだね。

# detail/sp_counted_base_w32.hpp
class sp_counted_base
{
long use_count_; // #shared
long weak_count_; // #weak + (#shared != 0)

virtual void destroy() // nothrow
{
delete this;
}
void weak_release() // nothrow
{
if( BOOST_INTERLOCKED_DECREMENT( &weak_count_ ) == 0 )
{
destroy();
}
}
};
0140名前は開発中のものです。2006/09/23(土) 20:21:11ID:gkZ8TjvK
>>138
こんな感じだな。インスタンスのポインタは別に誰が持ってても良い。
っつかポインタのポインタ持ってる時点でそれと同義だし。

class clsA;
class clsB;

class clsB
{
int val;
public:
clsB(int v){val=v;}
int getVal(){return val;}
};

class clsA
{
clsB **pb;
public:
clsA(clsB **b)
{pb=b;}

int getVal()
{
if((*pb))
{return (*pb)->getVal();}
else
{return -1;}
}
};
01411382006/09/23(土) 20:22:09ID:gkZ8TjvK
改行が多いって怒られた。

int _tmain(int argc, _TCHAR* argv[])
{
clsA *a;
clsB *b;
int ret;

b=new clsB(256);
a=new clsA(&b);
delete b;
b=NULL;

ret=a->getVal(); //ret==-1
return 0;
}
0142140=1412006/09/23(土) 20:22:57ID:gkZ8TjvK
名前ミスった。気にせんでくれ。
0143名前は開発中のものです。2006/09/25(月) 21:33:59ID:hvNCBo59
ここで挙げられたパターンや何やらを使っているような、
小規模でわかりやすいサンプルってありますかね?
シューティングを作ろうとしているのですが、設計で悩むことが多くて、
参考になるものが欲しくなってきたので、何かあればよろしくお願いします。
0144名前は開発中のものです。2006/10/10(火) 21:23:54ID:yCqIkWyw
>>143
シューティング製作スレから.
ただし,漏れはまだ読んでないので内容については保証できんが.
ttp://ime.nu/www.amazon.co.jp/exec/obidos/ASIN/4797337214/
0145名前は開発中のものです。2006/10/31(火) 10:38:39ID:xPxE7qYC
0146名前は開発中のものです。2006/11/04(土) 23:26:00ID:fX21zZRx
タスクシステムって本当に有効なのか?
逆にプログラミングが煩雑になりそうな気がするんだが。
0147名前は開発中のものです。2006/11/04(土) 23:30:01ID:gABtDaTi
>>146
何度か挙がってるネタだな。まず「タスクシステム」を定義しないと、
いつもどおりグダグダになるだろう。
0148名前は開発中のものです。2006/11/04(土) 23:49:54ID:fX21zZRx
>>147
タスクシステムというのは、
処理関数とワークエリアがセットになったタスクがリスト構造になっていて、
順番にタスクの処理関数を実行していく仕組みだと思ってる。違うかもしれんが。
あるタスクが、ほかのタスクの保持するデータを参照するのが難しそうだ。
0149名前は開発中のものです。2006/11/05(日) 01:52:09ID:SWu+bHZ4
>>148
関数とワークエリアがセットって言ったら仮想関数使えばいいだけの話。
あとは抽象クラスへのポインタをコンテナに保持すればできあがり。
システムって名付けるほどのもんでもないよな。

そこで済ませておけばいいものを、なんでもかんでもそのリストを
使ってやろうとすると、バグの温床となる「タスクシステム」ができあがるんじゃないか
と思っている。
0150名前は開発中のものです。2006/11/05(日) 02:16:36ID:luPotGyi
実際C++だと必要ないよ。
0151名前は開発中のものです。2006/11/05(日) 09:28:27ID:x/qHNT/o
>150
そうでもない。組み込み方面からもたらされたと思われる非プリエンプティブな
スレッドみたいなもうちょっと複雑なものとするなら、C++のみでは無理、
アセンブラが必要。WindowsならCreateFiberを使えるが、NT系で
しか使えない。

これからマルチコアが当たり前になると、スレッドをタスクと名づける人が増える
かもね、おおややっこしい。
0152名前は開発中のものです。2006/11/05(日) 09:43:30ID:wi810l51
>>151
147の発言を地でいってるな。
0153名前は開発中のものです。2006/11/05(日) 14:05:29ID:zA+hRC02
>>151
そういう意味のタスクじゃなくて
0154名前は開発中のものです。2006/11/07(火) 04:30:19ID:grfbgSgu
初心者だがレスさせてくろ
タスクシステムはビデオ屋でいうポストレンタルシステムではないでしょうか
ゲームプログラムにおいてはリアルタイム戦略ゲームのAIに有効かと
例えば自立スレッド型のユニット(目的地を指定すれば、勝手に動いてくれる)をA地点に移動したのち、B地点に移動させるAIを組もうとしたときなど。
ユニットのスレッドが行動リストをもっていて、AIはぼんぼんリストに行動をaddしていけばいい
ユニットのスレッドはリストの下から行動を処理する。

このシステムがないとAIはユニットがA地点に到着した情報を取得し、
その後でB地点に池という命令を出さなければならないのでAIの手間が非常にかかる  おやすみなさい
  
0155名前は開発中のものです。2006/11/07(火) 10:26:39ID:vi/Nuttr
>>154
それは >>148 の言うようなタスクシステムとは全然違う。
コマンドのキューと言えば十分。システムなんて呼ぶほどのものでもない。

「タスクシステム」の共通な定義が無いのが
一番の問題なのかもしれないと思った。
俺様解釈が多すぎていまさら定義も難しい。
0156名前は開発中のものです。2006/11/07(火) 10:45:17ID:FxrEUOug
少なくともこのスレでのタスクシステムの共通定義は
>>148でいいんじゃないの?
今までずっとそれ前提で話が進められていたし、
そうでないと思っているのは的外れな>>154だけだと思うんだが。
タスクに親子関係持たせるとか優先度がどうだとかいった細かい部分は
その都度最適なものを選べばよし。
0157名前は開発中のものです。2006/11/07(火) 19:23:55ID:qUpAvALP
Cでリスト使ってて、
C++に移行したら「それタスクシステムだよ」って言われた。
どうすればいいでしょう?
0158名前は開発中のものです。2006/11/07(火) 21:40:27ID:3jPQsnxn
もうすこしkwsk
0159名前は開発中のものです。2006/11/08(水) 10:10:54ID:U+HCvDbD
>>157
そうだよ。って答えれば解決。
0160名前は開発中のものです。2006/11/10(金) 11:57:52ID:bWKjGfw+
ところで
http://d.hatena.ne.jp/kataho/20061013
ここのブログのこの問題といてみない?
01611602006/11/10(金) 11:58:41ID:bWKjGfw+
すまね、上げちまった
0162名前は開発中のものです。2006/11/10(金) 13:40:25ID:0fi4/IIn
この板にしては珍しく良スレだな
■ このスレッドは過去ログ倉庫に格納されています