- 1 名前:名前は開発中のものです。 [2008/05/23(金) 21:10:59 ID:8M1gqhPX]
- 具体的なゲーム名を挙げて、
どのようにクラス設計をすればよいか、 継承・委譲関係はどのようにすればよいか、 使えそうなパターンは何かなど語るのもよし。 自作ゲームの内容とクラス図を書いて 改善案を聞くもよし。 設計に関して困ったことを質問するもよし。 関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。 大いに語れ。 前スレ pc11.2ch.net/test/read.cgi/gamedev/1155209226/ テンプレ追加事項あったらよろすく
- 327 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 11:57:21 ID:MS2hHN8x]
- >>326
Javaの場合は、状態クラスを作って、それを持つようにすればいいんだよ。
- 328 名前:318 mailto:sage [2008/08/28(木) 17:59:10 ID:Z+eKsEJG]
- >>321,322
汚いコードって書き直したくなってくるんですよね。 綺麗に書けないと達成感がないというか・・・。 また、本などで知識をつける毎に、今まで書いてきたコードが正しくない書き方だったな〜と思うことが多くて(プログラミング始めた頃はダライアス継承とかやってたw)。 完成させることが第一と思っていてもついつい・・。 >>323,327 stateパターンですよね? >>325 そういう方法でやってるところもあるんですね。 でも、オブジェクトのコピーが効率悪そう。
- 329 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 18:35:54 ID:CuTVRbF+]
- 自分ひとりで考えても、本を読んでも出てこない、他人の眼に触れさせなければ見えてこないものもある。
それよりも自分の達成感の方を優先したいならそっちを選べば良いさね。 つか、コードの正しさ、綺麗さ、効率の良さ、読みやすさってどういうものだとして使ってる?
- 330 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 19:03:37 ID:Jt4Hw7jN]
- むしろ可能な全ての表記法を試す勢いで!
次のプログラムからは気に入った表記で。 昔の事は忘れましょう。
- 331 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 19:43:21 ID:MS2hHN8x]
- 人が書いたソースを読むのって勉強になるけど、読む気が出ない……
>>328 >stateパターンですよね? パターンのことはよく知りませんが、ポリモーフィズム(多態性)です。
- 332 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 20:37:26 ID:xedxyhWb]
- >状態という概念が無い
敵が爆発する瞬間とかだとやっちゃうなあ……。効率悪いんだろうか。
- 333 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 21:28:28 ID:MS2hHN8x]
- >>332
他に良い方法があるならどうぞ。 MHz世代のCPUで通用してた方法だから、致命的な効率低下があるとは思わないよ。
- 334 名前:318 mailto:sage [2008/08/28(木) 21:30:31 ID:Z+eKsEJG]
- >>329
コードの正しさ、綺麗さの2つは曖昧な表現で使うべきではなかったですね。 私はコードには、実行効率、保守性、読みやすさの3つがあると思っています。 今問題にしてるのは、主にこのうち後者2つです。 ただ、読みやすさは人それぞれなのかもしれません。 >>331 状態毎に仮想関数をオーバーライドするのが、まさにstateパターンですね。
- 335 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 21:59:24 ID:O/+Qqs/2]
- 保守性も読みやすさもifとenumにしたからと言って損なわれるものでも無いと思うけど何を悩んでるの?
- 336 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 22:18:17 ID:qtCAmqfQ]
- ダライアス継承ってどんな継承?
- 337 名前:名前は開発中のものです。 mailto:sage [2008/08/28(木) 22:22:03 ID:xedxyhWb]
- >333
爆発オブジェクトを自身と同じ場所に生成して、自身を削除する って認識で合ってる?
- 338 名前:318 mailto:sage [2008/08/28(木) 23:04:17 ID:Z+eKsEJG]
- >>335
保守性については、仕様変更により、状態を追加したり、廃止したりする時、影響する部分を探し出すのがめんどくさいというかすっきりしないというか。 読みやすさは個人的な好みかもしれません。 保守性、読みやすさともにstateパターンの方が好きです。 でも、直交した状態群が複数あるとき、stateパターンで実装するのが難しそうなので悩んでいました。 うまい方法が見つからなければ、enumとifでいくつもりでした。 >>336 ダイアモンド継承の方が一般的な呼び方なのかもしれません。 仮想継承を使うことによって、継承グラフが菱形になるやつです。
- 339 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 00:44:03 ID:hcEje8O4]
- ダライアス継承なんて初めて聞いたなあ
英語だと Multiple Inheritance あるいは Diamond Inheritance と言うようだが。 あとダライアス(Darius?)はペルシャ人の名前のようだ。 まゆに唾つけて聞いておこうかな
- 340 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 00:50:36 ID:rESH+j3C]
- ダライアス継承でググってみても勘違いで質問してる奴にしか引っかからないな
デザパタへの無駄なこだわりとか、初心者がなんか変な用語がいっぱい並んでる本だけ読んで惑わされてるだけに見える
- 341 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 02:39:33 ID:VLtb7ZED]
- Multiple Inheritance (多重継承) と Diamond Inheritance (ダイヤモンド継承) は
違う概念だが...というかダライアスっていうとシューティングゲームしか思い浮かびませーん
- 342 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 06:43:42 ID:gdp2Jatd]
- ir9.jp/prog/ayu/datlog/tech_cpp/1106527792/1106527792_01.html#R50
- 343 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 10:26:08 ID:ESvglHwU]
- >>337
合ってると思うよ。 問題があるとすれば、状態を変化させるだけの場合、ライフとかのパラメータ引き継ぎどうすんねんとか。 そこんとこがツクールVじゃ無理だった。(最近の(95とか)はシラネ)
- 344 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 14:31:33 ID:UaA8GGvx]
- >>341
>ダライアスっていうとシューティングゲームしか思い浮かびませーん ダライアスの面セレクト画面が菱形継承図っぽいところから生まれた俗称だったりしてw
- 345 名前:名前は開発中のものです。 mailto:sage [2008/08/29(金) 14:34:13 ID:nV9hYRuE]
- >だったりしてw
いやだったりしてっつーかそれしかなくね
- 346 名前:名前は開発中のものです。 mailto:sage [2008/08/30(土) 13:56:18 ID:vqGqt03L]
- ダイヤモンドが2個も3個もあるような継承のことか。
C3 MRO の解説でしか見たこと無いが。
- 347 名前:名前は開発中のものです。 [2008/08/30(土) 14:18:00 ID:gGJd0yLw]
- ドラえもん 「ことわざゲーム」
これはいいアニメ。 ... ドラえもん 藤子F不二雄 アニメ ドラえもん後期 ドラえもん本編 教育アニメ コメント非 表示推奨 緑 ... ex-co-jp.8866.org/gourmet/080803.rar
- 348 名前:名前は開発中のものです。 mailto:sage [2008/08/30(土) 14:23:18 ID:h7pQaJrI]
- なんかあちこちで見かけるな。これ以上ないってくらい、明らかにヤバいリンク
- 349 名前:名前は開発中のものです。 mailto:sage [2008/08/30(土) 14:32:04 ID:hoYQeFVI]
- 夏休みも終わりって事さw
- 350 名前:名前は開発中のものです。 mailto:sage [2008/08/30(土) 14:40:33 ID:vqGqt03L]
- Bot使った宣伝書き込みかなぁ
- 351 名前:名前は開発中のものです。 mailto:sage [2008/08/30(土) 15:36:27 ID:h7pQaJrI]
- なんかのマルウェアって聞いたが
- 352 名前:名前は開発中のものです。 mailto:sage [2008/08/31(日) 15:40:22 ID:5jP5dBFC]
- A has B B has C C has Dのようなクラス構成で
Aで作ったEをDで使うために、Aから呼び出したB、Bから呼んだC、Cから呼んだDのそれぞれの関数の引数に Eを渡していくのはいいのかな?
- 353 名前:名前は開発中のものです。 mailto:sage [2008/08/31(日) 15:45:26 ID:eaWcmeF0]
- いいんじゃね。
- 354 名前:名前は開発中のものです。 mailto:sage [2008/08/31(日) 15:47:56 ID:fQJxWw7j]
- 別に悪くはないと思うよ
Eの役割によってはABCD全てからアクセスできる領域に置くのもアリかもね なんにせよその構成だけじゃいいとも悪いとも言えない
- 355 名前:名前は開発中のものです。 mailto:sage [2008/08/31(日) 15:54:48 ID:5jP5dBFC]
- >>353
>>354 サンクス AからDは直接呼べないけど、Eを使うのはDなので、 AからDにEを渡したいけど、それだけのために間にクラスでEをたらし回しにするのがどうかな〜と 思ったんだよね
- 356 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 03:29:08 ID:m23QvXa7]
- このスレにUMLで図描いて貼っても、きっと誰かが見る前に流れて消えてしまう罠
- 357 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 03:31:07 ID:m23QvXa7]
- >>352 >>355
コンポジッションの視点、あるいはチェインズ・オブ・レスポンシビリティの視点で言えば、 それは普通にアリ。 っていうか、>>354 も言ってるけど、その構成だけだと(意図する形の意味づけが見えないと) 本当はいいとも悪いとも言えないが。
- 358 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 17:16:20 ID:BpB/a+5N]
- CarクラスはTireクラスを4つ持っているとして、
TireクラスもCarクラスを持っていてCarクラスの関数を使えるという設計はいいんでしょうか?
- 359 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 17:22:14 ID:Kf1ObPTz]
- コールバックしたいならインターフェース化してポインタ渡すとよい
TireクラスでCarクラスを生成するとかなら論外
- 360 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 17:30:36 ID:BpB/a+5N]
- TireクラスにCarクラスのポインタを持たせて、Tire生成時とかにCarクラスのオブジェクトのポインタを渡せば
いいということでしょうか?
- 361 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 17:36:03 ID:NydWLubY]
- >>360
Tireが常にCarのポインタを持っている必要もなくて、 CarがTireのメソッド呼び出し時に必要なポインタを渡すのもアリだと思う。
- 362 名前:名前は開発中のものです。 [2008/09/02(火) 17:40:44 ID:IXiySr/S]
- タイヤが車に関心があるってどういう状況?
- 363 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 17:42:28 ID:NydWLubY]
- 「パンクしたよ」って知らせてくれるんじゃね?
- 364 名前:名前は開発中のものです。 [2008/09/02(火) 17:44:29 ID:IXiySr/S]
- なるほど
- 365 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 19:17:31 ID:gmtfIbjx]
- それ車が「パンクしたか?」メソッド持ってるんじゃダメなの?
- 366 名前:名前は開発中のものです。 [2008/09/02(火) 19:20:27 ID:IXiySr/S]
- 車が、常に「パンクしたか?」ってタイヤに聞くの?
- 367 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 19:24:40 ID:gmtfIbjx]
- うん
パンクに限らずあらゆる故障具合をウェルネスシステムが監視しててそいつに聞けば全部OKみたいな 車のメソッドじゃなくなったけど
- 368 名前:名前は開発中のものです。 [2008/09/02(火) 19:38:46 ID:IXiySr/S]
- メディエーターみたいなの?
- 369 名前:名前は開発中のものです。 mailto:sage [2008/09/02(火) 20:44:39 ID:F4HrtZLF]
- >>366
実際のTPMS(タイヤ空気圧監視システム)はそういうものだよ。 ホイールに取り付けられたセンサーモジュールが車両本体側装置と一定時間毎に無線交信してる 具体的には、本体が一定時間毎に圧力値を問い合わせ。センサーモジュールが圧力値を返してる ポーリング処理。 float _pressure = m_wheel[n]->GetPressureState();
- 370 名前:名前は開発中のものです。 mailto:sage [2008/09/19(金) 19:13:57 ID:FmM/zRja]
- ほしゅ
- 371 名前:名前は開発中のものです。 mailto:sage [2008/10/05(日) 14:32:14 ID:tMuqv+yj]
- このスレはJavaでも大丈夫なの?
- 372 名前:名前は開発中のものです。 mailto:sage [2008/10/05(日) 14:52:40 ID:v7IsXRIY]
- >>371
質問内容の分野がよくわからないなら、以下へどうぞ。 【初心者】スレを立てる前にココで質問を【Part17】 pc11.2ch.net/test/read.cgi/gamedev/1210443288
- 373 名前:名前は開発中のものです。 mailto:sage [2008/10/05(日) 17:40:56 ID:6np9SFhP]
- >372がエスパーすぎる
- 374 名前:名前は開発中のものです。 mailto:sage [2008/11/01(土) 11:27:07 ID:g//jQFBy]
- データ(アイテムとかマップとか)ってどうやって作ってます?
エクセルで打ち込んでcsvで保存?
- 375 名前:名前は開発中のものです。 mailto:sage [2008/11/01(土) 12:46:01 ID:YmfIaKZ8]
- 別にそれでいいし
専用にエディタ作ってもいいし ありもので済ませてもいいし 俺はPlatinum map editor使ってるし
- 376 名前:名前は開発中のものです。 mailto:sage [2008/11/01(土) 12:58:04 ID:g//jQFBy]
- >>375
マップに関しては、フリーのエディタがあるんですね。 規模が小さいゲームなら、アイテムとかはエクセルが効率いいのかな。
- 377 名前:名前は開発中のものです。 mailto:sage [2008/11/01(土) 16:47:28 ID:NlVHrve1]
- 既存のマップツールは便利なんだが、結局そこから独自形式へのコンバータを作ってる。
- 378 名前:名前は開発中のものです。 mailto:sage [2008/11/02(日) 08:08:32 ID:JeGt0JB9]
- 海岸線自動生成とかやってくれるエディタあるっけ?
- 379 名前:名前は開発中のものです。 mailto:sage [2008/11/02(日) 09:02:07 ID:i1X6CLvS]
- >378
エディタでやるの?
- 380 名前:名前は開発中のものです。 mailto:sage [2008/11/04(火) 18:29:40 ID:CIBt14+U]
- 機能としてはエディタ側じゃね?
- 381 名前:名前は開発中のものです。 mailto:sage [2008/11/06(木) 00:16:08 ID:46fvhfrF]
- ツクールで海岸線をシフト+右クリックすると分かる
- 382 名前:名前は開発中のものです。 mailto:sage [2008/11/11(火) 20:24:09 ID:rtOtwyEd]
- 最近Gofのデザインパターンを読んで、目から鱗が落ちまくった。
今までぐだぐだやってたのが全部無駄というか馬鹿だったのに気づいてしまった。 他の初心者がこんなことが起きないように、勝手にメモ。 1、相互参照は可能ならば避ける。どちらかが一方的に知り、メソッドでその都度渡すほうがいい。 →クラス図の関連の矢印の向きは重要。関連が1方向なら、関連される(変数として保持される側の)クラスの再利用が容易。 →相互参照関係にあるクラス同士を、一方的な関連にすることは大抵の場合可能なはず。(関連する側が冗長になるが。) 2、再利用を考えたフレームワークは(初心者は)作らない。 →再利用のための部品を作る程度にとどめるのがいい。フレームワークの設計は正直拡張性を考え出すと難しすぎるらしい。 他に鉄則があったらだれか教えてください orz
- 383 名前:名前は開発中のものです。 mailto:sage [2008/11/12(水) 01:30:10 ID:LsEQ4TEa]
- 相互参照すると、クラス開放時にお互いが争ってメモリリークすんだよな
クラスA「Bさん、お先にどうぞどうぞ」 クラスB「いえいえ、ここはAさんがお先に」 クラスA「どうぞどうぞ」 OS「おまえら、どっちもさっさとイケ!」 ピー…
- 384 名前:名前は開発中のものです。 mailto:sage [2008/11/12(水) 09:02:45 ID:QWqH0Tgg]
- > Gofのデザインパターン
GOF本でわかったならよいけど、退屈でわからない人は First Headの本オススメ Head Firstデザインパターン―頭とからだで覚えるデザインパターンの基本: エリック フリーマン, キャシー シエラ, エリザベス フリーマン, バート ベイツ, Eric Freeman, Kathy Sierra, Elisabeth Freeman, Bert Bates, 佐藤 直生, 木下 哲也, 福龍興業: Amazon.co.jp: 本 www.amazon.co.jp/dp/4873112494 images-jp.amazon.com/images/P/4873112494.09.MZZZZZZZZZ.jpg
- 385 名前:名前は開発中のものです。 mailto:sage [2008/11/12(水) 23:23:14 ID:hxIHNKys]
- ライブラリを作るとして、名前空間とクラスはどのように配置するのがいいでしょうか。
たとえば、ある単純な機能のクラスがいくつかあります。 これを集約してより大きな機能のあるクラスがライブラリ内で作られている場合、 1、大きなクラスをネスト先の名前空間に入れる。(HogeLibrary.Composite) 2、小さなクラスをネスト先の名前空間に入れる。(HogeLibrary.SmallComponent) 3、そもそもが間違い。同一名前空間に配置する。 どれが適切でしょうか?
- 386 名前:名前は開発中のものです。 mailto:sage [2008/11/13(木) 21:08:31 ID:3NMFClPL]
- >>385
boostでは、ライブラリ利用者が直接触る必要ないものはdetailっていうネームスペースに入れてあるね。 ってそういう話じゃない?
- 387 名前:名前は開発中のものです。 mailto:sage [2008/11/14(金) 01:18:47 ID:USS/q0/d]
- >>385
名前空間を分けるメリットが見当たらなければ分けないほうがいいでしょ。
- 388 名前:名前は開発中のものです。 mailto:sage [2008/11/16(日) 02:04:27 ID:OW89wflh]
- ライブラリ利用者の立場にたって、
どうなってると使いやすいかを考えて臨機応変に決める。
- 389 名前:名前は開発中のものです。 mailto:sage [2008/11/19(水) 20:47:58 ID:oq/eqnIP]
- >>382-384
まだ読んでいない俺には勉強になったthx
- 390 名前:名前は開発中のものです。 mailto:sage [2008/11/20(木) 09:17:22 ID:jP0yKBYe]
- >>384
のFirst Head本は、読み物形式で 悪いコードをよいコードに変更していきながら、解説しているようになっているので、 GOF本よりかなり読みやすいよ ただ、いくつかのパターンが省略されて適当解説になっているので、注意。 適当になってる後半部分も解説されていたらかなり神本だった (まああのペースで全部網羅すると、値段とページがすごいことになりそうだがw)
- 391 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 20:02:56 ID:GlMxgFAf]
- すいませんというか疑問です。
特定の条件を満たしたら処理(入力の読み取り)を行う、という作業を内部で行う関数を作ろうと思ったのですが、疑問がいろいろ出てきました。 (1回のループの中に複数この関数を配置して、どこかで実際に実行する、というような使い方を想定してます。) 1、この関数を採用する場合、名前の付け方 Polls()、CanPoll()、IsPolling() …主目的が『必要ならば読み取る』なので何かしっくりしない。 2、何かよりよい代替の設計があるだろうか 何か設計が変な気がする、が、なぜそう思うのはわからない。 どなたか導きをお願いします
- 392 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 20:03:41 ID:GlMxgFAf]
- なんかいっぱい改行が入ってるorz
- 393 名前:名前は開発中のものです。 mailto:sage [2008/11/30(日) 20:44:16 ID:O5396ILY]
- >>391
関数の名前は内部での処理なんて割とどうでもいいので、 とにかくその関数の意味(挙動)がわかる名前にしたらいいんじゃね。 ちなみにJavaの場合、キーボードやマウスからの入力によってイベントが発生し、 そのイベントによって適切なリスナーの関数が起動されます。 プログラムの本流が直接読みに行くことなんてしません。
- 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オブジェクトとするとして、オブジェクトの構造およびオブジェクト達の管理方法。 ・敵出現(=ステージ情報)の作成方法、および管理方法や、それにかかわること。(リプレイとか。) ・あるオブジェクトの変数に依存するオブジェクトの管理、依存方法。(耐久力表示、バリア、レーザーなど。) ・オブジェクト同士の衝突判定の記述。衝突判定まで。 ・誘導弾など、常に依存先がかわるオブジェクトの記述方法。 で一通りっぽい。この手順でオブジェクトのインタフェースや管理方法を徐々に改良すると考える。
|

|