- 1 名前:名前は開発中のものです。 [2008/05/23(金) 21:10:59 ID:8M1gqhPX]
- 具体的なゲーム名を挙げて、
どのようにクラス設計をすればよいか、 継承・委譲関係はどのようにすればよいか、 使えそうなパターンは何かなど語るのもよし。 自作ゲームの内容とクラス図を書いて 改善案を聞くもよし。 設計に関して困ったことを質問するもよし。 関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。 大いに語れ。 前スレ pc11.2ch.net/test/read.cgi/gamedev/1155209226/ テンプレ追加事項あったらよろすく
- 394 名前:名前は開発中のものです。 mailto:sage [2008/12/02(火) 23:03:37 ID:QPPOGJkH]
- >>393
気持ちが悪かったから、結局色々こねくり回して何とか別の方法で実装しました。 DirectInputのBufferedは偉大ですね、と。
- 395 名前:名前は開発中のものです。 mailto:sage [2008/12/03(水) 00:00:25 ID:QPPOGJkH]
- ついでにスレを読み返してメモメモ、と思った情報をまとめてみた。
コルーチン、マイクロスレッド、ファイバ >>145,>>146,>>162,>>164 楽だが応用性のないありがちな実装 >>159,>>160 分業とデバッグ >>194-213 ADVの画面クリックとか >>270,>>271 メニュー画面の管理とかシーン管理とか >>59-71,>>207,>>273-276>>302,>>305-314・・・VMCはたぶんMCVのことだよね? 状態管理とか >>318-325 priateとgetter、setter >>277-301 設計Tips >>352-357,>>358-367,>>382-384
- 396 名前:名前は開発中のものです。 mailto:sage [2008/12/13(土) 14:29:53 ID:lcU0tpK0]
- ゲーム開発論を語るスレを立てようと思っていたんですが、すでに似たようなスレがあると聞いて相談にきました。
このスレがあるので必要ないのでは?という意見があり、新スレを立てるべきかどうか迷っています。 ご意見頂けないでしょうか? ↓ゲーム開発論スレ要望の経緯 pc11.2ch.net/test/read.cgi/gamedev/1206381315/ KONAMI、スクエニ、セガ、バンナム、コーエーの大手5社がゲーム開発現場の未来を再び討議 「5年後のゲーム開発現場を考える〜ゲーム会社技術開発の現場から2〜」 game.watch.impress.co.jp/docs/20080916/cedec_dev.htm 「Gears of War」はいかにして生まれたのか。Cliff Bleszinski氏が語る,有効なゲーム開発プロセス www.4gamer.net/news/history/2007.03/20070309215934detail.html Agile型開発でのゲームデザイン www.4gamer.net/news/history/2007.03/20070311002313detail.html
- 397 名前:名前は開発中のものです。 [2008/12/14(日) 06:46:04 ID:foB3PhGt]
- >>396
ここは実装について話すスレなので、開発論は全くのお門違い。 とっとと失せろ!!
- 398 名前:名前は開発中のものです。 mailto:sage [2008/12/14(日) 06:47:43 ID:3zIx1sHY]
- 想定通りでワロタ
- 399 名前:名前は開発中のものです。 mailto:sage [2008/12/15(月) 01:28:13 ID:AODSdSoN]
- >>395
ありがとう助かるよ
- 400 名前:名前は開発中のものです。 [2008/12/18(木) 23:54:28 ID:QLMqRIYY]
- キャラクタのデータはテキストファイルにゆだねて動的にできるけど
ふるまいはどうすればいいんだろう。 基本ふるまいをプログラムに実装して(静的)、テキストファイルで その呼び出しを記述する(動的)とかなのかな。他に思いつかん。
- 401 名前:名前は開発中のものです。 mailto:sage [2008/12/19(金) 12:11:03 ID:ygbWfkiR]
- 俺はそうしてる。
- 402 名前:名前は開発中のものです。 mailto:sage [2008/12/21(日) 09:35:05 ID:7nb+zy1b]
- つまりスクリプトですね。
- 403 名前:名前は開発中のものです。 mailto:sage [2008/12/25(木) 19:24:07 ID:QpPf00tD]
- 知ってるよDIって言うんだよね
- 404 名前:名前は開発中のものです。 mailto:sage [2008/12/26(金) 01:45:37 ID:NBeqwEQB]
- 最近でたセガのあれな本を読んで、自分がずっと詰まってたしょーもないことを勝手にメモ。
結論としては基本中の基本で、データと処理は独立させましょ、ってことなんだけど。 ゲーム中ができたけど、ポーズ機能を追加、ポーズメニュー表示関連をクラスで作って実装するには、という感じの想定。 こんな感じに管理してるとして(具体的にはもっと複雑だけど。) class StgScene { Mover movers[]; void Update() { //A for(・・・) { movers[i].Move(); } //他判定処理等 //B for(・・・) { movers[i].Draw(); } //C } } ・A〜Bまでの処理はポーズ時すっ飛ばす、となる。ので、関数化するなりクラス化したい。 ・対象性を考え、Menuクラスに対してA〜Cの処理をPlayingクラスにする。(つまりSTGSceneはデータのみ。) ・MenuクラスにもB〜Cの処理を書き、追加してMenu関連の処理も記述する。 こうすると、結果的にSTGシーンはデータしか持たなくなって、処理はPlayingクラスやMenuクラスに任せる形になる。 見通しが悪くならずに拡張できる。 今までずっと気づかなかった自分の頭の悪さに笑うしかないぜ。
- 405 名前:名前は開発中のものです。 mailto:sage [2008/12/26(金) 08:47:36 ID:Y8oI6MzT]
- 「勝手にメモ」を書き込んでくれる人(達?)の存在は、正直ありがたい
- 406 名前:名前は開発中のものです。 mailto:sage [2008/12/28(日) 17:34:36 ID:pzJs6/UU]
- MVCでいうと、
M:StgScene V,C:Menu,Playing ってことなのだろうか? Stateパターンという風にも捉えられる?
- 407 名前:名前は開発中のものです。 mailto:sage [2008/12/29(月) 00:45:07 ID:THn3O3Oz]
- Stateパターンだとこんなかんじかね?
struct StgScene { void A(); void B(); void C(); }; class State { virtual void Update(StgScene&) = 0; }; class Playing : public State { virtual void Update(StgScene& scene){ scene.A(); scene.B(); scene.C(); } }; class Menu : public State { virtual void Update(StgScene& scene){ scene.C(); } };
- 408 名前:名前は開発中のものです。 mailto:sage [2009/01/07(水) 23:21:00 ID:rBsXmGd8]
- なんか話題無いなー的なので、>>404の続きでも。今回もセガのあれを参考にしました。
自分もまだ試作中だけど、かなり自由かつ堅実に作れる。 StgSceneクラスの考えをもう少し推し進めると、全てのシーンの汎化クラスであるSceneクラスが作れそう。 # child // フィールド。子シーンの保持。 # childTypes // フィールド。runやUpdateの戻り値が自分の子かどうか識別するためのもの。 # run(Scene parent) // メソッド。child == null のとき、自分が実行すべきシーンと認識してrunする。戻り値に次の遷移先シーンかnull返す。 # focusing // イベント。シーン遷移で自分が次にrunする場合の初期化処理。Update内のシーン遷移処理に際し呼ばれることが目的なので、abstractメソッドでもいいです。 # unfocusing // イベント。シーン遷移で別のシーンに移動する際の後始末。上と同様。戻り値に次の遷移先シーンかnull返す。 +Update(Scene parent) // childがいればchildのUpdateを呼び出し、そうでなければrunする。その後、遷移先シーン(つまりUpdateやrunの戻り値)に応じた遷移処理を行う。 Updateの実装内容について 1、シーンは線形リストを形成し、末端シーンのrunを実行するように記述する。(rootScene → StgGame → StgPlayingや、rootScene → TitleScene → TitleHighScoreといったリスト構造になる。) 2、runのreturnに意味を決める。そしてそれによって処理が分岐するように記述する。null、自分、兄弟シーン、親以上。 ・nullは、runしたシーンに子が出来て、自分がフォーカスシーンで無いことを表す。 ・原則として、自分の子供と祖先の子供以外には直接遷移できないとする。する必要も考えられないので。 ・・・っとここまで書いて、ソースコードがないとどう考えても伝わらんだろと思った。
- 409 名前:名前は開発中のものです。 mailto:sage [2009/01/07(水) 23:25:20 ID:rBsXmGd8]
- しかもミスってる。
# unfocusing ・・・『戻り値に次の遷移先シーンかnull返す。』 ←× 正しくは、+Updateの行の後ろに『戻り値に次の遷移先シーンかnull返す。』と書くつもりでした。
- 410 名前:名前は開発中のものです。 mailto:sage [2009/01/09(金) 00:07:48 ID:vYDzTrO8]
- 自作の状態遷移クラスに似てるな。
・状態に親子関係がある。 ・戻り値の意味によって遷移先を決める。 ・自分の子、先祖の子以外は直接遷移できない。 ってあたり、ほぼ同じっぽい。 戻り値って具体的に何を返しているの? 自分の場合、STAGE_CLEARとかの定数を返している。 その値をみて、さらに親へ遷移(戻り値を返す)したり、子供へ遷移したりしてる。
- 411 名前:名前は開発中のものです。 mailto:sage [2009/01/09(金) 01:05:35 ID:2TNYOX7D]
- >>410
このソース、イベントといってるところでわかるように、C#です。Updateの戻り値はSceneインスタンスですね。 C#ではhoge.GetType()でインスタンスの型情報(Typeインスタンス)が取得できるもんで、それを定数代わりに利用します。 で、戻り値に対する処理はこんな感じ。 戻り値がnullなら、フォーカスシーンが孫以下であることを表します。 戻り値sceneのGetType()と、 ・ChildのTypeインスタンスと比較すれば遷移が不要かどうかわかります。(等しければ移動していない。) ・定数として保持させたType配列と比較すれば遷移先が子かどうかはわかります。 ・自分のTypeインスタンスと比較すれば遷移先が自分かどうかがわかります。自分ならば、focusingで初期化処理を呼び出します。 ・それ以外の場合、祖先および祖先の子のいずれかであることがわかります。いずれにしても上位のシーンに処理を仰ぎ、自分は破棄されます。 ってかんじでしょうかね。
- 412 名前:名前は開発中のものです。 mailto:sage [2009/01/09(金) 01:28:17 ID:vYDzTrO8]
- インスタンスそのものを返すのかぁ。
確かにそのほうが直接的ですっきりするかもね。
- 413 名前:名前は開発中のものです。 mailto:sage [2009/01/10(土) 23:29:07 ID:GXwf3cbn]
- インスタンスを生成するのは作成した瞬間にクラスが2つ分になってメモリが足りなくて死ぬ
危険があるから1個間にはさみたいな。 生成メソッドはstaticにするとかなんとか。
- 414 名前:名前は開発中のものです。 mailto:sage [2009/01/11(日) 00:09:06 ID:dWwzUAmX]
- まて、よく意味はわからんが今時のゲームやるようなWindows環境前提なら、最低でも500MB程度はメモリに余裕があるだろう。
どう考えても使いきれるとは思えん
- 415 名前:名前は開発中のものです。 mailto:sage [2009/01/11(日) 02:43:39 ID:cWr0moum]
- あれか? NSAppみたいなアプリケーションのインスタンスを丸ごとコピーするとかの話か?
- 416 名前:名前は開発中のものです。 mailto:sage [2009/01/12(月) 02:58:31 ID:8xCnbJpy]
- >>414
PCならそうかもしれないけど、コンシューマ機だと360でやっと512MB(ただしVRAM込み)、 DSにいたっては4MBしかないからね。
- 417 名前:名前は開発中のものです。 mailto:sage [2009/01/12(月) 03:30:42 ID:mDvqZ10E]
- シーン遷移時に元シーン内で新シーンのインスタンスを生成するのは、
そのコンストラクタへシーン用引数を指定できるのがメリットかな。 あと、シーンコンストラクタ/デストラクタとは別にシーン初期化/解放メソッドを定義しておいて、 シーンのコンストラクタは必要なシーン用引数のメンバへの保存だけを行うような形にすれば、 メモリが足りないということは殆どなくなると思うけどね。 それから、個人的な意見としては、 シーンが生成される際にはまだ生成元シーンのインスタンスへはアクセス可能でいたい。 このライフサイクルのほうが、現在の実行状態を認識し易くて、様々な仕様変更に柔軟に耐えうると思う。
- 418 名前:名前は開発中のものです。 mailto:sage [2009/01/12(月) 03:32:37 ID:mDvqZ10E]
- ごめん
×ライフサイクル ○ライフタイム
- 419 名前:名前は開発中のものです。 mailto:sage [2009/01/12(月) 11:14:49 ID:pb2pea9L]
- そのあたりの話は研究しがいがあるな。
- 420 名前:名前は開発中のものです。 mailto:sage [2009/01/12(月) 13:32:30 ID:YXD0YS+N]
- >>418
一応、常にnewするのは遷移元シーン、deleteするのは対象のシーンの親、ってことになってるけどこれじゃだめかな? クラス図の関連が木構造で、枝をはさみで切るイメージ。
- 421 名前:名前は開発中のものです。 mailto:sage [2009/01/12(月) 14:12:02 ID:sqS0O25/]
- シーンをまたぐデータは、そもそもシーンが管理すべきなのか
検討した方がいいかも。
- 422 名前:名前は開発中のものです。 mailto:sage [2009/01/13(火) 22:46:08 ID:BhFnEm7r]
- シーンを跨ぐデータはスマートポインタみたいなもんで管理するんだが
そのポインタを渡すのにシーン生成を先にしたいという感じかな。 オレは管理マネージャ作るけど。
- 423 名前:名前は開発中のものです。 mailto:sage [2009/01/13(火) 22:46:54 ID:BhFnEm7r]
- 管理マネージャじゃマネージャマネージャだなw
まあC++になって楽になったものよ。
- 424 名前:名前は開発中のものです。 mailto:sage [2009/01/14(水) 03:24:31 ID:0DnXfUAy]
- >>421
原則として、シーンをまたぐデータはないように設計する。…言い方が悪いな あるシーンで使われたデータは、その子シーンで使われることがあっても、祖先のシーンで使われることはないように設計する。 あるシーンが持つデータを子シーンが使いたかったら、 >>417が言ってくれているように、コンストラクタで自由に子シーンに渡してしまう。 まぁほとんどの場合はコンストラクタ時に親シーンをそのまま子シーンに渡す。(子シーンで使いたいデータはpublicにしておく)
- 425 名前:名前は開発中のものです。 mailto:sage [2009/01/14(水) 03:32:21 ID:0DnXfUAy]
- 親シーン子シーン関係なくデータを引き継ぐ場合として考えられるのは、例えばこんなときか。
ゲームを普通にプレイしてゲームオーバー表示(プレイ画面に追加表示)。その後ハイスコア画面に行くと考えると、 スコアの点数がまたぐデータになる。 RootScene>GameScene>GamePlaying から RootScene>GameScene>GamePlaying>GameOver となり、その後 RootScene>HighScoreScene に遷移する。 その際GameOverがHiScoreSceneを生成する際にコンストラクタでスコアデータを渡してやれば無問題。
- 426 名前:名前は開発中のものです。 mailto:sage [2009/01/17(土) 14:39:28 ID:AWtASysq]
- YAGNI
- 427 名前:名前は開発中のものです。 mailto:sage [2009/01/21(水) 22:53:35 ID:sHv/LIGj]
- スレが止まってるとさびしいな。
独り言でも言ってるか。 STGを作るときに、解決すべき内容は。 ・1/60秒や入力情報など、最も基本的なものの構築。 ・シーン遷移等、シーン管理の構築。 ここまでで共通の枠組みは作れる。シーン遷移はこのスレで紹介してたやり方でいくとして。 実際のゲーム中の解決すべき内容は ・自機、敵機などを1オブジェクトとするとして、オブジェクトの構造およびオブジェクト達の管理方法。 ・敵出現(=ステージ情報)の作成方法、および管理方法や、それにかかわること。(リプレイとか。) ・あるオブジェクトの変数に依存するオブジェクトの管理、依存方法。(耐久力表示、バリア、レーザーなど。) ・オブジェクト同士の衝突判定の記述。衝突判定まで。 ・誘導弾など、常に依存先がかわるオブジェクトの記述方法。 で一通りっぽい。この手順でオブジェクトのインタフェースや管理方法を徐々に改良すると考える。
- 428 名前:名前は開発中のものです。 mailto:sage [2009/01/21(水) 23:23:50 ID:sHv/LIGj]
- オブジェクトの構造とそれらの管理。
前提として、管理のことを踏まえスーパークラスで多態性する。 publicにしそうな変数は 位置、速度、耐久力(=生存判定) publicにしそうな関数は 更新、描画 いまいち不定だけどpublicで必要そうなものは、衝突判定にかかわるもの。 どこまでを1オブジェクトとするか。 ・部位破壊が出来るものなど、一方的に依存するオブジェクトは別オブジェクトとして扱う。状況によっては相互参照も許可、を想定。 (本質的にバリアや耐久力表示と同じ関係なので。)
- 429 名前:名前は開発中のものです。 mailto:sage [2009/01/22(木) 00:12:28 ID:P249I5A7]
- ステージ情報の管理。
これを管理するクラスを一つ作る。主なデータとしては 敵出現データ情報(背景出現情報)、ランダムシード、ステージ進行速度。ついでに入力情報の蓄積もここがやると見通しがいいかも。 基本的に言語そのままでは出現情報は記述しづらいので適当なスクリプトを自作する。 wait、enemy、background、musicがあれば十分。 ボス戦手前などに掛け合いをはさむなら、event命令もあるといい。 簡単に変更できるようにすることを考えると、命令を分岐、並列に記述できる文法があると便利。 (waitによる相対時間出現なので。現在の出現配置を維持しつつ追加したいときとか。) この方法は読んだ人は気づいてると思うけど、ある本を参考にしました。
- 430 名前:名前は開発中のものです。 mailto:sage [2009/01/22(木) 00:45:44 ID:P249I5A7]
- で、今は
あるオブジェクトの変数に依存するオブジェクトの管理、依存方法。(耐久力表示、バリア、レーザーなど。) ・依存オブジェクトの生成は、被依存が関わってくるのでそれの参照を取得する方法は深く考える必要はない。 ・完全な対応関係ならば、依存オブジェクトは被依存オブジェクトをその型で参照を保持する。 (スーパークラスで保持する必要性がない。被依存側の、依存側で必要なメンバはpublicにする。) ・逆に、誘導弾やエフェクトなどは被依存をスーパークラスで参照を保持する。 >>428で生存判定がインタフェースにいるので、ここら辺は融通が利く。
- 431 名前:名前は開発中のものです。 mailto:sage [2009/01/22(木) 00:57:55 ID:P249I5A7]
- オブジェクト同士の衝突判定の記述。衝突判定まで。
・複数の矩形で衝突判定を処理するオブジェクトがいることが想定される(ボスなど。) →バウンディングボックスも実装。 ・後々考えると、回転可能な矩形判定が後腐れない。 →バウンディングサークルにしといた方が、記述の割りに回転に対応できる。 衝突判定データを保持するクラスを作って、オブジェクトは衝突判定データのインスタンスをリスト構造(場合によっては木構造)で保持。がいい感じ。 オブジェクトを2つ受け取り、それの衝突判定を走査する、という処理を行う関数をつくればいい。 誘導弾などの実装、は思案中。いい感じが思いつかない。
- 432 名前:名前は開発中のものです。 mailto:sage [2009/01/22(木) 04:27:16 ID:lwlInfIx]
- >>427-431
とりあえず「管理」という言葉を使わないように考えることをおすすめする。 www.google.co.jp/search?q=SomethingManager
- 433 名前:名前は開発中のものです。 mailto:sage [2009/01/22(木) 04:40:32 ID:P249I5A7]
- >>432
サンクス。こんな考え方があったのか 言われてみれば、作り始めたての頃は○○Managerや○○Dataはかなりいた気がする。 今は1個だけしかいないところを見ると(UpdateManager)、自然とどうやら身についてはいるっぽい。
- 434 名前:名前は開発中のものです。 mailto:sage [2009/01/22(木) 15:25:00 ID:x7I7tNfu]
- 大抵のクラスは、何か管理してるか、何かのデータを持ってる気がする。
- 435 名前:名前は開発中のものです。 mailto:sage [2009/01/29(木) 21:46:47 ID:dRfTqeNw]
- そうだけど、それとクラスの名前が〜管理、〜データになることはイコールじゃないよねって話でしょ
管理とは何をすることなのか、そのデータは何を表わしているのかが名前で分かった方がいい
- 436 名前:名前は開発中のものです。 mailto:sage [2009/01/30(金) 16:55:21 ID:O2nIHOeq]
- >>434は別に口答えしてるわけじゃない気がするw
- 437 名前:名前は開発中のものです。 mailto:sage [2009/01/31(土) 08:12:45 ID:qu7YpnnP]
- アクションゲームとかでキャラの座標って本当にキャラ自身が持つべきなのかな?
とたまに悩む
- 438 名前:名前は開発中のものです。 mailto:sage [2009/01/31(土) 12:07:33 ID:2t9biDkM]
- Gemsにある『コンポーネントベースのオブジェクト管理』とか見てみるとよい
- 439 名前:名前は開発中のものです。 mailto:sage [2009/01/31(土) 19:06:11 ID:mhj1e1O5]
- そのへん追求し始めたらキリ無いよねw
最近はもう深く考えるのはやめた
- 440 名前:名前は開発中のものです。 mailto:sage [2009/01/31(土) 19:11:05 ID:L0OEs6zN]
- >>437
悩む悩むw
- 441 名前:名前は開発中のものです。 mailto:sage [2009/02/01(日) 19:03:38 ID:tMKL4U61]
- >>437
1番近い敵キャラが攻撃してくる って処理を書いたときに同じ疑問を俺も感じた。 int near = CEnemy::returnNearNum(); enemy[near].attack(); ↑こんな感じで静的なメンバ変数を返して貰っていたけど STGみたいに「自機」対「敵機達」ならこれでもいいんだけど ボンバーマンみたいなバトルロワイヤルとかサッカーやアメフトみたいなボールゲームとか お互いの位置関係が重要なゲームになるとステージ側が管理すべきかなと。
- 442 名前:名前は開発中のものです。 mailto:sage [2009/02/02(月) 20:35:13 ID:esDSGZyH]
- ステージ側でやってることが多くなって
どこかに細分化できないかなと悩み出すんですね わかります
- 443 名前:名前は開発中のものです。 mailto:sage [2009/02/03(火) 03:59:27 ID:cOF6NPxT]
- キャラの位置をステージ側で管理する手法も
割と普通だとは思うけど、OOP前提なら避けたいかなあ 近傍キャラの検索スピードを最適化したいということなら ステージ側に直前のフレームでの位置情報のコピーを作るとか
- 444 名前:名前は開発中のものです。 mailto:sage [2009/02/06(金) 21:51:27 ID:+KF0MHRv]
- たとえば、石クラスと、マップクラスと、それらを管理するシーンクラスがあったとして、
・石に重力を働かせる処理 ・石と石の衝突処理 ・石とマップの衝突処理 は、それぞれどのクラスが担当すべきだろうか。
- 445 名前:名前は開発中のものです。 mailto:sage [2009/02/06(金) 21:56:52 ID:jTgjQpbm]
- >>444
物の理を司る GOD class
- 446 名前:名前は開発中のものです。 mailto:sage [2009/02/06(金) 21:57:18 ID:sBGSiXKq]
- 分からないから指向をそのままレスとして出力。
・ゲームは現実を模倣するものじゃないから、重力が全てに等しく働くとは限らない。 ・が、固有の係数との積で出せばいいからやはり個々ではない所に基本重力値を。 ・衝突判定方法をあらかじめ限定しておけば、二つの物体を引数にとって判定を返す関数を作ることが可能。 ・同上により、マップと石との判定をあらかじめ限定化すれば、独立した関数として定義可能。 ごめん、適当に書いただけ。
- 447 名前:名前は開発中のものです。 mailto:sage [2009/02/06(金) 21:58:24 ID:y5Y5dk+m]
- 唐突に石とかマップとかいわれても一般性がなさすぎてバックグラウンドがよくわからん
- 448 名前:名前は開発中のものです。 mailto:sage [2009/02/07(土) 00:34:27 ID://aDzdii]
- > ・石に重力を働かせる処理
石クラス > ・石と石の衝突処理 マップクラスに位置情報を登録して一括処理 > ・石とマップの衝突処理 石クラス
- 449 名前:名前は開発中のものです。 mailto:sage [2009/02/07(土) 01:46:53 ID:HaVHq232]
- > ・石に重力を働かせる処理
石クラス > ・石と石の衝突処理 衝突判定クラス > ・石とマップの衝突処理 衝突判定クラス
- 450 名前:名前は開発中のものです。 mailto:sage [2009/02/07(土) 13:25:16 ID:bH//onUq]
- > ・石に重力を働かせる処理
ゲーム管理クラス > ・石と石の衝突処理 ゲーム管理クラス > ・石とマップの衝突処理 ゲーム管理クラス
- 451 名前:名前は開発中のものです。 mailto:sage [2009/02/07(土) 14:22:20 ID:VS035g6S]
- > ・石に重力を働かせる処理
石に重力クラス > ・石と石の衝突処理 石と石の衝突処理クラス > ・石とマップの衝突処理 右とマップの衝突処理クラス
- 452 名前:名前は開発中のものです。 mailto:sage [2009/02/07(土) 14:51:09 ID:VC/wpjC+]
- >>451
オブジェクトの衝突判定の組み合わせの数だけクラス作るつもり?
- 453 名前:名前は開発中のものです。 mailto:sage [2009/02/07(土) 16:19:23 ID:Pn1Dl7Zh]
- >>450
CGameManagerですね、わかります
- 454 名前:447 mailto:sage [2009/02/07(土) 16:35:33 ID:oHEfOG3S]
- みんな何のことだかわかっていて俺涙目
- 455 名前:名前は開発中のものです。 mailto:sage [2009/02/13(金) 17:17:04 ID:gamtZzLZ]
- テーマが石なら、
>・石に重力を働かせる処理 シーン管理クラス >・石と石の衝突処理 シーン管理クラス >・石とマップの衝突処理 シーン管理クラス だな。 石なら質量・形(テクスチャ)・位置・速度・加速度など汎用なメンバ変数だけで事足りる。 シーンに乗る子オブジェクトを継承した石クラスを作っておいておくだけ。 石クラスの中身は空で、後々必要になったら拡張できるぐらいにとどめておく。 だから感覚的にはクラスを用いただけの構造体のような使い方で書くかな。 これがもし石でなく、人のような思考の多様性を持たせるのなら、また話は変わってくるかも。
- 456 名前:名前は開発中のものです。 mailto:sage [2009/02/13(金) 17:35:30 ID:gamtZzLZ]
- 455だけど、修正
やっぱ衝突判定クラス作るわ。 シーン管理は保持オブジェクトと描画などについて司るだけで、 オブジェクト(石やらマップやら)をそれに入れて判定するだけにとどめておくのがいいと思った。
- 457 名前:名前は開発中のものです。 mailto:sage [2009/02/14(土) 00:06:30 ID:wuF2UeZP]
- 沈静化したネタに対するレスより新たなネタの方がスレが進んでうれしいと思うな、思うな
- 458 名前:名前は開発中のものです。 mailto:sage [2009/02/14(土) 00:20:27 ID:+0ELSliX]
- >>457
じゃあ新たなネタ出せよ
- 459 名前:名前は開発中のものです。 mailto:sage [2009/02/14(土) 01:01:03 ID:1cFYmXpg]
- ああ。誘導されて初めて来たんで、日付もろくに見てなかった。悪い。
新しいネタか……。じゃあ、1つだけ。 ゲームって作りながらデバッグや、完成してからももちろんチェックするんだろうけど、 その過程でゲーム特有のデバッグ手法があれば教えてほしい。 リークチェックやAssert使うとかの普遍的な手法の話というよりは、 ゲーム特化で、データ構造・クラス・パターンの観点から、、 いかにしてスクリプト上の変な挙動を見破れる技法だとか、 デバッグメニューとして必要なものは何かだとかそういうのが知りたい。 自分のようなアマチュアではそこまで手が回らないんで、 いつも自分で修正・テストを繰り返して大体動くなと思ったらテストプレイをお願いしている。 そんな中、どのように効率よく(少ないコード&短かい時間で)デバッグできるか教えてほしい。 そもそもデータ構造やクラスを気をつけていればバグは出ないとかいうのは無しで。
- 460 名前:名前は開発中のものです。 mailto:sage [2009/02/14(土) 03:08:07 ID:qKH3GStO]
- 人にデバッグを頼むのであれば、調べたい場所まですぐにたどり着けるような仕組みを。
無敵モードとかステージセレクトみたいな。 当然ながら、バランスチェックを含めたテストプレイならこれらの機能はOFFで。 コリジョンの可視化。特定のボタンやデバッグ用のフラグでコリジョン無視。 エネミーやアイテムを自由に配置。デバッグメニューからのパラメータ操作。 ボタン一発で勝利/敗北または成功/失敗。必要に応じて、強制クリティカルとか強制回避なども。 アニメーションやオブジェクトの移動の速度コントロール(数十倍〜数十分の一まで)。 特定の状況下のセーブデータ捏造、隠しやおまけの強制解放。 スクリプトはエラーチェックを厳しくするぐらいしか思いつかないな……。
- 461 名前:名前は開発中のものです。 mailto:sage [2009/02/14(土) 10:08:02 ID:hPf9zE7f]
- リリース用には付けなくても、デバッグ用にリプレイ機能あるといいよ。
- 462 名前:名前は開発中のものです。 mailto:sage [2009/02/15(日) 16:27:42 ID:933sIzgh]
- 速度調整機能つけたりログ吐かしたり
そんくらいしかやっていないな。
- 463 名前:名前は開発中のものです。 mailto:sage [2009/02/18(水) 14:05:52 ID:1weRwVko]
- >>460-462
いろいろありがとう。 あらかたデバッグ用に実装してみました。
- 464 名前:名前は開発中のものです。 mailto:sage [2009/02/18(水) 14:39:48 ID:0gTNCSoI]
- 行動力あるね
素晴らしい。見習いたい
- 465 名前:名前は開発中のものです。 mailto:sage [2009/02/19(木) 03:37:37 ID:4unT5BXH]
- いやいや。実装したのはこんだけです。
コリジョン可視化:テクスチャ読み込み後に四隅に沿って緑色で四角線を書くだけ パラメータ操作:テンキーで実装 4と6で対象パラメータを選択 (あらかじめ操作対象を手動でlistしておく) 789でパラメータ上昇(7で+1,8で+10,9で+100) 123でパラメータ下降(1で-1,2で-10,3で+100) 0で強制0(bool値ならfalse) 便利ボタン:戦闘強制勝利機能とエンカウント無効をFXXキーに割り当て 速度コントロール:VSync非同期にして、FPSを上げることで対応 2倍にすると早すぎたので、1.5倍(90fps)をボタンに割り当て リプレイ機能:フレームごとの入力(キーボード/ジョイパッドを合わせた入力値)をファイルに出力 (一見単純そうだけど、セーブ/ロードの関係でこれには実装に手間取った) 作っているのがRPGなので、便利ボタンとパラメータ操作がとても役に立っています。 ありがとうございました。
- 466 名前:名前は開発中のものです。 mailto:sage [2009/02/21(土) 07:24:48 ID:3Qcrn5pr]
- 洋ゲーだと、LuaみたいなDSLをスクリプトとして組み込んでるせいか、
ゲーム中でもコンソール出して直接変数いじったりできるのがあるよな。
- 467 名前:名前は開発中のものです。 mailto:sage [2009/02/21(土) 12:50:08 ID:YLpnm94h]
- pc11.2ch.net/test/read.cgi/gamedev/1234977661/
- 468 名前:名前は開発中のものです。 [2009/02/24(火) 16:03:05 ID:xS4ZudQO]
- スマートポインタの使いどころ教えて
- 469 名前:名前は開発中のものです。 mailto:sage [2009/02/25(水) 02:46:38 ID:1o4GjPkR]
- 使いどころっつーわけじゃないけど
次のC++規格が決まれば、早ければ今年中にも std::shared_ptr として使えるようになる予定 今でも既に std::tr1::shared_ptr になってるけど
- 470 名前:名前は開発中のものです。 mailto:sage [2009/02/25(水) 05:08:14 ID:M8Pe/6zZ]
- >>468
まず一般的に、スマートポインタは動的確保されたヒープに用いるとして。 使いどころは、 ・ヒープの解放処理を書くのが面倒であったり忘れてしまいたいとき ・ヒープの被参照期間を別のオブジェクトらの生存期間と一致させたいとき ・ヒープの参照状態を把握したいとき ・これまでのソースが生ポインタで参照しまくり不正参照でメモリ破壊しまくりで発狂しそうなとき だと思う。
- 471 名前:名前は開発中のものです。 mailto:sage [2009/02/25(水) 11:43:26 ID:woJXacCs]
- 要約すると、いろんな人・場所で使われるポインタだったら使いどきってことですか
- 472 名前:名前は開発中のものです。 mailto:sage [2009/02/25(水) 18:18:12 ID:QjeqtKpK]
- Yes
いろんなとこから参照されていて、開放時期が掴めないときは最高に便利 理論的には、参照カウンタが0になったら自動的に消えていってくれるよ
- 473 名前:名前は開発中のものです。 [2009/02/25(水) 18:28:42 ID:nKINhS/o]
- つまり、いらなくなったらすぐに消されるってことですね
私のように
- 474 名前:名前は開発中のものです。 mailto:sage [2009/02/25(水) 18:31:43 ID:Z+e+XbPJ]
- 不況だもんな・・・
- 475 名前:名前は開発中のものです。 mailto:sage [2009/02/25(水) 18:55:09 ID:1o4GjPkR]
- いや、それは地球の資源不足で君の給料が確保できないだけだ
スマートポインタがあれば使われなくなった人材をどんどん自動破棄して・・・
- 476 名前:名前は開発中のものです。 mailto:sage [2009/02/27(金) 15:15:39 ID:MDeQuwXl]
- 例えばDirectxのDeviceインスタンスなど、あらゆる所で使われそうなインスタンスは、どう使ってますでしょうか?
Draw、Moveを持つオブジェクトと画面の表示物が1対1で対応してる設計で、 リソース(画像や効果音)などの情報も全てオブジェクトがコンストラクタで受け取り内部で保持してるいかにもoopな設計なのですが、 Deviceインスタンスは 1、Drawの引数に渡す 2、コンストラクタで引数にとり、各オブジェクトがあらかじめ参照を保持。 3、グローバル変数 4、そもそもその設計はまずい 5、その他 現在2です。 1から3に共通する問題としては、Deviceインスタンスをオブジェクト内で操作した内容が間違ってた場合、 発見がかなりめんどくさそうな所でしょうか?
- 477 名前:名前は開発中のものです。 mailto:sage [2009/02/27(金) 15:58:46 ID:XnWaU4Ou]
- デバイスホルダー的なシングルトン作るとか
- 478 名前:名前は開発中のものです。 mailto:sage [2009/02/27(金) 17:33:53 ID:lChaxYTz]
- 俺もシングルトンかな。参照回数が0になったらreleaseで。
- 479 名前:名前は開発中のものです。 mailto:sage [2009/02/28(土) 00:40:47 ID:OR4wkfx2]
- ハッシュテーブルのキーって文字列じゃなくてもいいのかな?
符号なし整数とか。 どっかにそういう例ないです?
- 480 名前:名前は開発中のものです。 mailto:sage [2009/02/28(土) 08:42:03 ID:Cadu6Xk7]
- ハッシュが計算できるなら、キーはなんでもいいよ
- 481 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 04:45:32 ID:y6+tTW6F]
- >>479
こんなんでいいか? ttp://codezine.jp/article/detail/2171?p=2
- 482 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 11:34:39 ID:7UNSgj8M]
- C++でシングルトンするのってなんか滑稽じゃね?
Javaじゃないんだし そこまでクラス原理主義にならんでもいいのにと思う
- 483 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 13:08:45 ID:A313Daxt]
- >>482
グローバル変数が欲しいんではなくて、システム全体で一つしかないということを 明示的にする為のパターンだから
- 484 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 14:26:30 ID:7UNSgj8M]
- グローバル変数関係ないやろ
普通にstaticで隠してヘッダで関数だけ提供すればいいやんけ インスタンシエーション必須の言語が苦肉の策でひねり出したのがシングルトン よーく考えよう
- 485 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 14:28:31 ID:7UNSgj8M]
- あ、ちょっとちがうな。
「クラス定義必須、インスタンシエーション普通」の言語だな。
- 486 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 15:48:06 ID:A313Daxt]
- >>484-485
エンド ユーザーがそのクラスを作成できてしまうじゃないか 作成できないようにしたのがシングルトンだろ 話変わるけどカプセル化って C++ や Java の特長みたいに言われるけど C言語でも出来るんだよなー
- 487 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:07:52 ID:7UNSgj8M]
- >>486
そのクラスのインスタンスが1つであることを保証するのがシングルトン クラス(原因)が無ければインスタンス(問題)も無い だからシングルトン(解決策)も要らんと言っているんだ C++でのシングルトンはマッチポンプなんだよ
- 488 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:18:21 ID:7UNSgj8M]
- www.geocities.jp/ky_webid/design_pattern/009.html
「C++ シングルトン」でググったら出てきたページ この労力を指して滑稽だと笑ってるんだけどな Javaなら習得必須の概念だし俺も普通に使うが C++でこんなん無理してやったら馬鹿みたいだと思わね? // 生成やコピーを禁止する ↑アホじゃね? 最初からクラスにしなきゃいいじゃん クラス原理主義に陥って思考停止しちゃってるんじゃないか 目的と手段の関係について考え直してみるといい
- 489 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:29:34 ID:7UNSgj8M]
- まあ、要件に多態性があるならクラス化した方が楽かもしれんけど
それ以外だとやっぱり儀式めいたものを感じるな
- 490 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:29:53 ID:oPKUKLY9]
- 先にクラス原理主義という単語を発してしまった時点で
ID:7UNSgj8Mが単なるC++においてのクラスアンチなだけに見える件
- 491 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:34:17 ID:7UNSgj8M]
- >>490
アンチクラスなんて単語あったんだ 知らなかった C++でもクラス使いまくりなんだけど C++でシングルトンやらないだけでアンチクラスか
- 492 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:39:54 ID:7UNSgj8M]
- クラスアンチだしw
www.google.co.jp/search?hl=ja&q=%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%A2%E3%83%B3%E3%83%81&lr=lang_ja ググるとアンチクラスが出てくる上にプログラムカンケーねえしw まあいいや C++シングルトン症候群と命名しておこう マジで一度考え直した方がいい
- 493 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:57:37 ID:12yJl3As]
- 労力って
コンストラクタをprivateにしたり、 コピーコンストラクタを宣言だけ記述したりするだけじゃん >↑アホじゃね? 最初からクラスにしなきゃいいじゃん クラスで管理する方が都合が良くて、尚且つインスタンスを一つに制限したいものなんていくらでもあるだろう じゃあシングルトン使わないでインスタンスを一つだけに制限するもっと楽な方法ってなんだよ
- 494 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 17:07:43 ID:7UNSgj8M]
- >クラスで管理する方が都合が良くて、尚且つインスタンスを一つに制限したいものなんていくらでもあるだろう
いくらでもあるのか そういや初期化を意識させたくない場合なんかもクラスで管理した方がいいな あとは>>489 俺にはこの2つくらいしか思いつかんが こういう風にクラス化する理由があるならいいんじゃね >じゃあシングルトン使わないでインスタンスを一つだけに制限するもっと楽な方法ってなんだよ >>484
- 495 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 17:20:31 ID:12yJl3As]
- >>484の方が楽だとは思えない
まあでもお前がその方が楽だと言うなら尊重するよ 一緒に仕事する相手じゃないからな
- 496 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 18:55:30 ID:Erqh3NJs]
- namespaceでくるんだり全部staticメソッドにしたりもしてみたけど、
素直にシングルトンにしたほうがイディオム的に分かりやすいと思う。 ファクトリメソッドとかで、普通のオブジェクトと同じように生成したい場合も、 シングルトンのほうが便利だよね。 それと、あとから「やっぱシングルトンやめ」ってなったときに、 変更が少なくてすむのも利点かなあ。
- 497 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 20:00:35 ID:z7QigqBL]
- まぁ疑問を持つのは悪い事じゃない
他人に強要しなければね
- 498 名前:名前は開発中のものです。 mailto:sage [2009/03/12(木) 10:42:00 ID:X7nBBwQA]
- Delphiでシングルトンする方法なんてこれだぞ(公式ライブラリVCLで使われている方法)
interface // 宣言部(C++のヘッダーにあたる) type TPrinter = class // クラスの宣言 : end; function Printer(): TPrinter; implementation // 実装部(ヘッダーじゃない方) var FPrinter: TPrinter; // グローバルへんすうw function Printer(): TPrinter; begin if FPrinter = nil then FPrinter := TPrinter.Create; // TPrinter生成 Result := FPrinter end; 厳密にインスタンス化の制限とか、もはやどうでもいいクラスw
- 499 名前:名前は開発中のものです。 mailto:sage [2009/03/12(木) 10:43:53 ID:X7nBBwQA]
- >>498
捕捉: (わかると思うけど)使う時は、他のユニットから Printer.HogeMageSimasu; 見たいに使う あと抜けてるけど、実際には、finalzation節?でアプリ終了時のFPrinterの開放処理がある。
- 500 名前:名前は開発中のものです。 mailto:sage [2009/03/16(月) 15:21:22 ID:FTtiBwy2]
- また変なのが沸いてるのか
- 501 名前:名前は開発中のものです。 mailto:sage [2009/03/18(水) 23:45:50 ID:1sOkzJT6]
- デバイスに直接アクセスする処理ってどこに書いてる?
今まであちこちに散らばって状態で書いてたんだけどなんか扱いづらい。 下みたいな感じで一箇所にまとめた方がいいのかな。 今:あちこちでデバイスにアクセス void draw_landform(void) { ... lpD3DDEV->draw(...); } void draw_menu(void) { ... lpD3DDEV->draw(...); } 案:デバイスアクセスは1箇所。デバイスに渡すデータをあちこちで作る。 const DrawData *draw_landform(void) { ... return ...; } const DrawData *draw_menu(void) { ... return ...; } void main_loop(void) { draw_data.push(draw_landform(), ...); draw_data.push(draw_menu(), ...); lpD3DDEV->draw(draw_data, ...); } もし既に案の方法でやってる人いたら使い勝手教えて!
- 502 名前:名前は開発中のものです。 mailto:sage [2009/03/19(木) 04:54:27 ID:KYbRBn+z]
- 久々に答え甲斐のありそうな相談が来たな
だが俺はモーションインデックスとベクトルをリストに投げて後で一気に処理する方法だから答えられそうに無い お前らに任せたぜっ!
- 503 名前:名前は開発中のものです。 mailto:sage [2009/03/19(木) 05:21:17 ID:XLj1eEa+]
- 描画能力のあるオブジェクトをリストなりグラフなりに登録しておいて、デバイスハンドルはビジターで渡す、とか。
- 504 名前:名前は開発中のものです。 mailto:sage [2009/03/19(木) 19:28:19 ID:ALN5WhPj]
- 俺はこの案では無いなぁ…てかどうせなら
lpD3DDEV->draw(draw_data, ...); は draw_data.draw(...); みたいにしてlpD3DDEVに直接アクセスしない方が…
- 505 名前:501 mailto:sage [2009/03/20(金) 00:10:41 ID:/TREybMM]
- レスありがとう。
>>502 「案」の方に似たやり方だよね? draw_dataがリスト相当で。 やっぱやってる人いたか。採用してるってことは使いやすいんだろうか >>503 void LandForm::draw(LPDIRECT3DDEVICE9 lpD3DDEV) { ... lpD3DDEV->draw(...); } みたいな感じ? デバイスに直接アクセスする処理が複数のクラスに散らばるのはOKという判断? この方が使いやすいってことかな? うーん。。。 >>504 Draw_data::draw(...) { this->lpD3DDEV->draw(this->draw_data, ...); } こんな感じ? ラッパー作れって話? 「案」ではないってことは 503 さん宛てのコードと同じ感じでやってるのか うーん、デバイスクラスに依存するクラスが増えると身動き取りづらくなると思うんだけど 気になる人って少ないんだろうか。 0人では無かったけれど。
- 506 名前:名前は開発中のものです。 mailto:sage [2009/03/20(金) 02:39:39 ID:D2lp0Ec4]
- まずはMVCを試みてみるのはどうだろうか
- 507 名前:名前は開発中のものです。 mailto:sage [2009/03/20(金) 04:52:36 ID:09EDEaYz]
- struct Visitor;
struct Element { // 訪問される側の基底クラス virtual void accept(Visitor&) = 0; }; class Landform : Element { public: virtual void accept(Visitor& x) { x.visit(*this); } Data* getLandData(); private: ... }; class Menu : Element { public: virtual void accept(Visitor& x) { x.visit(*this); } Data* getMenuData(); private: ... }; struct Visitor { // 訪問する側の基底クラス virtual void visit(Landform&) = 0; virtual void visit(Menu&) = 0; }; class DrawingVisitor : Visitor { // 各要素を訪れて描画を行うクラス public: DrawingVisitor(LPDIRECT3DDEVICE9 p) : pDevice(p) {} virtual void visit(Landform& x) { pDevice->draw(x.getLandData()); } virtual void visit(Menu& x) { pDevice->draw(x.getMenuData()); } private: LPDIRECT3DDEVICE9 pDevice; }; 続く…
- 508 名前:名前は開発中のものです。 mailto:sage [2009/03/20(金) 04:53:53 ID:09EDEaYz]
- …続き
elementList.push_back(landform); elementList.push_back(menu); void mainLoop() { DrawingVisitor visitor(lpD3DDEV); for(ElementList::iterator i = elementList.begin(); i != elementList.end(); ++i) { i->accept(visitor); } } うーむ…。
- 509 名前:501 mailto:sage [2009/03/21(土) 12:54:05 ID:Y4F/PoMw]
- >>506
今回の話ではModelとControllは関係なくて、Viewの枠内だけで完結する話だと思ってる >>507 複雑すぎて俺の頭では完全には理解できないけど、 > virtual void visit(Landform& x) { pDevice->draw(x.getLandData()); } > virtual void visit(Menu& x) { pDevice->draw(x.getMenuData()); } ここを見るとデバイスに直接アクセスする処理を1クラス内、複数関数にまとめたって感じかな うーん…、複数の関数にデバイスアクセス処理が分散してるとこがあまりうれしくないかな。 (俺には複雑過ぎるのはさておき) 俺が扱いづらいと思ってるところは、 pDeviceさえあればdraw()以外にもbegin_render()とかset_camera()とかいろいろ デバイスに対して変更加えることができちゃうわけで、 それをばら撒くってことはいつどこでデバイスに変更が加わるか、例えばいつどこで何回begin_render()されてるのか とかが追跡しづらくなる。これは1週間後の自分に優しくない。 こんな感じでデバイスに直接アクセスする処理をどう管理したもんかと考えて ひとつの対策案としてデバイスアクセス処理を1関数内に限定しちゃえってのが >>501 の「案」。 だから例えば複数の関数に同一デバイスへのアクセス処理が分散してるのは自分的には問題が解決していないと感じる。
- 510 名前:名前は開発中のものです。 mailto:sage [2009/03/22(日) 03:32:29 ID:O7e3N6nq]
- 描画するにはデバイスに対して様々なパラメータを設定しなけりゃならんわけだが
>>501だとそこをどう処理するのかがよく分からない。 各オブジェクトには描画スクリプトみたいのを作らせておいて、draw()がそれを解釈して描画とか? そうじゃないなら、結局デバイスをやりとりしなきゃならなくなるような。
- 511 名前:501 mailto:sage [2009/03/23(月) 00:38:25 ID:/nVLLFvd]
- >>510
確かに。描画スクリプトかー、どうしよう。 ポリゴンの描画順番の最適化とかやり始めたら必要になりそうな気もするけど 今の自分のプログラムでは大げさすぎるかなぁ。今のところ2D的にしか使ってないし。 あとデバイスってサウンドとか入力装置とかもあるけど、それらもおんなじ感じで取り扱いたいし。 デバイスにアクセスする処理が関数1個の中に「ひとまとまりで」収まってればOKとするなら 下のように書いて済ませられるかな? void dev_state1(void) { lpD3DDEV->BeginScene(); lpD3DDEV->set_parameter(...); lpD3DDEV->draw(draw_landform(), ...); lpD3DDEV->set_parameter(...); lpD3DDEV->draw(draw_menu(), ...); lpD3DDEV->EndScene(); } ひとまとまりってのは1フレーム分のデバイスアクセス処理全部。 描画内容を大きく変えたい時はdev_state2()とかをまた別に作っておいて、 ゲームのステートに応じてどれを実行するか切り替える。 なんか描画スクリプトの方が夢があるな。 外部GUIツールで描画内容を設計して 吐き出した描画スクリプトをゲームで解釈して表示とかおもしろそう。 でも描画システムの根幹過ぎて汎用的に作るのめんどくさそう。。。 うーん、とりあえず簡単に済ませたいからdev_state1()みたいにベタ書きで どこまでいけるかやってみるかな。
- 512 名前:名前は開発中のものです。 mailto:sage [2009/03/25(水) 00:59:33 ID:koP5FPqt]
- hamigaki::coroutines使ってみた。
- 513 名前:名前は開発中のものです。 mailto:sage [2009/03/25(水) 12:39:16 ID:C50L0uFm]
- yhamigakiさんのexec.jamモジュールにはお世話になっております
- 514 名前:名前は開発中のものです。 [2009/04/05(日) 14:24:00 ID:a5PaoF6B]
- スレッド1..n 仮想描画コマンドをメモリに積む
デバイス用スレッド 仮想描画コマンドを解釈して実際のコマンドを発行 利点 単体テストが容易、移植が容易、マルチコアの恩恵を受けることができる 欠点 仮想描画コマンドバッファの管理にロック、セマフォは必須、上手に使用しないと逆に重い
- 515 名前:名前は開発中のものです。 mailto:sage [2009/04/06(月) 03:21:58 ID:NgKFyYts]
- 仮想描画コマンドバッファをスレッドごとに持てばいいじゃない。
- 516 名前:名前は開発中のものです。 [2009/07/15(水) 22:32:12 ID:1c2msACv]
- www6.atpages.jp/~autonomydoll/game/RPGClient.zip
クライアントからサーバーに要求を送って、サーバーから要求を受け取るような機能を付け加えたいんだが、どういう設計にすればいいかわからない。定石みたいなのがあったら教えてほしい。 今のクラス構成 ScreenManger-->ScreenGame-->Title | |->Main-->Map -| | -->Unit--->sprite--| |--------------------------------------------------------------->GraphicsWarpper
- 517 名前:名前は開発中のものです。 mailto:sage [2009/07/15(水) 22:40:07 ID:h6KyoexM]
- WinAPI使ってるなら、WinSockで送信して、ウィンドーメッセージで受信する。他はシラネ。
- 518 名前:名前は開発中のものです。 mailto:sage [2009/07/15(水) 22:41:36 ID:3ppQI3l+]
- >>516
> ScreenManger 画面飼槽 > GraphicsWarpper グラフィックスワープ装置 何が言いたいのかさっぱりわからないのだが。
- 519 名前:516 [2009/07/15(水) 22:46:53 ID:1c2msACv]
- >>517
忘れてました。 net frameworkを使ってます。 >>518 ScreenMangerはスクリーンマネージャという意味で、シーン全体を管理してます GraphicsWarpperは単なるラッパーです。
- 520 名前:名前は開発中のものです。 mailto:sage [2009/07/15(水) 22:57:45 ID:cL81hhcG]
- こんな面白い難読化もなかなかないな
- 521 名前:名前は開発中のものです。 mailto:sage [2009/07/15(水) 23:01:47 ID:3ppQI3l+]
- >>519
> net frameworkを使ってます。 .NET Framework を勝手に先頭のドットを省略したり、勝手に小文字に変えたりするなよ・・ > ScreenMangerはスクリーンマネージャという意味で、シーン全体を管理してます それならMangerではなくManagerだろ。 > GraphicsWarpperは単なるラッパーです。 それなら、WarpperではなくWrapperだろ。 小学校は夏休みなのか・・ せめて中学生になってからにしてくれ
- 522 名前:名前は開発中のものです。 [2009/07/15(水) 23:14:16 ID:1c2msACv]
- >>521
すまん。スペルミスった・・・。
- 523 名前:名前は開発中のものです。 mailto:sage [2009/07/16(木) 01:35:23 ID:Ac1CnfQd]
- まず日本語と英語を勉強するべきでは?
そうじゃなくても、変数名などを略すのはやめた方がいい、複雑なコードになると対応できない 自分はdeleteHandCardListみたいな長い名前つけたりするけど、困ることは1つもないね ちなみに件の話に関しては書籍があるよ GameDeveloperのオンラインゲームの青本 MMORPGを作る赤本もある 2chで説明すると1スレ使っても無理だと思う
- 524 名前:名前は開発中のものです。 [2009/07/16(木) 02:06:03 ID:Dq9kBSTx]
- >>523
ありがとう。 それをあたってみる。
- 525 名前:名前は開発中のものです。 mailto:sage [2009/07/16(木) 02:29:30 ID:lK28N0n1]
- 質問の内容と関係ない単語にしかつっこめない奴が多くてワラタ
- 526 名前:名前は開発中のものです。 mailto:sage [2009/07/16(木) 05:49:13 ID:0eDNLm6a]
- 2〜3人で多いのか、寂しい生活してるんだな
- 527 名前:名前は開発中のものです。 mailto:sage [2009/07/16(木) 10:25:09 ID:irpkCXOF]
- 言われて悔しいならもっと勉強しろよ
- 528 名前:名前は開発中のものです。 mailto:sage [2009/08/14(金) 18:57:02 ID:qfXJNhjS]
- コミケの影響で最近来なかったここを再び覗くように。変なテンションダァ・・・
>>395 395以前のまとめ >>404,406-407 シーン遷移考え方 >>408-413,416-425 シーン遷移実装サンプルと問題点。 >>427-433 0からSTGの作成を考える。 根本的な勘違いや非効率的なことがあるのであまり参考にはならない。 >>437-443 オブジェクトと座標管理 >>444-456 オブジェクトと衝突判定と全体効果 >>459-465 デバッグ用処理を考える。(衝突判定表示とか) >>501-511 DirectXのデバイスの管理とか使い方 >>523 ネットワーク機能参考図書紹介
- 529 名前:名前は開発中のものです。 mailto:sage [2009/08/14(金) 19:24:51 ID:qfXJNhjS]
- STGのビジュアル関連向上に関するメモ。
・・・あんま設計と関係ないな・・・ それっぽい弾の作り方 ・コマは2コマは以上用意して、画像の色を通常っぽいのと白っぽいのにする。アニメは4コマあればきれい。 ・ケイブっぽい弾を作る場合。1コマ作った後、コピーして1ドットぐらい前後ずらし、形を適当に修正。明るい部分はなるべく中心に近づくよう修正。 ・円形の回転する弾の工夫。わざと中心から斜めに1ドットずつずらす。 ちょっと光ったエフェクトとか。 ・メイン画像と残像(というか残光)画像を用意。後は適当に残像表示の要領で重ね描画。 ・センコロのブーストエフェクト。適当な○画像をブースター付近から扇子状に放射するだけ。それっぽいブーストグラフィックが得られる。 弾やエフェクトはポーズ連打して見てみたりすると、プログラムと画像をうまく考えれば誰でも作れるものが多い・・・気がする。
- 530 名前:名前は開発中のものです。 mailto:sage [2009/08/14(金) 22:21:56 ID:FZUQWr9u]
- >>529
設計というよりは演出(エフェクト)の話でしょうか。 もし続けるなら専用のスレを立てた方がよいと思われ。
- 531 名前:名前は開発中のものです。 mailto:sage [2009/10/05(月) 01:40:33 ID:mQYy5BRf]
- シミュレーションやRPGで
経営状況や主人公の内部パラメータと呼ばれる データ群がごっそりあると思いますが, そういったものの管理は 実際のゲーム開発でどういった形でなされるものですか? データクラスを作ってアクセッサで操作を許す? それとも,すべてグローバル変数で持たせる?
- 532 名前:名前は開発中のものです。 mailto:sage [2009/10/05(月) 04:33:25 ID:/TvwIsfE]
- シングルトンクラスのオブジェクトをグローバルに定義する
- 533 名前:名前は開発中のものです。 mailto:sage [2009/10/05(月) 07:34:29 ID:Rel4l/Gg]
- SQLiteとか使って手抜くってのもあり
- 534 名前:名前は開発中のものです。 mailto:sage [2009/10/14(水) 22:12:56 ID:TwzkU58s]
- グローバル変数はありえない。データクラス。
ただ、データの表示とかはいつも頭を捻らすなぁ。
- 535 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 07:50:05 ID:P3b4xThD]
- アクセッサ書くのめんどいだろ
- 536 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 08:41:22 ID:OtHf9VTl]
- なんでそんな両極端なの?
- 537 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 15:54:18 ID:byjv3si3]
- 0と1しか無いからな
オタクの頭ん中は
- 538 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 20:13:55 ID:P3b4xThD]
- 別に両極端で構いません.
意見を頂けるだけで嬉しいです. むしろ噛み付くほうが迷惑です.
- 539 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 22:16:10 ID:r8d5RKMA]
- 使う人がデータを把握できてるなら好きにすればいいんだよ。
質問は実際のゲーム開発だから、面倒でも形式的にやるしかないんじゃない。
- 540 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 22:18:05 ID:2byzEsEE]
- >>535
アクセッサ書くのめんどくさいって言ってたら コーディングが意味不明になってやる気をなくす自信がある。 実際それで何回も挫折した。分かりにくくなるくらいならメンドイ方がマシ。
- 541 名前:名前は開発中のものです。 mailto:sage [2009/10/15(木) 23:29:40 ID:r8d5RKMA]
- 俺は変数に直接アクセスでも分かりにくいと思わないし。
アクセッサ書くのもめんどくさいとは思わない。
- 542 名前:536 mailto:sage [2009/10/16(金) 00:35:50 ID:L+kS7tAJ]
- >>538
悪い、噛み付くとかそういうつもりは無かった。 普通に設計して、グローバルにアクセスする必要があるデータを持ってるクラスだけ Facade経由でアクセスできれば良いんじゃないかと思っただけ。 グローバル変数はさすがにあり得ない…
- 543 名前:名前は開発中のものです。 mailto:sage [2009/10/16(金) 01:18:33 ID:MsmDVyev]
- 2chで素直に謝られると逆に困ります.
参考になりました,ありがとうございます.
- 544 名前:名前は開発中のものです。 mailto:sage [2009/10/16(金) 01:38:32 ID:tEeFyBBH]
- グローバル変数を利用側が直接更新したり参照したりするのはアウトだけど、
スタティックグローバルな変数を、何らかのアクセス関数を通して更新/参照するような設計は普通だと思う。 // gamedata.h void update(); int get_parameter1(); // gamedata.cpp static int s_paramter1 = 0; static int s_paramter2 = 0; .... void update() { /* 更新 */ } int get_parameter1() { return s_paramter1; } 唯一しか存在しないゲーム中のデータをどう実装・管理するか、って視点だけで考えれば スタティックグローバルであろうと、クラスであろうと大差ないと思うけど、 ある時点でのスナップショットを扱う必要がある、みたいな場合、 // gamedata.h void update(Data* gamedata); int get_parameter(Data* gamedata); て感じで、結局データを引数で取る形になるから、クラスで実装して方がいいんじゃないかと思う。
- 545 名前:名前は開発中のものです。 mailto:sage [2009/10/16(金) 06:29:56 ID:UJ9WR3Zt]
- 代入の時などに別の処理を入れるんでなければ
変数を直接弄るんでもいいかな・・・。
- 546 名前:名前は開発中のものです。 mailto:sage [2009/10/16(金) 11:40:43 ID:/PDPq+0/]
- 入力値の正当性をチェックしたり、同時に変更しなければならないパラメータが1つじゃなかったり、
そういう可能性を考慮すると、関数を経由させたほうが便利。
- 547 名前:名前は開発中のものです。 mailto:sage [2009/10/16(金) 20:07:25 ID:eJ9LLkd5]
- アクセッサ経由だとバグっぽい動きも引っ掛けやすいが、
そうでないと大変そうだな。デバッグ一件で1時間とか悩みたくないし。
- 548 名前:名前は開発中のものです。 mailto:sage [2009/10/18(日) 12:51:59 ID:Yr/zm5ey]
- >546
確かに使い方を間違えるってのはよく起こる
|

|