OOとゲームプログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
01/11/07 23:55ID:HnYWCQK1行うことが出来るのか語り合うスレです。
0721名前は開発中のものです。
02/03/01 12:24ID:???weak_ptr も調べると幸せになれる。(boost 1.27 以降だったかな)
0722名前は開発中のものです。
02/03/01 12:28ID:???ライセンス条件は確認した? BSD ライセンスとかならともかく、そうでないと
「参考にするのは OK だが、コピペで使うと著作権法違反」とかの可能性もあ
るから注意ね。
0723narucy56
02/03/01 23:18ID:06YWXjZs設計に時間をかけるのはよい心がけ。
ただ、大抵、設計にかける時間というのは言うなれば「どうすれば簡単になるか」
ということを考える勉強の時間なのよ。
OO に慣れた人なら、ちょっとしたディスカッシヨンですぐに設計は完成しちゃう(・・・と思うんだけど、どうかな)
設計に時間費やすのはいいけど、それでデザイナが求めていないところまで
柔軟性を持たせる意味もないし。
だれもが 3分 で内容が理解できるくらい単純な設計でないといけない。
そういう意味じゃ本来は設計には時間を費やさないのが、OO をマスターしてからは
重要なんだと思う。
0724名前は開発中のものです。
02/03/01 23:40ID:???> OO に慣れた人なら、ちょっとしたディスカッシヨンですぐに設計は完成しちゃう
気のせい。
0725名前は開発中のものです。
02/03/02 06:07ID:???その3分程度でできるのはモデリングだけだろ・・・
0726718
02/03/02 06:46ID:???往々にしてあほ(笑)なので私はまだすぐに設計が完成…という境地には
至ってないですね。がんばりたい。
0727XP
02/03/04 04:33ID:fGL1MkkH一般化をはじめたりしているのに気がついたら、ストップ。動作す
るもっとも単純なことを実装して、今しなくてはいけないことをす
るのだ。「あとで必要になるはずだ」と言っている自分に気がつい
たら、あなたは貴重な時間を無駄にしているということだし、顧客
からプライオリティを設定する権利を奪い取っているということだ。
0728名前は開発中のものです。
02/03/04 04:57ID:???正直、リファクタリングは
ちゃんと設計できる能力がある人
前提の話だと思う。いい加減な設計しか出来ない/設計しない人が言い訳に
使うのは許さん。
0729名前は開発中のものです。
02/03/04 06:18ID:???その修正がいい加減嫌になって全部捨てて結果
全世界の開発者の貴重な時間を無駄にした例がMFCだよね
0730名前は開発中のものです。
02/03/04 15:01ID:???MFC 叩きはよそでやれ。
0731名前は開発中のものです。
02/03/04 17:42ID:???秀同(w
0732名前は開発中のものです。
02/03/06 03:48ID:d8OL+l1I0733名前は開発中のものです。
02/03/08 16:14ID:QLWVytdE設計の終焉?
http://objectclub.esm.co.jp/eXtremeProgramming/IsDesignDead.html
設計はやっぱしなきゃだめ。
でもそれは複雑になりすぎちゃだめ。
時間をかけすぎてもだめ。
しっかりできても他人に説明できなきゃだめ。
0734名前は開発中のものです。
02/03/08 18:16ID:???読んでみたけど、妥当な意見に思えるな。
0735名前は開発中のものです。
02/03/08 23:38ID:???どうでもいいが、こうあるべきという主張はやめたほうがいいよ。
XPかぶれてるのはわかるけど。
0736名前は開発中のものです。
02/03/09 00:33ID:???> XPかぶれてるのはわかるけど。
リンク先のドキュメントも >>733 の文章(設計の終焉? の要約だと思うが)も、
むしろ XP の中では穏健派の書いた文章だぞ。
XP について賛成するにせよ反対するにせよ、とりあえず XP について調べて
理解しとけ。話はそれからだ。
0737名前は開発中のものです。
02/03/09 00:50ID:zvT+Hk0x0738735
02/03/09 00:51ID:XwdiXSCeんー?ベストなものなんて世の中には無いって言ってるのさ〜。
XPについては何も言ってないぞ。
0739名前は開発中のものです。
02/03/09 01:23ID:???> XPについては何も言ってないぞ。
XP について何も知らないのに
> XPかぶれてるのはわかるけど。
と言うの? ダメじゃん。
0740名前は開発中のものです。
02/03/09 01:25ID:???>XPかぶれてるのはわかるけど。
>738
日本の政治家みたいなヤシだな(藁
0741名前は開発中のものです。
02/03/09 01:26ID:???×>357
○>735
0742名前は開発中のものです。
02/03/09 01:55ID:???0743名前は開発中のものです。
02/03/09 02:50ID:???0744名前は開発中のものです。
02/03/17 02:50ID:62wXi74P0745名前は開発中のものです。
02/03/17 03:13ID:???勉強しろなんてひどいな
0746719
02/03/17 07:42ID:SG2XMPR0したものをUPしようかと思います。
(環境、Ein98SE,P31G,GForce3)
著作権法違反は、特に記述がなかったのでOKだと思います。
当り判定(タスク間のやりとり)をまだ入れてないんです。
各(自機の)弾タスクが、(敵の数分の)タスクを総ナメしないと
いけないんですかね?やっぱ。判定に段階を設けるとしても。
0747名前は開発中のものです。
02/03/17 11:29ID:mjqfxEH/お〜い、はに丸。著作権は何もしなくても自動的に発生しますよ。
改変と再配布の許可が明示されているのでなければ、
一応作者に問い合わせるしか。
0748名前は開発中のものです。
02/03/17 13:38ID:???同意。
明示的に再配布可能とか記述がない限りは、勝手に使うとまずいぞ。
っつか C++ で書いたシューティングゲームの雛型なら MIT ライセンス
で公開されてるものがあるぞ。
0749719
02/03/18 00:39ID:tIFzPCA5はにゃ?そうスか、、。無知を晒してしまったですな。
ソース自体は、殆ど書き換えちゃったんですがね。実は。
やめといた方がよさそうですね。
作者の方へコンタクト取れそうにないし。
>>748
出来れば、詳細を教えて下さい。どんな設計か興味あります。
(特にクラス間の情報のやり取り等)
シューティング C++ で検索しても見つけられなかったです。
0750名前は開発中のものです。
02/03/18 02:40ID:VWHiZCDa0751名前は開発中のものです。
02/03/18 04:31ID:???開発状況報告スレのここらへんじゃない?
http://game.2ch.net/test/read.cgi/gamedev/1005143186/212-
あとここ。
http://www.sm.rim.or.jp/~shishido/gamedev.html
0752名前は開発中のものです。
02/03/18 19:05ID:???これ。
http://www.issei.org/programming/Windows/DxApp
ただしソースはあるけど操作に必要なリソースファイルは置いてないし、
当たり判定もまだのようだが。
0753719
02/03/19 01:30ID:9e3mOAQnおお!THX!ビンゴです。早速問い合わせてみます。
>>752
THX!です。見てみます。
でも、本業の方が押してきてるので、作業進まないかも。
(でも、やりたいのはSTGw)
今、某CUBEやってるんですが、コールバック関数のラッピングに手間取ってます。
(static)関数内でクラスにアクセスのに、とりあえず、グローバルポインタ渡すしか
思いつかない、、。
0754名前は開発中のものです。
02/03/19 01:56ID:???当たり判定は当たり判定管理クラスにタスクを登録して結果を
コールバックで取得&反映って感じでしょ。
後は判定管理クラス内をレイヤー化して置く事で様々な状況に
対応できるようにすると。
0755719
02/03/19 04:05ID:9e3mOAQnすいません。良く解らないです。
コールバックって、キリの良い所で処理を返す必要がないものに
対して使うものだと認識してます。
(メモカ、CDの裏読み等)当り判定って、フレームごとに全て完了
させないとイケナイ気がするんですが・・。
0756名前は開発中のものです。
02/03/19 04:17ID:???> コールバックって、キリの良い所で処理を返す必要がないものに
> 対して使うものだと認識してます。
認識が間違ってます。
0757名前は開発中のものです。
02/03/19 05:05ID:???ウンウン、コンシューマな人だねぇ…。
別にハードウェア割り込みから呼ばれる関数をコールバックと限定
するワケじゃないハズだよ。
当たり判定管理クラスを1つのデヴァイスと見なして、そこからの
情報伝達をコールバックという形で見れば大体言いたい事は解って
もらえるかな?
だから1タスクは他のヒット効果をもつタスク全てを知らなくても
自分と判定管理クラスとの相互関係のみで当たり判定を管理できるよ
うになる訳。719氏のタスクシステムの全貌は知らないけど、
HitMe( Task& enemytask , int layer );
Hit時にこーゆー関数がコールバックされば大体の処理は管理しきれる
し、パワーアップアイテムとかとの住み分けの汎用性も高いっしょ?
次にレイヤー化する事によるメリットって?みたいな質問がくると
更に嬉しいんだけど。
0758名前は開発中のものです。
02/03/19 11:42ID:???0759名前は開発中のものです。
02/03/19 11:53ID:???オマエ755じゃないだろ
0760名前は開発中のものです。
02/03/19 12:07ID:???0761名前は開発中のものです。
02/03/20 01:06ID:OKAtcaEAそれより先に、コールバックで結果を通知することのメリットの方が聞きたい。
(レイヤー化のメリットは、わかる。俺もそうしよ(w )
当たり判定管理クラスにAddHitData(Task &, int) IsHit(Task &, int) ってなメソッド
を用意して、前者で当たりの登録(これはTaskスタート時1回でいい)、でIsHitで結果
を知るってな方が自然だと思う。
コールバック方式って、やっぱ、HitMeの時には登録が行われるだけで、タスク処理
が全部終わったあと、当たり判定管理クラスの実際に判定を行うメソッドを呼んでやる
と、その中でコールバックが呼ばれる感じだよね?となるとコールバックの中で進入禁
止の処理やら、アイテム拾ったときの処理やら、攻撃受けたときの処理やら全部やら
なきゃいけないわけで、そういう処理はタスク処理の中に書けた方がわかりやすいので
は?
0762名前は開発中のものです。
02/03/20 01:11ID:???本筋からずれるが、なんでもかんでも Task クラスに突っ込まずに、
- 当たり判定関係のメソッドだけ抽出したインターフェースを用意
(純粋仮想関数だけ定義したクラスを容易)
- タスク実装クラスに、そのインターフェースを多重継承
の方が、柔軟性が増すぞ。
0763761
02/03/20 01:15ID:OKAtcaEA当たり判定データが現フレームの物だったり前フレームの物だったりしちゃう
からか。
0764名前は開発中のものです。
02/03/20 01:20ID:???757 じゃないが、メリットは
1 当たり判定順序をタスク実行順序と切り離せる
2 タスクの状態変化のタイミングと、タスク実行のタイミングを分離できる
タスクを順次読んでる途中で、タスクの状態が変わって、タスク管理クラス側
にも影響を与える(たとえばタスクを殺して管理クラスから削除)場合には、
よくよく考えないと dangling pointer を参照するバグが出る
3 特殊な判定(特定のキャラクタにのみ当たり判定があるとか)を付け加える
ときに、その処理が各タスクに分離せずに、管理クラスで一括して処理でき
る
っつーあたりじゃないか。
当たり判定はともかく、タスク実行と描画は実行順序を独立に定義するために、
分離するのが普通だよな。
0765名前は開発中のものです。
02/03/20 01:21ID:OKAtcaEA多重継承より、オブジェクトコンポジションの方が良いと思われ。
0766名前は開発中のものです。
02/03/20 01:27ID:???インターフェースの多重継承と、実装の多重継承を勘違いしてないか?
コンポジションだと、タスク内部の情報にアクセスするのが難しくなるぞ。
0767761
02/03/20 01:33ID:OKAtcaEA>当たり判定はともかく、タスク実行と描画は実行順序を独立に定義するために、
>分離するのが普通だよな。
うい、そうですな。
俺のタスクシステムの場合、タスク処理本体を二つの関数に分けてあって、基本
的な処理は1番目の関数をオーバーライドして定義し、実行順の問題がある処理
は2番目の関数をオーバーライドして、ってな感じでやってるんですが、これだと、
2つじゃたんない、3つ必要!ってな事になったらおいそれと足せない。
なんかもっといい実装例ないかなぁ。それか、実行順に依存させたくない処理は
ぜんぶコールバックでやるべきなんだろうか?(この方式にこだわるのは、処理の
流れがソースからわかりやすい、から)
#ちなみにその二つのメソッドはanimate、renderという名前。renderといいつつ、
当たり判定とそれによる位置変更もやる……名前と内容が一致してない……。
0768766
02/03/20 01:38ID:???struct hittable {
virtual void get_hit_rect(rect&, hit_type&) = 0;
};
class player_task : public hittable
{
bool invisiable_;
public:
void get_hit_rect(rect& rc, hit_type& htype)
{
if (invisible_)
rc = INVALID_RECT; // 不可視状態の時には、当たり判定なし
else
...
}
};
インターフェースの多重継承を利用すれば、こんな感じでタスクの内部状態
を利用して当たり判定を変更することが、容易に可能になる。コンポジション
で同じ事をやろうとしたら、思い切り不自然なコードを書くことになるぞ。
0769名前は開発中のものです。
02/03/20 01:40ID:???ん、勘違いしてた。
ああ、762が言っている方式では、タスクマネージャーの方から当たり判定用の
メソッドを呼び出して当たり判定を実現するって事なのかな?(柔軟、か?)
0770719
02/03/20 01:52ID:3YnMUW/Pいやー。正直、よくわからんスw避けてました。
勉強してきます。
>719氏のタスクシステムの全貌は知らないけど、
HitMe( Task& enemytask , int layer );
Hit時にこーゆー関数がコールバックされば大体の処理は管理しきれる
し、パワーアップアイテムとかとの住み分けの汎用性も高いっしょ?
自分が今実装してる方法は、
UpdateFrame()、(全タスクに対するAI処理等)
EndScene()、(全タスクのキルスク、チェンジタスク要求チェック、実行)
Draw()、全描画
てな感じです。
判定は、キルタスク同様、大まかな範囲チェックに引っ掛かったものを、
EndScene()内でさらに判定、て感じで考えてました。
で、判定関数は、矩形,球ぐらいを用意しといて、タスククラスに
持たせようと思ってました。
>次にレイヤー化する事によるメリットって?みたいな質問がくると
更に嬉しいんだけど。
それじゃ、
次にレイヤー化する事によるメリットって?
0771名前は開発中のものです。
02/03/20 01:54ID:???> 実行順に依存させたくない処理は ぜんぶコールバックでやるべきなんだ
> ろうか?
そう思う。
上のほうで挙がってた DxApp だけど、あれは描画とタスク実行を切り離して
別々の優先順位で処理するようになってる。
タスク関係 ITask, CTaskManager
描画関係 IObject, CObjectManager
が対応するクラスなんで、読むと参考にはなるかも。
(あと優先順位無し、登録順で処理する IObjectCommand っつーのもある)
0772名前は開発中のものです。
02/03/20 01:56ID:OKAtcaEA違うのであれば問題ないけど、このオブジェクトとこのオブジェクトは
実装一緒ってな事が多いとコピペが氾濫したり、もう一個クラス作って
へんちくりんなメッセージングすることになったりしない?
俺は757のいう当たり判定管理クラスってのを導入した方が
スマートだと思うから。
メンバとして持ったhittableのインスタンスの参照を当たり判定
管理クラスに丸投げしてやるだけでいいと思うので、複雑にはな
らないと思う。
0773名前は開発中のものです。
02/03/20 02:05ID:???> このオブジェクトとこのオブジェクトは実装一緒ってな事が多いと
そのときには template を使って Mixin すれば OK。
っつか 768 も
- 当たり判定管理クラスを作り
- そこに当たり判定チェックを行うインスタンスを登録
- 管理クラスから、各インスタンスをコールバック的に呼び出す
のは同じだけど。設計方針は変わらず、たんに C++ で都合がいい実装方法を
紹介しただけ。(コールバックの代わりに多重継承を使うと this の受け渡しが楽
だぜ、という程度の話)
0774767
02/03/20 02:11ID:OKAtcaEAこうなるとじゃぁ4つに分割、5つに分割と仕様要求次第じゃきりがない
って話になるな。
タスク処理メソッドを可変長リストで持って、とかすると無駄に複雑に
なりそうだから、>>771 の言う通り、「実行順に依存させたくない処理は
ぜんぶコールバックでやるべき」なのかも。
>上のほうで挙がってた DxApp だけど、あれは描画とタスク実行を切り離して
>別々の優先順位で処理するようになってる。
フロー制御はタスク機構だけで十分、というのは強引かな、やっぱ。(あ、俺
のシステムだとanimate、renderメソッドの呼び出しそれぞれに別々の実行順を
設定できるから、同じ事が実現できてはいる)
>>773
>> このオブジェクトとこのオブジェクトは実装一緒ってな事が多いと
>そのときには template を使って Mixin すれば OK。
あ、なるほど(w
0775名前は開発中のものです。
02/03/20 02:17ID:OKAtcaEA>(コールバックの代わりに多重継承を使うと this の受け渡しが楽
だぜ、という程度の話)
たしかに、関数のポインタを渡すより、オブジェクトのインスタンス
渡した方がいいですな。
つまり、基本はタスクでフロー制御して、その実行順に依存したく
ない物は全部GoFの言うところのCommandパターンでやるのが吉、
ってことかな?
0776名前は開発中のものです。
02/03/20 02:29ID:???C++ 限定の手法だが、template を使った Mixin の例。
template <class T>
struct hittable_invisible : public hittable
void get_hit_rect(rect& rc, hit_type& htype)
{
T& obj = static_cast<T&>(*this);
if (obj.invisible_)
rc = INVALID_RECT;
else
...
}
};
class player : public hittable_invisible<player>
{
bool invisible_;
public:
...
};
効率と汎用性、そして型安全性を全て損なわずに実現してる。ペナルティは
コードサイズの増大。
0777719
02/03/20 02:47ID:3YnMUW/P3つ?ですか?
大まかな流れはさっき書いたものなんですが、言葉足らずだったかも。
ちょっと細かく言うと、
UpdateFrame()は,ゲームアプリ、タスクマネージャ、
描画エンジン、vプリミティブ(描画)、v各TCB、v各タスククラスが持ってて、
vがついてる奴が仮想関数です。
EndScene()は今の所、託すマネージャのみのメンバ間数です。
Draw()はタスク処理とは関係ないです。
こちらは描画エンジン、各(と言っても今実装してるのはスプライトのみ)
プリミティブクラスで使ってます。
タスククラスは、
tcbBase<-tcbSprite(今これだけ)
tskBase<-各キャラタスク となってて、
tcbSpriteのメンバにVectorでtskを保持して、チェンジタスクで
切り替えています。
tcbSpriteが、(スプライト)プリミティブからリソースを貰って
UpdateFrameで更新してます。
描画エンジンの方にも、UpdateFrameはあって、アニメ処理、タスクが
弄った頂点データをビデオボードに転送したりしてます。
0778名前は開発中のものです。
02/03/20 02:51ID:???話が落ち着いたところで、そろそろ「レイヤー化する事によるメリット」を
語ってくれると嬉しいトコロだが。
そもそも「レイヤー化」を、どういう意味で使ってるのか分かってなかったり
するので、単語の定義からお願いします。
0779名前は開発中のものです。
02/03/20 03:03ID:???ああ、タスク毎の処理は1種類で、当たり判定の処理(タスク実行順に
依存したくない処理)はタスクマネージャーがグローバルに行う、ってわ
けですね。
(´ー`)。oO( 本当、人それぞれだなぁ )
0780名前は開発中のものです。
02/03/20 06:31ID:9RjuXxJB実行速度が速い、もしくは同等と書かれていたんだけど、
ヘボプログラマはCで作っておいたほうが無難ということなの?
そこで言われているCとC++との違いはクラスの使用から来るもの?
0781名前は開発中のものです。
02/03/20 07:15ID:???実際にわずかなオーバーヘッドがあるし、まずい設計では
暗黙のコンストラクタ/デストラクタによって積み重なって遅くなる。
C++についてよく理解してないと、ただ遅いだけの道具になるよ。
0782781
02/03/20 07:18ID:???同一な C プログラムなら C++ でコンパイルしても
速度はほぼ同一なはず。ライブラリとか最適化の具合にももちろんよるけど。
0783名前は開発中のものです。
02/03/20 11:13ID:???書籍「Inside the C++ Object Model」で詳細に解析してるから、それを
読むのがいいと思うが。
メンバ関数(メソッド)を呼び出す場合に this が暗黙のうちに渡されたり、
仮想関数を呼び出すと間接参照が何度か(一般には 2 回)入ったりす
る。ただ、このあたりのことは C でも同じ処理をやろうと思ったら、
関数の引数として、構造体へのポインタを渡す
関数ポインタを使う
必要があるから、ホントは変わらないんだけど。
> 暗黙のコンストラクタ/デストラクタによって積み重なって遅くなる。
synthesize constructor / destructor のことを言ってるんだと思うが、
それなら C だって「初期化処理を入れたら遅くなる」というのと同じ。
trivial constructor / destructor で済むクラスなら、初期化・終了処
理を省くことも出来るし。
C でも C++ でも「同じ処理をさせよう」と思うと、実際には「同じだけの
コストがかかる」ことになる。ただ C++ では、synthesize constructor/
destrurctor や temporary object のように
コンパイラが、見えないところでコードを付け加える
ことがあるから、そこを意識していないと、たった数行のコードなのに
コンパイルすると数千命令に展開されていた、ということが有りうるの
で注意が必要。
0784名前は開発中のものです。
02/03/21 00:42ID:I/OXI3byフォトショップのレイヤーを思い浮かべると良いと思われ。
当たり判定を取る当たり同士をグループ化して、グループに番号を付けておく。
進入禁止系のあたりをレイヤー0番に置くとして、壁、NPC、敵キャラのあたりは
HitMe( ???, 0)と呼び出してやる。プレイヤーオブジェクトはそれが壁なのかNPCな
のか区別せずにすむ。
で、レイヤー1番はアイテム系の判定として、アイテムオブジェクトとプレイヤー
オブジェクトだけが所属する。そうすればNPCオブジェクトの方で接触のあった
オブジェクトがアイテムだったら何もしない、なんてコードを書かなくて済む、と。
こんな感じ?
0785名前は開発中のものです。
02/03/21 11:11ID:???0786名前は開発中のものです。
02/03/21 13:39ID:???なるほど。参考になったよ。
0787名前は開発中のものです。
02/03/22 10:21ID:???0788名前は開発中のものです。
02/03/22 23:51ID:???すまそん。マスター入れてやっと家に帰って来れました。
レイヤー化のメリットはまさに784さんの言うとおり。汎用的な当たり判定管理クラスを
1つ作ってあとはゲームデザイン次第でプログラマが自由にレイヤーを利用みたいな感じね。
更なるメリットとしてヒットアルゴリズムの分離ってのもありまして。
「矩形の重なりによるヒット判定」
「球形や線分との距離による判定」
「背景物のようなn次元マップデータとの判定」
「ランドスケープやポリゴン等のベクトルデータとの判定」
など、これまたゲームデザインの要求に応じて利用/拡張すればいいと。
はっきりいってこの機構自体は1個作っちゃえば3Dゲームにもバリバリ
に応用できるし、斑鳩みたいな2Dの3Dの混在なんかも結構簡単に出来
るよね?
ただまぁ、C++としての実装は自分はヘタッピなのでだれか上手い実装例
をみせてくれないかなーと。テヘッ。
0789名前は開発中のものです。
02/03/23 01:20ID:???全キャラクタのタスク更新
↓
判定管理クラスの関数を呼び出し→各キャラクタのタスクのコールバック関数呼び出し
↓
描画
みたいな流れかと思ったんですが、
コールバック関数内でタスクの状態(位置など)を変化させられないと、
キャラクタ同士めり込んだ状態とかで描画されてしまいますよね?
その辺はどう処理されてるのでしょうか?
0790名前は開発中のものです。
02/03/24 05:59ID:WWKNmPMo0791
02/03/24 09:15ID:DgRqu+K20792名前は開発中のものです。
02/03/24 11:04ID:???なるほど、それは便利だ。
ちゅうか今、当たり判定で困ってるところなんだわ。
>>791
すでにそんなことはどうでもいい
0793名前は開発中のものです。
02/03/24 11:12ID:???マ板で語り尽くされた事を隔離板で吠えられてもナァ...
つーか、sagaってねぇし(藁
0794名前は開発中のものです。
02/03/25 12:06ID:???俺の場合、基本的にあたり判定の中では当たったかどうかの判定だけで
めり込んでも無視です。
当たり中に状態変化(移動、フラグ立てなど)を行うと実効順によってそれ
以降の判定が異なってしまうからです。
どうしてもやりたい場合、完全な例外処理ですね。
こいつはこういう処理だから気をつけるとかコメント書いてます。
つーか、うまい処理が思いつかん。
0795名前は開発中のものです。
02/03/31 00:07ID:???0796名前は開発中のものです。
02/03/31 06:17ID:???0797名前は開発中のものです。
02/03/31 08:22ID:???それ単体をクラスで定義しただけでは難しいと思うのだが
何かいい解決手段あったらよろしく
0798名前は開発中のものです。
02/03/31 09:34ID:???それだと、当たり判定の種類毎にレイヤー用意しなきゃいけなくなって面倒じゃない?
0800名前は開発中のものです。
02/03/31 11:32ID:???0801関係ないが
02/04/01 00:49ID:z86bt0A7最終コードのサイズが増えるという現象に遭遇して思いっきり萎え。
コンパイラのバグだがあまりにもひどいっす。
Cならこんなことはならないよなぁ・・
0802名前は開発中のものです。
02/04/01 00:56ID:???0803名前は開発中のものです。
02/04/01 01:01ID:???0804名前は開発中のものです。
02/04/01 01:35ID:???0805801
02/04/01 02:25ID:z86bt0A7classの中のstaticなinline関数が関数ローカルのstatic変数を持つコードが
あると、その関数を一度も使わなくともコード、データ領域ともその翻訳処理
単位で展開されてしまうんだよ。いわゆるシングルトンパターンの構造をもつ
ヘッダファイルをインクルードするだけで飛躍的にコード、データサイズが増加する
罠。
やっぱC++は組み込みには向いてないよな・・・。
0806名前は開発中のものです。
02/04/01 02:31ID:???0807名前は開発中のものです。
02/04/01 02:34ID:???ちなみに gcc のバージョンいくつ?
0808801
02/04/01 02:34ID:z86bt0A7static foo& Instance() {
static foo bar;
reurn bar;
}
}
これだけですが何か?
0809801
02/04/01 02:36ID:z86bt0A72.9-9911、2.96-1003、2.96-1003-1で確認したよ。
0810名前は開発中のものです。
02/04/01 02:58ID:???parse error だぞ(w まぁ、言いたい事は分かるから問題ないけど。
今、手元の gcc 2.95.3 (cygwin-special) で
class foo
{
public:
static foo& Instance()
{
static foo bar;
return bar;
}
};
void func() { foo s; }
だけのコードを g++ -S でコンパイルしてみたが、確かに .lcomm セクションに
変数 bar が確保されちゃうね。Borland C++ Compiler 5.5.1 や Visual C++
6.0 だと
警告 W8027 singleton.cpp 6: <静的変数>を含む関数はインライン展開できない(関数 fo
o::Instance() )
singleton.cpp(15) : warning C4514: 'Instance' : 参照されていないインライン関数は削除
されました。
となって、いずれのケースでも出力されたアセンブリコードに bar は存在しない。
0811名前は開発中のものです。
02/04/01 03:06ID:???inlineにしなくてもまともな実現方法がいくらでもあるんだから、
> C++は組み込みには向いてない
なんてことにはならんだろ。
0812名前は開発中のものです。
02/05/16 11:00ID:3bT9vj92GameDev.net - Object-Oriented Scene Management
http://www.gamedev.net/reference/articles/article1812.asp
0813名前は開発中のものです。
02/08/15 13:27ID:EIasLKDHOOのゲームプログラミングへの応用ということで、シリアライズの話を。
いつでもどこでもセーブできて、その場の状況を完全再現するには
シリアライズしかないと思うが、やったこと無いので良くわからず。
MFCなんかでやれるオブジェクトの動的生成って全部自前で実装する場合
どうやったら良いんだ?
0814名前は開発中のものです。
02/08/15 14:23ID:???IDとクラスを1:1でマッピング。
読み込み時にIDによって生成するクラスを決める。
0815名前は開発中のものです。
02/08/15 14:47ID:???> MFCなんかでやれるオブジェクトの動的生成って全部自前で実装する場合
> どうやったら良いんだ?
エピステーメーの「オブジェクト指向的日常」って本で、簡単な解説と実装例を
紹介をしてた。(初版ではコードに致命的なミスがあったりしたが……)
0816名前は開発中のものです。
02/08/15 14:57ID:???0817名前は開発中のものです。
02/08/15 17:33ID:???クラスファクトリを static オブジェクト化して、別の static オブジェクトに登録。
main が走り始めた段階で準備完了、としておく。
0818名前は開発中のものです。
02/08/15 17:58ID:???0819名前は開発中のものです。
02/08/15 19:30ID:???マジメに書くと長くなるんだが…。昔のコードから抜粋すると、こんな感じ。
// 永続オブジェクト基底クラス
class CPObject {
private:
static const BYTE bytMagic[3];
static const UINT MAGICLEN;
public:
virtual ~CPObject() {}
virtual BOOL equalsTo(const CPObject* obj) const {
return this == obj;
}
virtual BOOL saveIt (FILE*) const = 0;
virtual BOOL restoreIt(FILE*) = 0;
void save(FILE*) const;
static CPObject* restore(FILE*);
virtual UINT isA() const = 0;
};
0820名前は開発中のものです。
02/08/15 19:31ID:???class CPIDDict {
private:
struct CPIDRec {
UINT id;
CPObject* (*func)();
};
CPIDRec* array;
UINT size;
UINT cap;
CPIDDict(const CPIDDict&);
CPIDDict& operator=(const CPIDDict&);
public:
CPIDDict();
~CPIDDict();
static CPIDDict* theCreator();
void regist(UINT, CPObject* (*)());
CPObject* create(UINT) const;
};
■ このスレッドは過去ログ倉庫に格納されています