トップページgamedev
981コメント424KB

ゲームプログラミング相談室【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
0095名前は開発中のものです。04/04/17 05:17ID:a3IXbRjM
>>94
自分のレベルに合わない本は、皆そう感じる物じゃない?
それに、自分の望むチャプターのみで、更にそれが根ほり葉ほり事細かな内容ってありえないでしょ。

DirectXのhelp読んで、
>1つの話題に対しての密度薄すぎねぇ?
>技術の名前だけのってて「はぁ?こりゃなんも説明できてねぇよ」
>式出したらせめて各変数の意味ぐらい書いとけ
何て言い出す人間の大半は
プログラムとC++と3Dプログラミングの基礎を持ってから読もうねって、感じの人間が多いと思う。
それと同じかな…?って思うけど…

違うなら、不満や不足に感じる部分は、他の本や他の情報源、
そして自分の頭で解決ってなる物でしょ?
幾ら何でも、答え頂戴、全部教えて、クレクレって方針はありえないでしょ。

普通に数学の基礎とハードの基礎とプログラムの基礎を持って読めば
十分な内容でしょ、12000円程度の価格なんだし。

0096名前は開発中のものです。04/04/17 07:53ID:Le5gnz+v
>>94
あんた序文や前書きちゃんと読んでるか?
俺はこの本は持ってないが、
同系統の「Real-Time Rendering」だと
「各トピックについて深く知りたい場合は、
参考文献を充実させたのでそちらを参照してくれ」
ってちゃんと書いてあるんだが。
0097名前は開発中のものです。04/04/17 09:41ID:VEtZ9nxQ
>>95 >>96
はてさて、どちらが正しいのやら。
>>95の方が読んだ事無いように見えるけど
0098名前は開発中のものです。04/04/17 16:07ID:a3IXbRjM
>>96
>同系統の「Real-Time Rendering」
両方もってるが、全然同系統じゃないぞ。
Real-Time Renderingの方は原本の奴で英語だけど。

コンピュータグラフィックス 理論と実践は
主にはCGをコンピューターで扱う原理を解説してる。
点を定義してそれらを結んでピクセルを塗る原理(ライスライズ)とか
つまり、普段はハードやらAPIが処理してる低レベル部分の理論的説明が主。
つまり、3Dソフト自体を開発したり、
DirectX使わないでWindowsでポリゴン自力描画(WinAPIは使うけど)実装したり
(勉強で昔やった)って勉強が出来る。

Real-Time Renderingはその名の通り、もうダブルバッファ前提で
いかにリアルタイムで処理時間を稼ぐとかの技術が主にある。
しかも、参考文献ってさ、文献として上がってる
本の著者と名前が載ってるだけだと思うが?

コンピューターCGの本と3Dプログラムの本、同系統では無いと思うけど?
0099名前は開発中のものです。04/04/25 12:00ID:dZ+uD0u1
戦闘シュミレーションゲームつくるのに
Cは向いていますか?
またいいツールとかありませんか?
0100名前は開発中のものです。04/04/25 12:06ID:JYGTOjaq
どういう物かはわからんが言語はまず関係ないと思った方がいいぞ
0101名前は開発中のものです。04/04/25 12:14ID:dZ+uD0u1
ということはCをちゃんと使えるようにさえなれば
作れると言うことですか?
今勉強中ですが、Cってゲーム作れるのか?
と不安になってきました。
絵の表示の仕方がいまだにわかんないし・・・
0102名前は開発中のものです。04/04/25 12:17ID:JYGTOjaq
逆にいえばその程度でつまずくなら(失礼)Cにこだわる必要ないんじゃないの?
絵を表示するコードが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で作りたいと思っています。

>画像表示からうまくできてない
まだ勉強中なのでそこまで達していなのかもしれません
一応C入門の本は1冊読んだのですが・・・
0106名前は開発中のものです。04/04/25 14:07ID:vDhsPj0U
「高校受験したいんです。小学校の課程は修了しました」
みたいなもんだな。

CでやるとしてもまずはコンソールじゃなくWindowsプログラミングやらんといかんし。
まーいっそコンソール&glutって手もあるが。
0107名前は開発中のものです。04/04/25 14:22ID:JYGTOjaq
そもそも言語が分かってさらにGUIまわりも分かっていても
ゲームプログラムが全く出来ない人もたくさんいる

ゲームに必要な知識と、そのプラットフォームで絵を出すとか
システムに必要な知識は全く別物なわけで

逆にスタンドアロンのゲームは作れるけどウインドウシステム上での
ゲームは作れないという人もいる

今のちみの状態は分からないことが多すぎかと
言語自体も本読んだというレベルなら表面上のものだけだと思うので
ポインタガンガン使えるというレベルまで言ってないと思われ

一番重要なのは目的がゲームを作ることなのか、それともC言語を
勉強したいのかってところだよ

昔はC言語&ゲーム作りたいってことが多かったと思うけどこれは
生産性を上げつつマシンスペックが低かった時代これしか選択肢がなかっただけ
8bit時代BASICでゲーム作って遅かったのでしかたなくハンドアセンブルへ
そして16bitになりメモリが多少裕福になってC言語へって人は多いはず

言語が目的ではないんだよ
それにプログラマは複数の言語が使えるのが普通
1つの言語で今後もいくとは思えない
0108名前は開発中のものです。04/04/25 14:52ID:dZ+uD0u1
とりあえず今ある知識でゲーム作ろうというのが、
かなり無謀だったみたいですね。
もちろんゲーム作成が目的ですが、
今は置いておいて、Cをがんがん使えるようになろうと思います
0109名前は開発中のものです。04/04/25 15:36ID:RwxVe3k8
まずCをしっかりできるようにして、
次に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:itt2Cin5
綺麗な使い方ってどんなの?
DirectXやったことないけど、呼び出すだけだからどっちでも一緒じゃ?
0113名前は開発中のものです。04/04/26 09:29ID:YvjKmIIw
CだとCOMを間接的に呼ばなければならないので、
綺麗な使い方には絶対にならない。
0114名前は開発中のものです。04/04/26 15:22ID:AM2u3eHS
>>113
いや、そういうことじゃなくて、アレだろ?
C++なんだけどC風に組むとかそんなんだろ。多分。

でも、C++風に組んだ方が楽だと思うけどね。俺は。
0115名前は開発中のものです。04/04/28 01:45ID:LxpA+NNA
>>111
潔癖主義かつ無能なら何を使っても汚く感じるだろう。
0116名前は開発中のものです。04/04/28 15:15ID:ELYXrsLP
いや、C++は特別だろ。
0117名前は開発中のものです。04/04/28 20:35ID:brIWsk8J
俺はC++でDirectX使ってるが、デザインはうっとりしてしまうほど綺麗にできてるよ。
なにが汚くなる可能性があるのか具体的に言ってみろばかー
0118名前は開発中のものです。04/04/28 20:38ID:YnOaqFHo
一人よがり
0119名前は開発中のものです。04/04/28 20:52ID:brIWsk8J
思わずモニタにティンコこすりつけたくなっちゃうくらい
清純可憐で微妙なエロスの漂う穢れのないコードかけてるっつーの
0120名前は開発中のものです。04/04/28 23:03ID:qRKYM2ci
じゃぁ見せろ
0121名前は開発中のものです。04/04/29 00:07ID:klVfh8nk
>>116
特別ですね。
言語レベルで厳格な貞操帯を装着しないと、猿のようにオナーニを
いえ独り善がりな汚いコードを書いてしまう無能には「C++は特別」です。
特別汚いコードを書ける言語です。彼等にとっては大きな問題です。
貞操帯を装着しなくても問題の無い一般人にとっては瑣末な問題です。
0122名前は開発中のものです。04/04/29 01:29ID:ZbXlsRAe
平和なやつらだ。C#とかDとか試してみたことないんだろうな。
0123名前は開発中のものです。04/04/29 03:54ID:w6BRdvWr
Dは処理系がひとつしかないし、バグバグだからなぁ
0124名前は開発中のものです。04/04/29 04:02ID:tELycjco
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {};

CEntityは自律行動を行うクラスで主にAIの更新を行う仮想関数Update()を持つ。
CRenderNodeはレンダラに登録され描画を行う仮想関数Render()を持つ。
CCollisionNodeはデフォルトの当たり判定を実装してあって衝突を検出したら仮想関数Collide()を呼び出す。

関連性のない3つのクラスからの多重派生ですがこれは邪道でしょうか?
また、みなさんはこの3つの要素をどの様にクラス化してますか?
ご意見お聞かせくださいませ。
0125名前は開発中のものです。04/04/29 04:54ID:ffNyJU4j
>>122
平和な奴だ。糞汚いコードを書いてばかりの低脳に
Java、C#、Dを試させてみたことがないんだろうな。

言語仕様上の規定(貞操)が厳格であるために
クルクルパーな悪性のハックは多少は減るが
やっぱりおかしなコードを書くんだよ。

馬鹿に付ける薬は無い。言語変えても駄目な奴は駄目。
0126名前は開発中のものです。04/04/29 05:01ID:dU1CdeTe
>>124
俺の場合、

class CCharacter : public CEntity

CRenderNode,CCollisionNodeはCCharacterのメンバ

理由は、描画リソース、コリジョンはいらないキャラのいるから。
例えば、ジェネレータとか。

とある理由で、CEntityをメンバにした事もある。
0127名前は開発中のものです。04/04/29 05:08ID:klVfh8nk
>>124
邪道・正道にはとやかく言及しないが
「〜Node」な2つの基底クラスの間で名前衝突が起きないってのが
ぶっちゃけあり得ない。背後にぐちゃぐちゃなメソッドの群れの気配がする。
0128名前は開発中のものです。04/04/29 08:15ID:0gA9laqu
>>124
肝心なのはその上位で、CCharacterのインスタンスの集合を管理しているクラスが
こいつをどういう風に扱うかにあると思う。
誰がどうやって生成して、どういうリストに組み込まれて、誰がメソッドを呼び出して、
誰がどうやって破棄している?
0129名前は開発中のものです。04/04/29 09:54ID:r5N/wC7K
>>124
俺はちょっと違うなCharacter以外はCharacterのメンバにする。
ちょっと>>124は機能とオブジェクトをいっしょにしてるのがよくなさげ。
継承で考慮するのはオブジェクト指向の説明でよく出てくる
犬と猫は哺乳類で・・・云々の話だけでいい。
もしEnemyなんてのが出てきたら、Characterから継承するって感じの使い方かな。

EntityやRender、Collisionなんてのは明らかに
Characterが所有しちょるものなのでメンバでいいと思う。
Characterより上の方のクラスに入れるかもしれないものもあるね。描画とか。

まあ、クラスのまとめ方が、複数のクラスの処理を一括してやろうと頑張りすぎてて、
かつ、これから継承するものの違いまでカバーしようとしている感じがする。正直うまくない。
まあ、処理で考えるなら、
衝突の検出なんてのは関わるもの同士によって必要な情報が全然違うから
一括処理なんて必要ないならしないほうがいいと思うよ。(仕様変更あると思うしw)
逆に描画なんてのはどれも同じ処理になるはずじゃね?
Characterもしくはその基底クラスがRenderなんて関数をもってればそれでいいような気がする。

AIクラスなんていったら、結構隔離できるクラスのような気がするが
実は他のクラスとの関連が一番多くなるクラス、また、他のクラスとの関連も一番特殊になるクラスだと思う。
何せAIの判断材料に他のクラスの情報が確実に必要になるからね。
AIってのはCharacterそのものになると思うんだけどどうだろうか?
例えばCharacterから範囲10以上に近づいたら、なんてやったらAIにCollisionのデータを使った衝突の検出が必要になるよね?
こういう処理自体をライブラリにするのはいいと思うけど、それに必要になる材料はもろにクラス同士の設計の関連になるわけで略w
013012404/04/29 13:08ID:tELycjco
>>126
CCollisionNodeをメンバにするのは考えましたが、
CRenderNodeをメンバにしてしまうと自身で描画コードを持てないので
描画情報を登録して後で一括描画してもらうって形ですよね。
この場合ちょっと複雑な事をやりたい場合にCRenderNodeに手を加えるハメになりそうですがどうでしょうか?
2Dなら描画形態は限られてくるのでメンバに持ってしまうかもしれませんが。
013112404/04/29 13:09ID:tELycjco
>>127
〜Node系は特定の機能を保有する事を保証するインターフェイスのような物なので今のところ名前の衝突はないですが、
拡張した場合に仰るとおりのぐちゃぐちゃなメソッドの群れになる可能性は大いにありますね。
013212404/04/29 13:09ID:tELycjco
>>128
生成は各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);

なんだか鬱設計ですね。
013312404/04/29 13:09ID:tELycjco
>>129
>>ちょっと>>124は機能とオブジェクトをいっしょにしてるのがよくなさげ。
>>EntityやRender、Collisionなんてのは明らかに
>>Characterが所有しちょるものなのでメンバでいいと思う
コリジョンや描画をメンバにするのはある程度納得出来るのですが、
自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
状態のみを委譲してそれを受けて自身の行動に変化をつけるのでしょうか?
たぶん違うぽ(つд`)

ゲーム内に登場するオブジェクトの殆どはCCharacter派生クラスだと思うんです。
確かに画面には表示されないステージ管理クラスや当たり判定を行わないスコア表示部分などはありますが、
それらは本当に限られてくるんじゃないでしょうか。
共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
より汎用性があるかなーと思った訳です。
0134名前は開発中のものです。04/04/29 15:51ID:r5N/wC7K
>>132
管理クラスって作った奴が思うほど役に立たないことが多いから
もうちょっと設計考えて見た方がよくね?

>>133
>自身の行動をメンバに委譲するってのはちょっとイメージが沸きません。
どう組んでるのか詳細までは知らないけど、
結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
ならそういう使い方でいいじゃない?

>共通のインターフェイスやリソースを含んだCCharacterを定義して全てのキャラクタをそこから派生させた方が、
>より汎用性があるかなーと思った訳です。
それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
別にこう↓組んでも組めるっちゃあ組めると思うよ。
class CCharacter : public CEntity, public CRenderNode, public CCollisionNode {};
ただわかりづれぇって一点を除けばw
0135名前は開発中のものです。04/04/29 18:18ID:0gA9laqu
>>132
とりあえずそのノリなら漏れはついていけるから安心していいよ
邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
状態は改良できるとこだと思う
0136名前は開発中のものです。04/04/29 18:20ID:K2EIDtC0
おまえらそんな議論は学校いってるうちにすませとけや
0137名前は開発中のものです。04/04/29 20:30ID:klVfh8nk
>ゲームプログラミング相談室【Part6】
              ~~~~~~~~
問題は何もない。続けて良い。
0138名前は開発中のものです。04/04/29 21:45ID:0gA9laqu
邪道かどうかは別として、衝突判定が特別扱いされているのが気になる
なんでentity間のやりとりの一種として扱わないの?
0139名前は開発中のものです。04/04/30 02:06ID:zWQ1T1uk
>>130
スマン。やはり、CRenderNodeがどういったものか、理解せずに
答えたので、見当違いだったかも。

CRenderNodeは描画機能?をもっていて、描画する対象のインスタンスではない。
て事かな?
因みに俺はインスタンスを含むと思っていたので、あくまでも、メンバ(参照用のポインタ)という扱い。
(キャラと描画物が1対1ではないという事)

とあるミドルウェアでは、大概のクラスが、シーングラフノードの派生。という構造もあったし、
そういうのも面白いとは思うよ。
0140名前は開発中のものです。04/04/30 02:41ID:TdoOcGaP
これっ
014112404/04/30 04:19ID:r3mzBY0g
>>134
>>管理クラスって作った奴が思うほど役に立たないことが多いから
全AI更新→全衝突判定→全描画
こんな感じにUpdate()やRender()ってのは一括して呼ばれるのが普通だと私は思ってます。
誰かが管理して順番に呼び出した方がスッキリしているような気がしますがどうでしょうか?

管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
それともリストをグローバルで持ってメインループか何処かで呼び出す?
誰かに管理させた方が不用意にノードにアクセスされないだろうしこれが普通かなーと
思ってたんですが一般的ではないんですかね。

>>結局、プロペラ付けたら空を飛んで欲しくて、車輪付けたら道を走ってほしいんでしょ?
この部分の話の流れとしてはCEntityから派生せずに
メンバとしてCEntityを持ったほうがいいよって解釈でよろしいでしょうか?
実際に移動を行う処理やアニメーションを行う処理なんかはAIと分離すべきだと思うのですが、
AIの部分をメンバに委譲して且つ自分ではUpdate()を持たないとなると
自分自身は何も行動を起こせないただの入れ物になりますよね?
うーん。

>>それはいいんだけど、継承を継承らしく使おうよって話なんだけど。
それが引っかかってたので質問した訳です。そしたらその他の部分でボロが出まくる出まくる(;´Д`)
CRenderNodeやCCollisionNodeをメンバに持つってのはいいんですが
CEntityをメンバに持つメリットというか意味が理解できないのです。
014212404/04/30 04:33ID:r3mzBY0g
>>135
>>邪道かどうかは別として、管理される側が自分を管理する側を知っているっていう
>>状態は改良できるとこだと思う
でもリスト構造とかってそういう物ではないんですか?
ああ、ノード自身が管理クラスに登録するってのがマズイ訳ですね。
その点CEntity以外をメンバとして持った場合は
renderer.Add(this);
はアリですよね。
014312404/04/30 04:35ID:r3mzBY0g
>>135
>>邪道かどうかは別として、衝突判定が特別扱いされているのが気になる
自分の中では一括処理ってのが根底にあったので特別扱いになってます。
全ゲームオブジェクトの行動が終わってから衝突判定を一括で行うのでどうしても
管理クラスに自分を登録して後で判定を実行する必要があったんです。
Update()の中で衝突処理も行うとすればAI処理の一部として実装できますし、
自由度は増すと思いますがこれはゲームの規模や構造にもよりますよね。
014412404/04/30 04:38ID:r3mzBY0g
>>139
すみません、説明不足だったようですね。描画対象ではないです。
CRenderNodeはインターフェイスです。基本的にvirtual void Render() = 0;が定義してあるだけで、
レンダラがこれを任意のタイミングで呼び出します。
派生クラスはRender()を実装して1つもしくは複数のモデルをデバイスに対して描画してます。
0145名前は開発中のものです。04/04/30 05:47ID:iUVDJkHq
>>141
>管理クラスがない場合って生成されたEntityのUpdate()はどうやって呼ばれるのだろう。
>各Entityを木構造のノードにして子or兄弟のUpdate()を連鎖的に呼び出すのか、
ん?処理の順番って基本的にこうやらないとまずくないか?
だって、親子関係では親から処理を実行していくようにしないと矛盾がおきないか?
子がワールド座標を欲しがるとき、親がすでに正しい位置に動いてくれていないと
子のワールド座標はバグるはずだけどどうよ?

>CEntityをメンバに持つメリットというか意味が理解できないのです。
俺はEntityクラスはキャラクタの行動を制御するものだと思ってたんだけど
実はただのAIクラスなの?
014613504/04/30 12:37ID:LSXN/0+O
>>142
管理される側が管理者のインスタンスを握っていて、
自分の登録と削除だけしかさせてもらえないならいいけど、
そうなってはいないでしょう?管理者を管理するクラスのために用意してある
メソッドにも自由にアクセスできるようになってしまっているはず。
インスタンスが無駄にグローバルになってるとか、
privateになっているべきメンバがpublicだったりするような程度でマズイです。
ヘッダのインクルードもクロスしてるでしょう。
そういうのはできるだけなくしていったほうがいいと思うよ。

>>143
シューティングゲームをつくってるのかな?
この衝突判定は「何に」当ったたのかみたいなことは分からなくてもいいの?
引数で衝突相手をもらうとしても、 Collide(const CollisionNode&) にならざるをえないし
これでは大抵は困ると思うけども
014712404/04/30 19:52ID:r3mzBY0g
>>145
管理クラス内にリストを持って実行順位毎に実行させるのと(現状はこれ)、
木構造にしてルートのUpdate()を呼んでやるのってのは実質的に同じだけど
木構造の方が何かと便利だよって事でしょうか。
何にせよルートノードは全ての子から見えるわけですよね?
インスタンスを晒さずに特別なアクセス関数を作るにしても
結局管理クラスと同じような存在になっていまうと思うんですがどうでしょうか?

>>実はただのAIクラスなの?
Entityは毎フレームUpdate()が呼ばれ続けるただのAIクラスって認識なので
EnemyはCEntityから派生させている訳です。
状態遷移や座標の更新、子entityの生成などをUpdate()内で行ってます。
014812404/04/30 19:59ID:r3mzBY0g
>>146
管理される側がインスタンスを握っているってイメージでは無いんですが、
管理クラスはシングルトンになっててほぼ全てのゲームクラスから見えてます。
単にリストのノードってのであればノードがリストのインスタンスを
知っている必要はまったく無いですが、
個が主体となるEntityでは知らないと何も出来ないですよね?
隠蔽さえ出来ればいいのであれば管理者のインスタンスを隠蔽して登録、削除は専用の
グローバルな関数経由で行うってのでも現状よりはマシなのでしょうか。

はい、シューティングです。
現状ではまさに Collide(const CollisionNode&) これですね。
CollisionNodeに相手のポインタを仕込ませているので
そのポインタ経由で相手の情報を得てますがやっぱりマズイでしょうか?
0149名前は開発中のものです。04/04/30 22:20ID:iUVDJkHq
>>147
>管理クラス内にリストを持って実行順位毎に実行させるのと
この管理クラスって結局Updateを毎回読んでやるただそれだけのクラスなんだよね。
はっきりいっていらないんじゃないかなぁ。ってこと。
正直、完全自己完結処理な物体ぐらいしか恩恵が全くといっていいほどないじゃん。
一度管理クラスを捨てて1から考え直してみたらどうかな?

>Entityは毎フレームUpdate()が呼ばれ続けるただのAIクラスって認識なので
Entityクラスを継承してCharacterクラスができてるのはなんか
オブジェクト指向的にわかりにくくないか?(C++の機能としてできるって意味とは別にして)
基本に戻って犬と猫は哺乳類でってところから考えると、
キャラクタはAI(脳みそ)でってなってちょっと変だ。
キャラクタは脳みそをもっていてって考えた方が綺麗に組めるんじゃないかな?

>>148
>管理クラスはシングルトンになっててほぼ全てのゲームクラスから見えてます。
こりゃグローバル変数と何も変わらないよ。
これが駄目だとわからないとなると、ちょっと修行が必要。
ちょっと面倒だけど、引数から渡すように改善できないかな?
0150名前は開発中のものです。04/04/30 23:35ID:h3JIWfFc
前にも引数わたしの話がでてたけど、実際やってみるとかなりしんどかったぞ

例えば、引数を渡した関数から、他の関数を呼ぶときは同様に引数を渡さねばならない。
その関数から他の関数を呼ぶときも(以下略)
リファクタリングする度に、引数付き関数が増えていく。

さらに、引数がいらない関数から、引数がいる関数を呼ぶ必要がある時は、
呼び出し元を辿って全てを引数付き関数に変更せねばならない羽目に。
結局気づいてみると、ほとんどの関数が引数つきに。

一本の大きな関数で書ききるなら行けるが、
そうでない場合は、地獄を見ることに……


実際、引数わたしで上手く行っている人の話が聞きたい。
0151名前は開発中のものです。04/04/30 23:46ID:FlQn5mKE
>>150
>例えば、引数を渡した関数から、他の関数を呼ぶときは同様に引数を渡さねばならない。
>その関数から他の関数を呼ぶときも(以下略)
>リファクタリングする度に、引数付き関数が増えていく。

漏れもハマったことあるな(w
0152名前は開発中のものです。04/05/01 00:08ID:AwZfI0KO
まぁ、この辺はバランス感覚というか取捨選択になるでしょ。
何でもかんでもメッセージパッシングでやればパフォーマンス落ちるのと同じで。
 
膨大な数のインスタンスを高速処理せねばならないエンジン部に近いなら
美しさに伴う冗長性を嫌って汚いハックに走らざるを得ないし。
0153名前は開発中のものです。04/05/01 00:11ID:AwZfI0KO
s/美しさ/OO的美しさ/
0154名前は開発中のものです。04/05/01 00:20ID:Jz0Md+j7
>>150
構造体で渡していくらか防げるかも。
でも、俺は引数増えても気にしないほうだなぁ。
DirectXがああだからしょうがないって言えばそうなんじゃない?
0155名前は開発中のものです。04/05/01 04:02ID:HtCFg7B3
>>150
綺麗か汚いかじゃなくて、何を言いたいのかを考えてインターフェイスの仕様は決めるべき。
まして2chの名無しがうるさく言っていたからなんて理由では(ry

その参照の元が、そのインスタンスの一生のうちに変わる可能性があるということを示唆
するために、毎回参照を渡すようにしなさい。

その参照の元が、そのインスタンスの一生のうちに変わる可能性がないということを示唆
するために、コンストラクタで受け取り自分のメンバに格納しておくようにしなさい。

どちらが美しいとかどちらが汚いとかではない。
0156名前は開発中のものです。04/05/01 04:56ID:HtCFg7B3
>>148
>個が主体となるEntityでは知らないと何も出来ないですよね?
管理者のインスタンスで何をしたい?他entityの検索とかかな。

>現状よりはマシなのでしょうか
インスタンスを生成した人がその人の好きな場所に登録できるのがいちばんよいよ。本当はね。

>CollisionNodeに相手のポインタ
どういうクラスへのポインタ?
015712404/05/01 06:39ID:bkNOTeqK
>>149
そうですね。実際にコード化してみて比較しながら考えてみます。

>>キャラクタは脳みそをもっていてって考えた方が綺麗に組めるんじゃないかな?
理想はそうかもしれませんが実際キャラクタが自分の手足に命令を出したほうが
コード的に自然な作りになりませんか?
頭脳をメンバとして持った場合、親(キャラクタクラス)経由で手足クラスに命令を出す
となると複雑になりませんかね。

>こりゃグローバル変数と何も変わらないよ。
変わらないですね。
生成&破棄が頻繁に行われるオブジェクトや状態が変化するものに関しては隠蔽すべき
だと思うんですがシステムで唯一無二の存在であろう管理クラスくらいはグローバルでも
いいと思うんですがどうでしょうか?
管理クラス的なものはそんなにポコポコ作らないでしょうし。
015812404/05/01 06:42ID:bkNOTeqK
>>150
実際それをやって幸せになりました?
015913904/05/01 06:50ID:9Tu48i71
>>144
ああ、そんな気はしてたが、
virtual void Render() = 0;が定義してあるだけ。か。
俺ならCGameObjectてなクラス作って、メゾットにしちゃうか。
Update()も同様に。

CRenderNodeという名前は、紛らわしいね。tree構造を連想させられる。

管理クラスは、俺も用意してる。
シングルトンで、ファクトリパターンクラスの派生。

作ってるものも同じ。シューティング。
AIは用意してないけど、その辺りを用意すれば、アクションゲームもOK。
ただ、AIをハードコーディングしようとは思わないが。
ありものを作るなら、大抵、コリジョン判定、条件判定の組み合わせが違うだけだから。
016012404/05/01 06:58ID:bkNOTeqK
>>156
>>管理者のインスタンスで何をしたい?他entityの検索とかかな。
そうですね。
Entity間のやり取りでも管理者をかませた方が不正アクセスをチェック出来たり
デバッグ用のアクセスログ吐かせたり延滞メッセージ的な通知とかも出来そうだし。
仲介役が居ることのメリットはあるんじゃないかと思います。

>>どういうクラスへのポインタ?
ここで言うところのCCharacterですかね。
この部分は正直変な事になってると思います・・・。
016112404/05/01 07:22ID:bkNOTeqK
>>159
CGameObjectを管理するクラスがあってそのクラスがレンダラを持ってるんでしょうか?
例えば管理クラスが全ゲームオブジェクトのUpdate()を呼んでからレンダラの参照なんかを
Render()に渡してあげるとか。

AIはハードコーディングしてしまうかも。
部分的に再利用可能な形にする事もできるしちょっとした色付けは外部ファイルから
入力してあげれそれで十分かなーと。
016213904/05/01 07:48ID:9Tu48i71
>>161
実際、今作ってるものには、CGameObjectというクラスはないんだけど、、。

CGameObjectもしくは、CGameObjectManagerが、必要なタイミングで
(生成時、初期化時、視界内に入ってきたとき等々)
に、描画エンジンのmanagerを使って、描画オブジェクトを生成。と。

で、擬似コード
app::Update(frame)
{
描画manager->Update( frame );
GameObjectManager->Update( frame );
}
と。
描画機能と、ゲーム(CPU)的な機能は分離してます。
016313904/05/01 07:53ID:9Tu48i71
言葉足らずだったかな?
要するに、CGameObjectは、レンダラ機能はもたず、
レンダラがもつ描画ノードの参照を持ってるだけ。
update()時も、描画用のセットアップをしているだけ。
0164名前は開発中のものです。04/05/01 08:16ID:Jz0Md+j7
>>157
>頭脳をメンバとして持った場合、親(キャラクタクラス)経由で手足クラスに命令を出す
>となると複雑になりませんかね。
どうして?変わらないと思うけど。
手足クラスが何やるか知らないけど、頭脳と手足が認識できる構造なら
どういう処理にしろクラスにしちゃった方がわかりやすいじゃん。

>システムで唯一無二の存在であろう管理クラスくらいはグローバルでも
>いいと思うんですがどうでしょうか?
駄目だよ。グローバル変数が駄目な理由も理解してないな。
システムで唯一無二のものを直接コードに入れちゃうってことは
そのクラスはそこでもう身動きがとれなくなっちゃうってことだよ。
どこでもどんなタイミングでもアクセスできちゃうし、
一番怖いバグが出るパターンだよ。
0165名前は開発中のものです。04/05/01 10:28ID:W4jVRbBS
>>158
なりませんでした
概念だけは美しいが、コードは美しくなく汚くなっただけ
なんだかC言語で、OOやったときのような気分
0166名前は開発中のものです。04/05/01 11:23ID:Jz0Md+j7
>>165
なんでそう見た目だけにかき回されるのか激しく疑問。
いくらコードが美しくたって概念が糞なら糞。
>>155のいう通りだろ。
0167名前は開発中のものです。04/05/01 11:31ID:W4jVRbBS
むしろ、実装してみると、概念の方があなたの言う「見た目」に見えてくる
>>150みたになるのを防ぐ方法が挙げられなければ、
スパゲッティなコードになることを回避できない。
0168名前は開発中のものです。04/05/01 11:33ID:W4jVRbBS
>むしろ、実装してみると、概念の方があなたの言う「見た目」に見えてくる
わかりにくいな

むしろ、実装してみると、概念にかき回される、と言いたい
0169名前は開発中のものです。04/05/01 11:42ID:Jz0Md+j7
>>167
じゃあ構造体でわたせば?(これで解決するよね?)
0170名前は開発中のものです。04/05/01 11:53ID:HtCFg7B3
>>160
>仲介役が居ることのメリットはあるんじゃないかと
なにもできないわけじゃないなら、管理される側からは管理している側が見えないように
しておいたほうがよい。管理する側の何かを変更をしたい時に、
管理される側にはその変更によって何も影響がないということを確信をもって取り組むことができる。
そのメリットの方が仲介役と管理者がいっしょにいることより大きいと思うよ。

もしも仲介役が必要ということなら仲介役クラス、というかインターフェイスをつくって
entity生成時に持たせてあげるようにしたらいい。

>>164
>グローバル変数が駄目な理由も理解してないな。
グローバル変数は、そのクラスが変更されたとき、膨大なコードの全体に対して
影響が及んだかどうかチェックして問題がないことを確信がもてる精神力が
あるのなら使える。ぼくは精神力に自信がないのでシングルdをさらすことはせず
必要とされる単純な処理だけをstaticメソッドとして公開してるyo
0171名前は開発中のものです。04/05/01 12:28ID:HtCFg7B3
まぁ最初はリソースやコンテクストをいちいち引数渡しする形でデザインしておいたほうがいいんじゃないか
そのクラスのそれ以外のメソッドがリソースやコンテクストなしでも動けるなら、そのほうが。
んでクラスの全部のメソッドがそのリソースやコンテクストなしでは動けないということが判明したら
コンストラクタでもらうようにしては。
017213904/05/01 12:31ID:9Tu48i71
>>167
俺の場合、「やばい!」と感じたらw
とりあえず、クラスにして渡す。

作業してて「これやばいな」と感じたら、そのまま突き進まず、
別の回避策を考える事にしてる。絶対可笑しな部分があるから。
017315204/05/01 13:27ID:AwZfI0KO
>>166
というか155は抽象的極論なので一体何が言うとおりなのか理解不能です。
この際言葉遊びは捨てて(というか面倒くさいので)美しさ=概念的合理性と
解釈てしまいますが・・・・確認なんですが
こういうものを追求することは当然なのでありますが、これらが常に計算機側の
特性とマッチするわけでない、ということはお互いの共通理解として宜しいですよね。

ゲームの場合、わりと頻繁に この部分が絡むので論争に発展するのだと思います。
現実(ハード特性)との不整合を冷酷に示すパフォーマンスアナライザを恨めという
以外ありません。
017415204/05/01 13:35ID:AwZfI0KO
まぁ、ただ今読み返すと、ここで議論にあがってるのは
純粋に設計上の不備の部分の話なのかなぁ、とも思うので
173の内容は無粋だな。却下。
0175名前は開発中のものです。04/05/01 13:44ID:Y5IhbaZz
ロジックとハード特性の不整合というより、ロジックと言語仕様の不整合、かな。
017615204/05/01 13:48ID:AwZfI0KO
>>175
そんな感じですな。美しさ=記述上の美しさ、という意味合いなら
やっぱ173は筋違いやね。
0177名前は開発中のものです。04/05/01 14:04ID:4cYeRpR0
いや、俺は>>173の言ってることは当然のことなので悪いとは思わない。
ゲームにもよるが、ノードの数が物凄く多くなればキャッシュヒット
やら何やらの問題がボロボロと表出することがあるので、途中で
精度犠牲にして走査回数抑制する方向でロジックを修正することあるし。
最悪、内部データ構造から洗いなおすハメになることもあるし。


0178名前は開発中のものです。04/05/01 14:15ID:T8UuVfk+
純粋にパフォーマンス上の話だと
手荷物にするか置き勉にするか、状況によっては相当違ってくるよね。
0179名前は開発中のものです。04/05/01 14:29ID:Jz0Md+j7
>>173
>美しさ=概念的合理性
え?じゃあ、なんで俺にレスつけんの?
俺は
>>165
>概念だけは美しいが、コードは美しくなく汚くなっただけ
っていう言葉に対してレスつけたんだけど。
引数で渡すことに関しては賛成ってことでいいんでしょ?
018017304/05/01 14:50ID:AwZfI0KO
概念=抽象モデルという話なら、>>173
抽象モデルが糞なら(結果としてそれは)糞という発想は極端だなぁ
という、やや無粋な話。

抽象モデルとして説得力のある・人の直感的に分かりやすい代物であっても
それが常にハードウェア特性との親和性を伴うわけではないならば
何が糞で何が糞でないのか、は一概には決め付けられないだろう、という話。

これは詭弁ガイドラインに抵触している気がするので、>>174で取り下げた。
0181名前は開発中のものです。04/05/02 00:05ID:GnjcB1ex
スクロール処理に関して知恵をかしておくんなさい

1.2DのアクションRPGをつくっています
2.プレイできる範囲全体を100*100セルとして定義、後ろ(どっか)にもってます
3.プレイヤーの見える範囲を10*10として定義、現在の座標位置より、2.でもってる内容から上下左右に1セル分多く取得してきます。
4.3.で1セル分多く取得してきているぶんをつかってプレイヤーが移動したときに、すこしずつずらしていきます
5.実際の画面への表示は、3.の内容にマスクして、10セル分だけ表示し、スクロールにみせかけています

最初は2Dのスクロール処理のみを考えていたんで、この方法で、スクロール処理ができるようになってよかったんです。
が、他のプレイヤーや、キャラを追加して、そいつらの動きが入ると意味不明になってしまいました。

たとえば、プレイヤーが(x,y)=(10,10)の座標にいて、他のプレイヤーが(x,y)=(12,12)の座標にいて、
プレイヤーが(x,y)=(10,11)に移動、他のプレイヤーが(x,y)=(12,11)に移動すると
先の上で説明したような状況になったときに、どう他のプレイヤーを描画したらいいのか悩んでます

考えているつもりですが、意味不明になって悩んでしまいます

全体的な処理としては、メインのループがあって、そこで、くるくるまわして描画処理をしています。

キーボードのイベントや、マウスイベントや、ネットワークからのイベントは、別のスレッドでキューにいれて、
上のメインを回しているスレッドから読んで描画に関する処理に影響させています。

長くなってしまった上に、意味不明なことを書いているようなきがするんですが、
よかったら知恵を貸してください。
0182名前は開発中のものです。04/05/02 07:16ID:ewEdZS/b
>>166みたいな、単なる貶し系の文章が書きたいだけのやつが一人いるんだよね。
それが気に入らないから俺しばらく常駐してみてるんだが。
0183名前は開発中のものです。04/05/02 11:23ID:8zjGYCSW
>>181
>そいつらの動きが入ると意味不明になってしまいました。
どう上手くいかないのかわからないんだが、
とりあえず、スクロール処理の部分って
プレイヤーの現在位置から見える範囲を決めてるわけだから
他のプレイヤーってこの処理に関係ないんじゃないの?

>>182
>>182の内容が貶し系なわけだがw
0184名前は開発中のものです。04/05/02 14:39ID:YvKUw6Rv
>>181
 文章が長い割に、必要な情報が欠落している。
他のプレイヤーやキャラとはなんなのか、説明をちゃんとしろ。
018518104/05/02 15:03ID:GnjcB1ex
>>183
>>184

もうちょっとまとめてみました

プレイヤーと動かない対象(床と動いてないキャラなど)
にかんするスクロールは問題ないです

自分がスクロールしている最中に、
画面内に動く対象がいると、スクロールがうまくいかず、
飛んだみたいに見えるわけです
自分が(10,10)→(10,11)に移動し、
動く対象が(12,12)→(12,11)に移動したら、
2セルぐらい飛んだように見えるんです

また、自分が止まっている時に
画面内に動く対象がいても問題なく動いています

結果:
自分がスクロールしているときに
画面内の動く対象の描画位置を計算するルーチンがおかしい、
または、そんなルーチンが動いていないから、
飛んだように見える

あぁ、なんか解決したような兆しが見える・・・
0186名前は開発中の者です。04/05/02 16:53ID:VrUs0Xi6
背景に張り付いてるキャラクターが、主人公と逆に動いた場合、
倍の速度で離れていくのは、普通のことなのではないでしょうか。
ドラクエやイースもそうなってるはずですよ。

(あまり関係有りませんが)
セルという言葉を使ってるようですが、RPGツクールでいうところの
「チップ」のことでしょうか。小さい四角のことをセルというのは
PCエンジンぽいですね。でべろかなんかいじっていた人なのでしょうか。
0187名前は開発中のものです。04/05/02 17:07ID:BsWZXbD2
>>185
「飛んだように見える」と言われても
0188練習帳著者04/05/02 17:21ID:Bla7cnMs
>>185

スクロール時のキャラクタ描画を「現在のスクロール量(ずらして
描画しているピクセル数)を減じた座標」に対して行うようにすれ
ばよいのでは? わかりにくければ、方眼紙に表示領域とスクロー
ル領域を描いてみて、1ピクセルずつスクロールさせるとどうなるか、
なぞってみてください。
018918104/05/02 17:30ID:GnjcB1ex
>>186
おっしゃるとおりですね。
倍速ではなれていくことを表現したいと思っています。
現状ではキャラがスクロールするというより、
飛んでるというかんじで、なんでかデバッグ中です

セルという言葉は、距離を表現するつもりでつかっています。
プログラム中では1セル中にはりつけるタイルを
チップという名前をつけています
ゲームプログラムは今回が初めてで、
詳しいこともわからず独善的に作っています
だから言葉も適当です
適切でなければ、以後、脳内で置換します
019018104/05/02 17:35ID:GnjcB1ex
>>187
そうですよね・・・。
適切な表現ができていないですよね。

>>188
すばらしいアイデアですね。
早速方眼紙にかいて試してみました。
なんか、自分のルーチンの間違いが見えてきた気がします。
サンクスです。

こーやって書いて実際に試してみるのがとても大切ですね
019118104/05/02 17:55ID:GnjcB1ex
自分の間違いがわかりました。

スクロール処理に問題があり、
>>188さんのアイデアで解決しました。
ありがとうございました。

次は、デバッグ中にわかった問題を解決していこうと思います。
自分が(10,10)にいて、動く対象が(12,12)にいて、一旦描画したとします。
その後、次の描画処理までに動く対象が(12,11)、(12,10)と移動した場合、
2セル動いているので、スクロール処理が想定している
ルーチン中で判断できず、飛んだようにみえていました。
自分の処理の中では必ず1セルしか動かないようになっていました。

これは現在作成しているプログラムで、ステップ実行などをしている際に、
動く対象が1セルずつ移動しているが、
実は2回移動して2セル動いてしまっている際に起こっているようです。

今はステップ実行などを行わない限り、こういった状況にはならないわけですが、
いずれさまざまな問題で発生する可能性があります。

で、解決案として以下を考えています。
@放置、トンでもいいじゃないか
A軌跡を事後に計算して描画処理をさせる

@でいこうと思っていますが、みなさんならどうされますか?
0192名前は開発中のものです。04/05/02 18:01ID:tlpacHil
微分する
019318104/05/02 18:07ID:GnjcB1ex
微分して、軌跡に近いセルに描画ですか
いいアイデアですね
0194名前は開発中のものです。04/05/02 23:24ID:imw4lXsM
>>181
処理構造に問題があるんじゃないの?

移動は、そのセルとやらが何ピクセルの大きさか知らないが段階を踏んでるんだろうね?
つまり、32ピクセル x 32ピクセルの大きさなら
移動は、瞬間移動?
それとも8ピクセル程度づつスライドして滑らかに描画してる?
背景のスクロールもしかり、セル単位で瞬間移動描画してる?

というか、スクリーン描画座標と
背景セル上での座標がつじつま合ってれば、そんな問題は出ないでしょ?
どっかに構造的、発想的な問題があるんでしょ。
■ このスレッドは過去ログ倉庫に格納されています