ゲームプログラミング相談室【Part6】
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
04/03/06 01:25ID:d2e/eEyg扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
■過去スレ
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
【Part4】http://game.2ch.net/gamedev/kako/1005/10050/1005040025.html
【Part5】http://pc2.2ch.net/test/read.cgi/gamedev/1036410116/
■関連スレなど
>>2-5
0071名前は開発中のものです。
04/04/05 17:41ID:Wxg2TEwmスタックに積む=1モーション完了して次モーション
だと、いわゆるスト2の「キャンセル」っぽい動きにはならない。
ちなみにスト2のキャンセルは行きと戻りのモーションがあって、
行きモーション中にコマンドが成功したら戻りを「キャンセル」して
次モーションにつながることから。おそらく行きモーションと戻り
モーションが別コントロールになってるんだろうね。
どういう動きをさせたいのか頭の中を整理してみるほうがいい。
0072名前は開発中のものです。
04/04/05 17:44ID:rH0o4MFm主人公キャラの位置をRAYにして、地形と障害物とのあたり判定をしようと思っています。
とりあえず、移動方向に1フレームの移動分だけレイを飛ばして速度ベクトルをその真下にしました。
地形に沿って移動はできるのですが、この方法では主人公とおなじ高さで垂直に立ってる壁とか、こっちに向かって傾斜しているポリゴンがあると困ります。
はじめにレイを進行方向に飛ばすときもあたり判定を計算すると2倍の計算量になってしまいますが、仕方ないのでしょうか。
0073名前は開発中のものです。
04/04/05 20:32ID:WG5Tm/kb何を言いたいのかさっぱりわかりません。
もっとわかりやすく書いて、
改行も入れてください。
0074名前は開発中のものです。
04/04/08 01:27ID:VoayxJMRどんなやり方してるかしらないけど。
アタリを分割すれば計算量は抑えられる。
AABBツリーを調べてみて。
0075名前は開発中のものです。
04/04/13 02:27ID:00yuZNJk今のところスクロールまで作ったのですが、画面のちらつきが気になってしかたありません。
一応バックバッファに描いてから転送するようにしています。
http://gamdev.org/up/img/475.zip
よければ解決策を教えてください。
0076名前は開発中のものです。
04/04/13 11:44ID:tK3wV3VDもしかしてティアリングのこといってるの?
0077名前は開発中のものです。
04/04/13 12:33ID:xi3HdIxL「リフレッシュレートに関する論争」スレでも検索してみるといいことがあるかも。
解決しようとするとちょっとした闇に踏み込むことになるので、覚悟するように。
007875
04/04/14 00:41ID:s1vwKqYYスレを読んだりして見ましたけど、なんかめんどいんでこのまま進めることにします。
余力があったら考えてみたいと思います。
ありがとうございました。
0079名前は開発中のものです。
04/04/14 01:24ID:fCb1f0Lhが、垂直同期周波数が環境によって違うことも多いために
垂直同期とってもゲーム内の描画とのずれでカクカクしてくることもある
その辺がばっちり解決してもWinがリアルタイムOSでない時点で完璧には無理
どの辺で妥協するかが重要と思われ
タイマとフリップ併用が一番いいと思うけどね
0080名前は開発中のものです。
04/04/14 02:16ID:bV4eSf3VRTOSでも無理だから。
0081名前は開発中のものです。
04/04/16 17:56ID:6nIx9YzbとあるPDAで擬似的な3DのGAMEを作りたいと思っています。
2Dではいくつか作って公開していますが、PDAの3Dの場合
自力で書くしかないでしょう。
今、市販されている3DプログラミングものはDirextXを利用した3Dエンジンを使用したものが
多いですね
そうではなく自力で(ある程度はしょったモノになると思います。PDAだから)3Dを書きたい人におすすめな
書籍(もちろんWindows95前後の頃のものだと思うのですが)のタイトルと簡単などういう感じか
教えてもらえないでしょうか?
※こういった質問はここでよろしかったでしょうか? よろしくお願いします。
言語はCもしくはC++です。
上げさせていただいてもいいでしょうか?
0082名前は開発中のものです。
04/04/16 18:03ID:ApfI3JPrD3Dのマニュアル
008381
04/04/16 18:15ID:6nIx9Yzb申し訳ありません D3Dとは何かの略でしょうか?
検索してみたのですが 海外の会社ばかり引っかかるようです
フルネームを教えてくださいませんでしょうか?
お手数をおかけしますがよろしくお願いします
0084名前は開発中のものです。
04/04/16 18:23ID:ApfI3JPrDirect3Dだよ。
基礎知識のページに
ジオメトリやトランスフォーム、ラスタ化ルールとか
入門に必要な情報はみんな書いてある。
008581
04/04/16 18:43ID:6nIx9YzbMSのサイトが引っかかりました。
ttp://www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/
基礎知識のページとはここでいいでしょうか?
あとDirect3Dのヘルプにも詳しいそうですね。
0086名前は開発中のものです。
04/04/16 19:29ID:ApfI3JPrhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/DirectX9_c/directx/graphics/programmingguide/gettingstarted/gettingstarted.asp
ここだけど、3Dトランスフォームとかの文章がなくなっちゃってるね。
DirectX7.0迄のマニュアルを落としてきて参照するのがいいかと。
008781
04/04/16 20:07ID:6nIx9Yzbありがとうございます。
ttp://www.microsoft.com/downloads/details.aspx?FamilyID=3a9531f6-577c-4748-b59c-2197014f544e&displaylang=ja
より DirectX7.0ドキュメントを落としております。
感謝しています。
あのう…… 非常に図々しいのですがDOSの時代ってDirectXとか無かったわけですよね
DOOMとか…… あのころの技術とこのDirectX7.0に載っている技術とは基本は変わらないと思っていて
いいでしょうか?
DOOMでは、見えないモノは書かない、省略、上下の省略などで稼いでいたようですがこれってこれから
生まれた技術でしょうか? ちょっとWindows以外なのでDOOMが参考になるかと検索しているんです。
きっちりとした3Dを必要としてないものですから
それと同時に3Dの基本の情報を知りたかったのでこちらは本当に助かりました。
本当にありがとうございます。
008881
04/04/16 20:15ID:6nIx9Yzb2002年 6月号に3Dダンジョンの作成と表示の基本アルゴリズム(DOOMも絡む)
がありますね
これを求めたいと思います
他の人の参考になれば。
0089名前は開発中のものです。
04/04/16 21:26ID:1fUHdakN似非3DならダンジョンマスターとかWizardryとかそっち系のほうがいい気がしないでもない
0090名前は開発中のものです。
04/04/16 22:18ID:CYG69g6nその手のも作っては見ますが、升目式ダンジョンではなく同じような感じの道が
ないようにしたいわけです。
なんとなくそらで道を覚えられるみたいな感じに出来たらと考えていますので。
0091名前は開発中のものです。
04/04/16 23:40ID:bAbJcDxyキャノンからでたRenderWareの分厚い本。
3Dエンジンを作るにあたって生じた技術資料を適当にまとめて
「プロご用達!」などとうたって1万前後で販売!
CDにはRenderWareが入ってるが、これを使ったソフトを配布してはならないという罠。
クラリオンに聞くと「学習用ですので」。氏ね。
009281
04/04/17 00:32ID:KupmHoyYそれってプロ御用達と学習用と矛盾してますな。誰が見てもわかるところに
これを使ったソフトの配布禁止と書かれていて、学習用と書かれているのでしょうか?
(だったらこんなに怒るわけないよな……)
とあるソフトのマニュアル的なものなんでしょうねえ
そういう3Dプログラミング物多いですよね 以外と。
0093名前は開発中のものです。
04/04/17 01:28ID:a3IXbRjM3Dプログラミングってどう言ったレベルを想定してるか分らないが
自前実装って言うならラスタライズやら必要だよね?
"コンピュータグラフィックス 理論と実践"
辺りで良いんでないの?12000円と手頃だし。
特定ハードに依存(API等)しない
3Dの数学的理論、3Dの工業的理論(汎用的なコンピューター理論)
を身に付ければ、自前実装はスグできるようになる。
その前に、実装実機の理解は必須だと思うけど。
0094名前は開発中のものです。
04/04/17 03:02ID:mkUkAsviこの本ってさ、1つの話題に対しての密度薄すぎねぇ?
技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
ってのが多々あるぞ。
式出したらせめて各変数の意味ぐらい書いとけってのが多々あってムカツク。
0095名前は開発中のものです。
04/04/17 05:17ID:a3IXbRjM自分のレベルに合わない本は、皆そう感じる物じゃない?
それに、自分の望むチャプターのみで、更にそれが根ほり葉ほり事細かな内容ってありえないでしょ。
DirectXのhelp読んで、
>1つの話題に対しての密度薄すぎねぇ?
>技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
>式出したらせめて各変数の意味ぐらい書いとけ
何て言い出す人間の大半は
プログラムとC++と3Dプログラミングの基礎を持ってから読もうねって、感じの人間が多いと思う。
それと同じかな…?って思うけど…
違うなら、不満や不足に感じる部分は、他の本や他の情報源、
そして自分の頭で解決ってなる物でしょ?
幾ら何でも、答え頂戴、全部教えて、クレクレって方針はありえないでしょ。
普通に数学の基礎とハードの基礎とプログラムの基礎を持って読めば
十分な内容でしょ、12000円程度の価格なんだし。
0096名前は開発中のものです。
04/04/17 07:53ID:Le5gnz+vあんた序文や前書きちゃんと読んでるか?
俺はこの本は持ってないが、
同系統の「Real-Time Rendering」だと
「各トピックについて深く知りたい場合は、
参考文献を充実させたのでそちらを参照してくれ」
ってちゃんと書いてあるんだが。
0097名前は開発中のものです。
04/04/17 09:41ID:VEtZ9nxQはてさて、どちらが正しいのやら。
>>95の方が読んだ事無いように見えるけど
0098名前は開発中のものです。
04/04/17 16:07ID:a3IXbRjM>同系統の「Real-Time Rendering」
両方もってるが、全然同系統じゃないぞ。
Real-Time Renderingの方は原本の奴で英語だけど。
コンピュータグラフィックス 理論と実践は
主にはCGをコンピューターで扱う原理を解説してる。
点を定義してそれらを結んでピクセルを塗る原理(ライスライズ)とか
つまり、普段はハードやらAPIが処理してる低レベル部分の理論的説明が主。
つまり、3Dソフト自体を開発したり、
DirectX使わないでWindowsでポリゴン自力描画(WinAPIは使うけど)実装したり
(勉強で昔やった)って勉強が出来る。
Real-Time Renderingはその名の通り、もうダブルバッファ前提で
いかにリアルタイムで処理時間を稼ぐとかの技術が主にある。
しかも、参考文献ってさ、文献として上がってる
本の著者と名前が載ってるだけだと思うが?
コンピューターCGの本と3Dプログラムの本、同系統では無いと思うけど?
0099名前は開発中のものです。
04/04/25 12:00ID:dZ+uD0u1Cは向いていますか?
またいいツールとかありませんか?
0100名前は開発中のものです。
04/04/25 12:06ID:JYGTOjaq0101名前は開発中のものです。
04/04/25 12:14ID:dZ+uD0u1作れると言うことですか?
今勉強中ですが、Cってゲーム作れるのか?
と不安になってきました。
絵の表示の仕方がいまだにわかんないし・・・
0102名前は開発中のものです。
04/04/25 12:17ID:JYGTOjaq絵を表示するコードが1行の命令で、画面の初期化もらくちんって環境は
世の中にたくさんあるよ。
Cの利点は何でもやろうと思えば細かいことは出来るというだけで
その利点もハードガリガリアクセスする環境ならともかく
Winとかだとほとんどメリットないね
0103名前は開発中のものです。
04/04/25 12:29ID:dZ+uD0u1ちなにみ皆さんはこういうゲームを作るときは
どの言語を使ってるんですか?
0104名前は開発中のものです。
04/04/25 13:14ID:JYGTOjaq結局使い慣れた物が一番だと思う
最近はスクリプト系も結構あるから言語になれて内人はそっちがいいかな
俺はやはりC/C++を長くやっていたから言語体系が近いjavaとCだな
C++で中途半端なオブジェクト指向やるくらいならjavaいったほうがいいし、
シンプルにガリガリ叩くときにはCって感じ
javaだと画像表示やらシステム部分に時間をかけないでゲームの処理のみに
専念できてる感じがいい
Cとかはもちろん必要コード量が多くなるのでライブラリ整備が必須になって
変にシステムをいじってばかりでゲームに専念できないことも多い^^;
>>103がさわれそうな環境はC以外になにかあるの?
画像表示からうまくできてないということはDIBやらDirectXから出来るようになるには
かなり時間かかると思うから他を勧めたい
0105名前は開発中のものです。
04/04/25 13:34ID:dZ+uD0u1もっとも勉強しやすい環境にあるのはCだと想います。
こだわりと言うわけではありませんが、
できればCで作りたいと思っています。
>画像表示からうまくできてない
まだ勉強中なのでそこまで達していなのかもしれません
一応C入門の本は1冊読んだのですが・・・
0106名前は開発中のものです。
04/04/25 14:07ID:vDhsPj0Uみたいなもんだな。
CでやるとしてもまずはコンソールじゃなくWindowsプログラミングやらんといかんし。
まーいっそコンソール&glutって手もあるが。
0107名前は開発中のものです。
04/04/25 14:22ID:JYGTOjaqゲームプログラムが全く出来ない人もたくさんいる
ゲームに必要な知識と、そのプラットフォームで絵を出すとか
システムに必要な知識は全く別物なわけで
逆にスタンドアロンのゲームは作れるけどウインドウシステム上での
ゲームは作れないという人もいる
今のちみの状態は分からないことが多すぎかと
言語自体も本読んだというレベルなら表面上のものだけだと思うので
ポインタガンガン使えるというレベルまで言ってないと思われ
一番重要なのは目的がゲームを作ることなのか、それともC言語を
勉強したいのかってところだよ
昔はC言語&ゲーム作りたいってことが多かったと思うけどこれは
生産性を上げつつマシンスペックが低かった時代これしか選択肢がなかっただけ
8bit時代BASICでゲーム作って遅かったのでしかたなくハンドアセンブルへ
そして16bitになりメモリが多少裕福になってC言語へって人は多いはず
言語が目的ではないんだよ
それにプログラマは複数の言語が使えるのが普通
1つの言語で今後もいくとは思えない
0108名前は開発中のものです。
04/04/25 14:52ID:dZ+uD0u1かなり無謀だったみたいですね。
もちろんゲーム作成が目的ですが、
今は置いておいて、Cをがんがん使えるようになろうと思います
0109名前は開発中のものです。
04/04/25 15:36ID:RwxVe3k8次にC++をいくらかかじって、
あとはDirectXに進めばOK。
このQ&Aってもう何度もされてるよね。
ゲームプログラミングのまともな入門サイトor本がないということだろう。
どうにかならないもんかね?
0110名前は開発中のものです。
04/04/25 15:47ID:JYGTOjaqそれほど山のように雑誌はあった
ベーマガ、MSXFANなど読みやすくて分かりやすいシンプルな物がないからね
あとは個人レベルで作る物と商業レベルとでできあがる物が違いすぎるというか
でも昔から初心者向けと上級者向けはあってもその間の中レベル向けが
ほとんど存在しないと言う問題もあったよ
たとえばC言語は分かって絵も描画できる、でも具体的にゲームで必須な
垂直同期がなんなのかとかラスター割り込みがどうとかそういった物は
なかなかいいものはなかった
DirectXやるときC++よりCでやったほうが楽な気がする
0111名前は開発中のものです。
04/04/25 15:58ID:+MyYZ79o綺麗な使い方が出来ないと思うC++
0112名前は開発中のものです。
04/04/25 16:18ID:itt2Cin5DirectXやったことないけど、呼び出すだけだからどっちでも一緒じゃ?
0113名前は開発中のものです。
04/04/26 09:29ID:YvjKmIIw綺麗な使い方には絶対にならない。
0114名前は開発中のものです。
04/04/26 15:22ID:AM2u3eHSいや、そういうことじゃなくて、アレだろ?
C++なんだけどC風に組むとかそんなんだろ。多分。
でも、C++風に組んだ方が楽だと思うけどね。俺は。
0115名前は開発中のものです。
04/04/28 01:45ID:LxpA+NNA潔癖主義かつ無能なら何を使っても汚く感じるだろう。
0116名前は開発中のものです。
04/04/28 15:15ID:ELYXrsLP0117名前は開発中のものです。
04/04/28 20:35ID:brIWsk8Jなにが汚くなる可能性があるのか具体的に言ってみろばかー
0118名前は開発中のものです。
04/04/28 20:38ID:YnOaqFHo0119名前は開発中のものです。
04/04/28 20:52ID:brIWsk8J清純可憐で微妙なエロスの漂う穢れのないコードかけてるっつーの
0120名前は開発中のものです。
04/04/28 23:03ID:qRKYM2ci0121名前は開発中のものです。
04/04/29 00:07ID:klVfh8nk特別ですね。
言語レベルで厳格な貞操帯を装着しないと、猿のようにオナーニを
いえ独り善がりな汚いコードを書いてしまう無能には「C++は特別」です。
特別汚いコードを書ける言語です。彼等にとっては大きな問題です。
貞操帯を装着しなくても問題の無い一般人にとっては瑣末な問題です。
0122名前は開発中のものです。
04/04/29 01:29ID:ZbXlsRAe0123名前は開発中のものです。
04/04/29 03:54ID:w6BRdvWr0124名前は開発中のものです。
04/04/29 04:02ID:tELycjcoCEntityは自律行動を行うクラスで主にAIの更新を行う仮想関数Update()を持つ。
CRenderNodeはレンダラに登録され描画を行う仮想関数Render()を持つ。
CCollisionNodeはデフォルトの当たり判定を実装してあって衝突を検出したら仮想関数Collide()を呼び出す。
関連性のない3つのクラスからの多重派生ですがこれは邪道でしょうか?
また、みなさんはこの3つの要素をどの様にクラス化してますか?
ご意見お聞かせくださいませ。
0125名前は開発中のものです。
04/04/29 04:54ID:ffNyJU4j平和な奴だ。糞汚いコードを書いてばかりの低脳に
Java、C#、Dを試させてみたことがないんだろうな。
言語仕様上の規定(貞操)が厳格であるために
クルクルパーな悪性のハックは多少は減るが
やっぱりおかしなコードを書くんだよ。
馬鹿に付ける薬は無い。言語変えても駄目な奴は駄目。
0126名前は開発中のものです。
04/04/29 05:01ID:dU1CdeTe俺の場合、
class CCharacter : public CEntity
CRenderNode,CCollisionNodeはCCharacterのメンバ
理由は、描画リソース、コリジョンはいらないキャラのいるから。
例えば、ジェネレータとか。
とある理由で、CEntityをメンバにした事もある。
0127名前は開発中のものです。
04/04/29 05:08ID:klVfh8nk邪道・正道にはとやかく言及しないが
「〜Node」な2つの基底クラスの間で名前衝突が起きないってのが
ぶっちゃけあり得ない。背後にぐちゃぐちゃなメソッドの群れの気配がする。
0128名前は開発中のものです。
04/04/29 08:15ID:0gA9laqu肝心なのはその上位で、CCharacterのインスタンスの集合を管理しているクラスが
こいつをどういう風に扱うかにあると思う。
誰がどうやって生成して、どういうリストに組み込まれて、誰がメソッドを呼び出して、
誰がどうやって破棄している?
0129名前は開発中のものです。
04/04/29 09:54ID:r5N/wC7K俺はちょっと違うなCharacter以外はCharacterのメンバにする。
ちょっと>>124は機能とオブジェクトをいっしょにしてるのがよくなさげ。
継承で考慮するのはオブジェクト指向の説明でよく出てくる
犬と猫は哺乳類で・・・云々の話だけでいい。
もしEnemyなんてのが出てきたら、Characterから継承するって感じの使い方かな。
EntityやRender、Collisionなんてのは明らかに
Characterが所有しちょるものなのでメンバでいいと思う。
Characterより上の方のクラスに入れるかもしれないものもあるね。描画とか。
まあ、クラスのまとめ方が、複数のクラスの処理を一括してやろうと頑張りすぎてて、
かつ、これから継承するものの違いまでカバーしようとしている感じがする。正直うまくない。
まあ、処理で考えるなら、
衝突の検出なんてのは関わるもの同士によって必要な情報が全然違うから
一括処理なんて必要ないならしないほうがいいと思うよ。(仕様変更あると思うしw)
逆に描画なんてのはどれも同じ処理になるはずじゃね?
Characterもしくはその基底クラスがRenderなんて関数をもってればそれでいいような気がする。
AIクラスなんていったら、結構隔離できるクラスのような気がするが
実は他のクラスとの関連が一番多くなるクラス、また、他のクラスとの関連も一番特殊になるクラスだと思う。
何せAIの判断材料に他のクラスの情報が確実に必要になるからね。
AIってのはCharacterそのものになると思うんだけどどうだろうか?
例えばCharacterから範囲10以上に近づいたら、なんてやったらAIにCollisionのデータを使った衝突の検出が必要になるよね?
こういう処理自体をライブラリにするのはいいと思うけど、それに必要になる材料はもろにクラス同士の設計の関連になるわけで略w
0130124
04/04/29 13:08ID:tELycjcoCCollisionNodeをメンバにするのは考えましたが、
CRenderNodeをメンバにしてしまうと自身で描画コードを持てないので
描画情報を登録して後で一括描画してもらうって形ですよね。
この場合ちょっと複雑な事をやりたい場合にCRenderNodeに手を加えるハメになりそうですがどうでしょうか?
2Dなら描画形態は限られてくるのでメンバに持ってしまうかもしれませんが。
0131124
04/04/29 13:09ID:tELycjco〜Node系は特定の機能を保有する事を保証するインターフェイスのような物なので今のところ名前の衝突はないですが、
拡張した場合に仰るとおりのぐちゃぐちゃなメソッドの群れになる可能性は大いにありますね。
0132124
04/04/29 13:09ID:tELycjco生成は各entityが任意にnewしてEntity管理クラスに突っ込み、
entityMgr.Add(new CEnemy); // class CEnemy : public CCharacter
各entityが初期化時に必要に応じて描画管理クラスやコリジョン管理クラスに自身を登録してます。
renderer.Add(this);
collisionMgr.Add(this);
各管理クラスが全登録インスタンスの仮想関数 Update(), Render(), Collide() を呼び出しており、
entity間のやりとりはentityMgr経由でメッセージを送受信して行ってます。
破棄は自分自身でentity管理クラスに破棄要求を出してentity管理クラスがインスタンスをdeleteします。
entityMgr.Remove(this);
なんだか鬱設計ですね。
0133124
04/04/29 13:09ID:tELycjco>>ちょっと>>124は機能とオブジェクトをいっしょにしてるのがよくなさげ。
>>EntityやRender、Collisionなんてのは明らかに
>>Characterが所有しちょるものなのでメンバでいいと思う
コリジョンや描画をメンバにするのはある程度納得出来るのですが、
自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
状態のみを委譲してそれを受けて自身の行動に変化をつけるのでしょうか?
たぶん違うぽ(つд`)
ゲーム内に登場するオブジェクトの殆どはCCharacter派生クラスだと思うんです。
確かに画面には表示されないステージ管理クラスや当たり判定を行わないスコア表示部分などはありますが、
それらは本当に限られてくるんじゃないでしょうか。
共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
より汎用性があるかなーと思った訳です。
0134名前は開発中のものです。
04/04/29 15:51ID:r5N/wC7K管理クラスって作った奴が思うほど役に立たないことが多いから
もうちょっと設計考えて見た方がよくね?
>>133
>自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
どう組んでるのか詳細までは知らないけど、
結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
ならそういう使い方でいいじゃない?
>共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
>より汎用性があるかなーと思った訳です。
それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
別にこう↓組んでも組めるっちゃあ組めると思うよ。
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {};
ただわかりづれぇって一点を除けばw
0135名前は開発中のものです。
04/04/29 18:18ID:0gA9laquとりあえずそのノリなら漏れはついていけるから安心していいよ
邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
状態は改良できるとこだと思う
0136名前は開発中のものです。
04/04/29 18:20ID:K2EIDtC00137名前は開発中のものです。
04/04/29 20:30ID:klVfh8nk~~~~~~~~
問題は何もない。続けて良い。
0138名前は開発中のものです。
04/04/29 21:45ID:0gA9laquなんでentity間のやりとりの一種として扱わないの?
0139名前は開発中のものです。
04/04/30 02:06ID:zWQ1T1ukスマン。やはり、CRenderNodeがどういったものか、理解せずに
答えたので、見当違いだったかも。
CRenderNodeは描画機能?をもっていて、描画する対象のインスタンスではない。
て事かな?
因みに俺はインスタンスを含むと思っていたので、あくまでも、メンバ(参照用のポインタ)という扱い。
(キャラと描画物が1対1ではないという事)
とあるミドルウェアでは、大概のクラスが、シーングラフノードの派生。という構造もあったし、
そういうのも面白いとは思うよ。
0140名前は開発中のものです。
04/04/30 02:41ID:TdoOcGaP0141124
04/04/30 04:19ID:r3mzBY0g>>管理クラスって作った奴が思うほど役に立たないことが多いから
全AI更新→全衝突判定→全描画
こんな感じにUpdate()やRender()ってのは一括して呼ばれるのが普通だと私は思ってます。
誰かが管理して順番に呼び出した方がスッキリしているような気がしますがどうでしょうか?
管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
それともリストをグローバルで持ってメインループか何処かで呼び出す?
誰かに管理させた方が不用意にノードにアクセスされないだろうしこれが普通かなーと
思ってたんですが一般的ではないんですかね。
>>結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
この部分の話の流れとしてはCEntityから派生せずに
メンバとしてCEntityを持ったほうがいいよって解釈でよろしいでしょうか?
実際に移動を行う処理やアニメーションを行う処理なんかはAIと分離すべきだと思うのですが、
AIの部分をメンバに委譲して且つ自分ではUpdate()を持たないとなると
自分自身は何も行動を起こせないただの入れ物になりますよね?
うーん。
>>それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
それが引っかかってたので質問した訳です。そしたらその他の部分でボロが出まくる出まくる(;´Д`)
CRenderNodeやCCollisionNodeをメンバに持つってのはいいんですが
CEntityをメンバに持つメリットというか意味が理解できないのです。
0142124
04/04/30 04:33ID:r3mzBY0g>>邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
>>状態は改良できるとこだと思う
でもリスト構造とかってそういう物ではないんですか?
ああ、ノード自身が管理クラスに登録するってのがマズイ訳ですね。
その点CEntity以外をメンバとして持った場合は
renderer.Add(this);
はアリですよね。
0143124
04/04/30 04:35ID:r3mzBY0g>>邪道かどうかは別として、衝突判定が特別扱いされているのが気になる
自分の中では一括処理ってのが根底にあったので特別扱いになってます。
全ゲームオブジェクトの行動が終わってから衝突判定を一括で行うのでどうしても
管理クラスに自分を登録して後で判定を実行する必要があったんです。
Update()の中で衝突処理も行うとすればAI処理の一部として実装できますし、
自由度は増すと思いますがこれはゲームの規模や構造にもよりますよね。
0144124
04/04/30 04:38ID:r3mzBY0gすみません、説明不足だったようですね。描画対象ではないです。
CRenderNodeはインターフェイスです。基本的にvirtual void Render() = 0;が定義してあるだけで、
レンダラがこれを任意のタイミングで呼び出します。
派生クラスはRender()を実装して1つもしくは複数のモデルをデバイスに対して描画してます。
0145名前は開発中のものです。
04/04/30 05:47ID:iUVDJkHq>管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
>各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
ん?処理の順番って基本的にこうやらないとまずくないか?
だって、親子関係では親から処理を実行していくようにしないと矛盾がおきないか?
子がワールド座標を欲しがるとき、親がすでに正しい位置に動いてくれていないと
子のワールド座標はバグるはずだけどどうよ?
>CEntityをメンバに持つメリットというか意味が理解できないのです。
俺はEntityクラスはキャラクタの行動を制御するものだと思ってたんだけど
実はただのAIクラスなの?
0146135
04/04/30 12:37ID:LSXN/0+O管理される側が管理者のインスタンスを握っていて、
自分の登録と削除だけしかさせてもらえないならいいけど、
そうなってはいないでしょう?管理者を管理するクラスのために用意してある
メソッドにも自由にアクセスできるようになってしまっているはず。
インスタンスが無駄にグローバルになってるとか、
privateになっているべきメンバがpublicだったりするような程度でマズイです。
ヘッダのインクルードもクロスしてるでしょう。
そういうのはできるだけなくしていったほうがいいと思うよ。
>>143
シューティングゲームをつくってるのかな?
この衝突判定は「何に」当ったたのかみたいなことは分からなくてもいいの?
引数で衝突相手をもらうとしても、 Collide(const CollisionNode&) にならざるをえないし
これでは大抵は困ると思うけども
0147124
04/04/30 19:52ID:r3mzBY0g管理クラス内にリストを持って実行順位毎に実行させるのと(現状はこれ)、
木構造にしてルートのUpdate()を呼んでやるのってのは実質的に同じだけど
木構造の方が何かと便利だよって事でしょうか。
何にせよルートノードは全ての子から見えるわけですよね?
インスタンスを晒さずに特別なアクセス関数を作るにしても
結局管理クラスと同じような存在になっていまうと思うんですがどうでしょうか?
>>実はただのAIクラスなの?
Entityは毎フレームUpdate()が呼ばれ続けるただのAIクラスって認識なので
EnemyはCEntityから派生させている訳です。
状態遷移や座標の更新、子entityの生成などをUpdate()内で行ってます。
0148124
04/04/30 19:59ID:r3mzBY0g管理される側がインスタンスを握っているってイメージでは無いんですが、
管理クラスはシングルトンになっててほぼ全てのゲームクラスから見えてます。
単にリストのノードってのであればノードがリストのインスタンスを
知っている必要はまったく無いですが、
個が主体となるEntityでは知らないと何も出来ないですよね?
隠蔽さえ出来ればいいのであれば管理者のインスタンスを隠蔽して登録、削除は専用の
グローバルな関数経由で行うってのでも現状よりはマシなのでしょうか。
はい、シューティングです。
現状ではまさに Collide(const CollisionNode&) これですね。
CollisionNodeに相手のポインタを仕込ませているので
そのポインタ経由で相手の情報を得てますがやっぱりマズイでしょうか?
0149名前は開発中のものです。
04/04/30 22:20ID:iUVDJkHq>管理クラス内にリストを持って実行順位毎に実行させるのと
この管理クラスって結局Updateを毎回読んでやるただそれだけのクラスなんだよね。
はっきりいっていらないんじゃないかなぁ。ってこと。
正直、完全自己完結処理な物体ぐらいしか恩恵が全くといっていいほどないじゃん。
一度管理クラスを捨てて1から考え直してみたらどうかな?
>Entityは毎フレームUpdate()が呼ばれ続けるただのAIクラスって認識なので
Entityクラスを継承してCharacterクラスができてるのはなんか
オブジェクト指向的にわかりにくくないか?(C++の機能としてできるって意味とは別にして)
基本に戻って犬と猫は哺乳類でってところから考えると、
キャラクタはAI(脳みそ)でってなってちょっと変だ。
キャラクタは脳みそをもっていてって考えた方が綺麗に組めるんじゃないかな?
>>148
>管理クラスはシングルトンになっててほぼ全てのゲームクラスから見えてます。
こりゃグローバル変数と何も変わらないよ。
これが駄目だとわからないとなると、ちょっと修行が必要。
ちょっと面倒だけど、引数から渡すように改善できないかな?
0150名前は開発中のものです。
04/04/30 23:35ID:h3JIWfFc例えば、引数を渡した関数から、他の関数を呼ぶときは同様に引数を渡さねばならない。
その関数から他の関数を呼ぶときも(以下略)
リファクタリングする度に、引数付き関数が増えていく。
さらに、引数がいらない関数から、引数がいる関数を呼ぶ必要がある時は、
呼び出し元を辿って全てを引数付き関数に変更せねばならない羽目に。
結局気づいてみると、ほとんどの関数が引数つきに。
一本の大きな関数で書ききるなら行けるが、
そうでない場合は、地獄を見ることに……
実際、引数わたしで上手く行っている人の話が聞きたい。
0151名前は開発中のものです。
04/04/30 23:46ID:FlQn5mKE>例えば、引数を渡した関数から、他の関数を呼ぶときは同様に引数を渡さねばならない。
>その関数から他の関数を呼ぶときも(以下略)
>リファクタリングする度に、引数付き関数が増えていく。
漏れもハマったことあるな(w
0152名前は開発中のものです。
04/05/01 00:08ID:AwZfI0KO何でもかんでもメッセージパッシングでやればパフォーマンス落ちるのと同じで。
膨大な数のインスタンスを高速処理せねばならないエンジン部に近いなら
美しさに伴う冗長性を嫌って汚いハックに走らざるを得ないし。
0153名前は開発中のものです。
04/05/01 00:11ID:AwZfI0KO0154名前は開発中のものです。
04/05/01 00:20ID:Jz0Md+j7構造体で渡していくらか防げるかも。
でも、俺は引数増えても気にしないほうだなぁ。
DirectXがああだからしょうがないって言えばそうなんじゃない?
0155名前は開発中のものです。
04/05/01 04:02ID:HtCFg7B3綺麗か汚いかじゃなくて、何を言いたいのかを考えてインターフェイスの仕様は決めるべき。
まして2chの名無しがうるさく言っていたからなんて理由では(ry
その参照の元が、そのインスタンスの一生のうちに変わる可能性があるということを示唆
するために、毎回参照を渡すようにしなさい。
その参照の元が、そのインスタンスの一生のうちに変わる可能性がないということを示唆
するために、コンストラクタで受け取り自分のメンバに格納しておくようにしなさい。
どちらが美しいとかどちらが汚いとかではない。
0156名前は開発中のものです。
04/05/01 04:56ID:HtCFg7B3>個が主体となるEntityでは知らないと何も出来ないですよね?
管理者のインスタンスで何をしたい?他entityの検索とかかな。
>現状よりはマシなのでしょうか
インスタンスを生成した人がその人の好きな場所に登録できるのがいちばんよいよ。本当はね。
>CollisionNodeに相手のポインタ
どういうクラスへのポインタ?
0157124
04/05/01 06:39ID:bkNOTeqKそうですね。実際にコード化してみて比較しながら考えてみます。
>>キャラクタは脳みそをもっていてって考えた方が綺麗に組めるんじゃないかな?
理想はそうかもしれませんが実際キャラクタが自分の手足に命令を出したほうが
コード的に自然な作りになりませんか?
頭脳をメンバとして持った場合、親(キャラクタクラス)経由で手足クラスに命令を出す
となると複雑になりませんかね。
>こりゃグローバル変数と何も変わらないよ。
変わらないですね。
生成&破棄が頻繁に行われるオブジェクトや状態が変化するものに関しては隠蔽すべき
だと思うんですがシステムで唯一無二の存在であろう管理クラスくらいはグローバルでも
いいと思うんですがどうでしょうか?
管理クラス的なものはそんなにポコポコ作らないでしょうし。
0159139
04/05/01 06:50ID:9Tu48i71ああ、そんな気はしてたが、
virtual void Render() = 0;が定義してあるだけ。か。
俺ならCGameObjectてなクラス作って、メゾットにしちゃうか。
Update()も同様に。
CRenderNodeという名前は、紛らわしいね。tree構造を連想させられる。
管理クラスは、俺も用意してる。
シングルトンで、ファクトリパターンクラスの派生。
作ってるものも同じ。シューティング。
AIは用意してないけど、その辺りを用意すれば、アクションゲームもOK。
ただ、AIをハードコーディングしようとは思わないが。
ありものを作るなら、大抵、コリジョン判定、条件判定の組み合わせが違うだけだから。
0160124
04/05/01 06:58ID:bkNOTeqK>>管理者のインスタンスで何をしたい?他entityの検索とかかな。
そうですね。
Entity間のやり取りでも管理者をかませた方が不正アクセスをチェック出来たり
デバッグ用のアクセスログ吐かせたり延滞メッセージ的な通知とかも出来そうだし。
仲介役が居ることのメリットはあるんじゃないかと思います。
>>どういうクラスへのポインタ?
ここで言うところのCCharacterですかね。
この部分は正直変な事になってると思います・・・。
0161124
04/05/01 07:22ID:bkNOTeqKCGameObjectを管理するクラスがあってそのクラスがレンダラを持ってるんでしょうか?
例えば管理クラスが全ゲームオブジェクトのUpdate()を呼んでからレンダラの参照なんかを
Render()に渡してあげるとか。
AIはハードコーディングしてしまうかも。
部分的に再利用可能な形にする事もできるしちょっとした色付けは外部ファイルから
入力してあげれそれで十分かなーと。
0162139
04/05/01 07:48ID:9Tu48i71実際、今作ってるものには、CGameObjectというクラスはないんだけど、、。
CGameObjectもしくは、CGameObjectManagerが、必要なタイミングで
(生成時、初期化時、視界内に入ってきたとき等々)
に、描画エンジンのmanagerを使って、描画オブジェクトを生成。と。
で、擬似コード
app::Update(frame)
{
描画manager->Update( frame );
GameObjectManager->Update( frame );
}
と。
描画機能と、ゲーム(CPU)的な機能は分離してます。
0163139
04/05/01 07:53ID:9Tu48i71要するに、CGameObjectは、レンダラ機能はもたず、
レンダラがもつ描画ノードの参照を持ってるだけ。
update()時も、描画用のセットアップをしているだけ。
0164名前は開発中のものです。
04/05/01 08:16ID:Jz0Md+j7>頭脳をメンバとして持った場合、親(キャラクタクラス)経由で手足クラスに命令を出す
>となると複雑になりませんかね。
どうして?変わらないと思うけど。
手足クラスが何やるか知らないけど、頭脳と手足が認識できる構造なら
どういう処理にしろクラスにしちゃった方がわかりやすいじゃん。
>システムで唯一無二の存在であろう管理クラスくらいはグローバルでも
>いいと思うんですがどうでしょうか?
駄目だよ。グローバル変数が駄目な理由も理解してないな。
システムで唯一無二のものを直接コードに入れちゃうってことは
そのクラスはそこでもう身動きがとれなくなっちゃうってことだよ。
どこでもどんなタイミングでもアクセスできちゃうし、
一番怖いバグが出るパターンだよ。
0165名前は開発中のものです。
04/05/01 10:28ID:W4jVRbBSなりませんでした
概念だけは美しいが、コードは美しくなく汚くなっただけ
なんだかC言語で、OOやったときのような気分
0166名前は開発中のものです。
04/05/01 11:23ID:Jz0Md+j7なんでそう見た目だけにかき回されるのか激しく疑問。
いくらコードが美しくたって概念が糞なら糞。
>>155のいう通りだろ。
0167名前は開発中のものです。
04/05/01 11:31ID:W4jVRbBS>>150みたになるのを防ぐ方法が挙げられなければ、
スパゲッティなコードになることを回避できない。
0168名前は開発中のものです。
04/05/01 11:33ID:W4jVRbBSわかりにくいな
むしろ、実装してみると、概念にかき回される、と言いたい
0169名前は開発中のものです。
04/05/01 11:42ID:Jz0Md+j7じゃあ構造体でわたせば?(これで解決するよね?)
0170名前は開発中のものです。
04/05/01 11:53ID:HtCFg7B3>仲介役が居ることのメリットはあるんじゃないかと
なにもできないわけじゃないなら、管理される側からは管理している側が見えないように
しておいたほうがよい。管理する側の何かを変更をしたい時に、
管理される側にはその変更によって何も影響がないということを確信をもって取り組むことができる。
そのメリットの方が仲介役と管理者がいっしょにいることより大きいと思うよ。
もしも仲介役が必要ということなら仲介役クラス、というかインターフェイスをつくって
entity生成時に持たせてあげるようにしたらいい。
>>164
>グローバル変数が駄目な理由も理解してないな。
グローバル変数は、そのクラスが変更されたとき、膨大なコードの全体に対して
影響が及んだかどうかチェックして問題がないことを確信がもてる精神力が
あるのなら使える。ぼくは精神力に自信がないのでシングルdをさらすことはせず
必要とされる単純な処理だけをstaticメソッドとして公開してるyo
■ このスレッドは過去ログ倉庫に格納されています