トップページgamedev
1001コメント390KB

ゲームにおけるデータ構造・クラス設計・パターン

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名前は開発中のものです。2006/08/10(木) 20:27:06ID:BnvyxuCB
具体的なゲーム名を挙げて、
どのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。

関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0821名前は開発中のものです。2008/03/07(金) 18:25:22ID:cRszUD3e
俺だったら、自機の基底クラスである(例えば)機体クラスで管理する。

理由は、機体クラスの派生クラスで敵機クラスを作れば、
敵機の溜めショットの実装が楽になる。
0822名前は開発中のものです。2008/03/07(金) 19:30:11ID:ZcSmZqCn
おおむね>821に同意しつつ、自分なら、キーの押しっぱなし時間も同時に保持しておくかな。
溜めショット以外にも使うこと多そうだし。

カーソルとか、ポンと押した場合は1つ進むだけだけど、押しっぱなしにすると自動的にカーソルが動くとか、
そんな類の処理に流用できそう。
0823名前は開発中のものです。2008/03/07(金) 19:36:59ID:i2RlFGNS
>>820
void 機体クラス::update()
{
 if (joypad1.getOnf() & BTN2) // getOnf() はボタン押し下げてれば真
  m_shot2.Charge();
}

俺なら、こうするかなぁ。機体クラスのメンバ変数に溜めショット用の
メンバ変数を持たせる。

キー管理クラスというのが何を意図してるのかわからんけど、汎用の
パッド入力処理関数として

enum { BTN1 = 0x1, BTN2 = 0x2, BTN3 = 0x4, BTN4 = 0x8, ... };

getOnf(); // 押し下げボタンの論理和が返る
getTrg(); // 直前まで放されてて、このフレームに初めて押し下げられたボタンの論理和
getRep(); // 一定時間以上押しっぱなしのボタンの論理和

ぐらいは用意しておいた方が便利だよ。
08248202008/03/07(金) 23:07:06ID:1kJAWqPN
>>821-822
有難うございます。その方向でちょっと作ってみます。
08258202008/03/07(金) 23:26:54ID:1kJAWqPN
>>823実は自作で汎用のパッド入力処理関数のようなものを作ってあったんですが
ちょっと出来に難があります。
1回のメインループで2回使用、例えばKEY_DOWNとKEY_UPの2種類を検出しようと
したりすると1種類目の呼び出ししか有効でなかったり。
enum BTN_STATE{ NO_PUSH, KEY_DOWN, KEY_PUSH, KEY_UP };
//「押されていない」「押下げた瞬間」「押されている状態」「押上げた瞬間」
class JoyPad{
 int isPushDown[2][8];//[パッド1P、2P][ボタン数] (各ボタン押されているか否か)
public:
 BTN_STATE getBtnState(int pad_num, int btn_num );
}

BTN_STATE JoyPad::getBtnState (int pad_num, int btn_num ){
  int btn = ボタンが押されているか?関数( pad_num, btn_num );
  if ( btn == 1 ) {//ボタンが押されていたら
    if ( isPushDown[pad_num][btn_num] == 0){
    isPushDown[pad_num][btn_num] = 1;
    return KEY_DOWN;//「押下げた瞬間」
    }else{
    return KEY_PUSH;//「押されている状態」
    }
  }
  if ( btn == 0 ) {//ボタンが押されてなければ
    if(isPushDown[pad_num][btn_num] != 0){
    isPushDown[pad_num][btn_num] = 0;
    return KEY_UP;//「押上げた瞬間」
    }
  }
return NO_PUSH; //「押されていない
}
0826名前は開発中のものです。2008/03/07(金) 23:36:57ID:6HaqHq5U
状態を管理する部分と、管理されてる情報を参照する部分を分ければいいんじゃね?
0827名前は開発中のものです。2008/03/07(金) 23:39:41ID:cRszUD3e
Win系ならWindowメッセージかDirectX使え。
0828名前は開発中のものです。2008/03/07(金) 23:54:13ID:2OqKUBaL
>>825
>>826も言ってるが
それぞれの状態について保存しておいて、それを参照すればいいじゃん

現在の状態をcurrentに0,1で保存するとして
押下した瞬間 on_trigger = (on_trigger ^ current) & ~current
離した瞬間 off_trigger = off_trigger ^ (^current & last)
過去の状態 last = current
08298202008/03/07(金) 23:56:56ID:1kJAWqPN
>>826
ちょっと考えて見ます
>>827
使っているのが「DXライブラリ」というDirectX用ライブラリなんですが押している状態しか
チェックできなくて難儀しています。
直接DirectXガリガリした経験がないのでわかりませんがWindowメッセージの
WM_KEYDOWN, WM_KEYUPに相当するものがあればその方が楽できそうですね…
0830名前は開発中のものです。2008/03/08(土) 00:15:59ID:XxYr3Sol
DXライブラリってのは名前くらいしか知らんが、
1フレーム内にon/offがあった場合検知できないのかねぇ?
(FPSを上げれば解決できそうな問題だと思うけど)

DirectXは(デバッガで止めるなどして)1フレーム内に複数の入力あっても、
全部取得できると思った。でもDirectXはその性質上最低レベルAPIだから、
DXで済ませるならDXでやったほうがいいんじゃないかな…
0831名前は開発中のものです。2008/03/08(土) 08:33:18ID:L6W8V7J1
stateパターンか
0832名前は開発中のものです。2008/03/08(土) 09:13:25ID:S4+z8pGt
DXライブラリの中の人もチラと言ってたけど、そのまま使わずに、自分でラップして使った方がいいんじゃないかな?
低レベルな部分を隠すだけ、って割り切っちゃう。
0833名前は開発中のものです。2008/03/13(木) 01:35:23ID:+x1fkFDE
>>828
横レスすまん。
たぶん俺が根本的に何かを勘違いしているんだろうけど、
どう考えても意図がわからない。

押下した瞬間 on_trigger = current & ~last
離した瞬間 off_trigger = ~current & last
ほんとはこう?

「C,C++じゃねーよ」ってのならごめん。他の言語はわからない。
0834名前は開発中のものです。2008/03/13(木) 10:23:04ID:QxqUuAIc
素直にifを使うっていうのはどうだろうか。
0835名前は開発中のものです。2008/03/13(木) 22:39:59ID:Bu/r75Um
そういうことだな
0836名前は開発中のものです。2008/03/17(月) 12:58:49ID:bgIcAWWo
最近デザインパターンを覚え始めたんだが、
oopのコンポジション集約と、デザインパターンのコンポジットは全然別なことと、
デザインパターンのファザードがコンポジション集約と似た効果/構造してて戸惑った。

この違和感は普通にそのうち無くなるもの?
0837名前は開発中のものです。2008/03/17(月) 14:16:30ID:hf8pDjO+
デザインパターンか…
そろそろ俺も覚えないと不味いな
0838名前は開発中のものです。2008/03/17(月) 21:06:48ID:I1kfClSU
あんまりデザインパターンでゲーム設計しちゃうとデザインパターンにはめようとするからゲームではあまり使わないな。

ストラテジー・コマンド・ステートパターンはよく使うが。

デザインパターンって言ってもgofやgof以外やマルチスレッドなやつとかwebアプリケーション用とかいろいろあるよ。
0839名前は開発中のものです。2008/03/17(月) 21:46:13ID:6v9SY+1b
>>838
あと、これも多少使うかなぁ。

・シングルトン ファイル I/O を一括管理するときとか
・オブザーバー 関連するゲームオブジェクト同士の管理(プレイヤーと、それに張り付くエフェクトとか)

実際のコードは、GoF のサンプルとはだいぶ違う形になってるけど、
まぁデザパタは設計のカタログなんで、実装の見た目が乖離する
ことはよくある。
0840名前は開発中のものです。2008/03/17(月) 23:00:08ID:81oeEqxB
オブザーバーっていうよりフックパターンがオブザーバーになってる事ない?
0841名前は開発中のものです。2008/03/17(月) 23:20:40ID:hf8pDjO+
>>838-839
勉強になるよthx
まだGOF読んでないから今の段階ではさっぱりわからんけど
読むときに思い出すようにするよ
0842名前は開発中のものです。2008/03/22(土) 13:55:51ID:bw12F9FG
GOF本高けぇえええ!!
0843名前は開発中のものです。2008/03/22(土) 20:22:05ID:gzkziAGJ
GoFを中心に解説してる本ならいくつかある。javaが多いけど。
0844名前は開発中のものです。2008/03/22(土) 21:20:08ID:DCoIdvPZ
Grove On Fight?
0845名前は開発中のものです。2008/03/22(土) 21:55:21ID:qUFi6y55
glove on fight

でしょ
0846名前は開発中のものです。2008/03/22(土) 22:34:31ID:bw12F9FG
>>844
o がいっこ足らんぞ
Groove on Fightは名作
0847名前は開発中のものです。2008/03/23(日) 01:18:27ID:Dg07h3ZN
しかしPS版豪血寺は戦闘中に長いロードが入るという糞仕様
0848名前は開発中のものです。2008/03/23(日) 11:58:11ID:3+fyKl7y
Gang of Fourも知らんのかここの連中は
0849名前は開発中のものです。2008/03/23(日) 12:20:13ID:GdFVK2/8
ググって出てきたものを、知ったかぶりで書いたんだろうなぁ…
0850名前は開発中のものです。2008/03/23(日) 12:56:06ID:2zNLBPZ3
>848も言ってることは大して変わらんだろw
0851名前は開発中のものです。2008/03/23(日) 18:28:12ID:4ckcNna2
Glove on Fight・・・同人ゲー
Groove on Fight・・・豪血寺3のサブタイトル
Grove On Fight・・・俺のミスタイプ
0852名前は開発中のものです。2008/03/23(日) 20:57:34ID:dUwevhCK
デザインパターンも知らんで設計語ってんのか
0853名前は開発中のものです。2008/03/23(日) 21:19:48ID:PfMuEor5
めったに使えないGoFのやつか
0854名前は開発中のものです。2008/03/23(日) 21:23:02ID:QBAbg4un
継承イラネ
と思う俺はたぶんまだまだ
0855名前は開発中のものです。2008/03/23(日) 22:08:36ID:oa0oVRXo
そりゃあゲームでGoFなんて使わんだろ。上に出た通りだ。
0856名前は開発中のものです。2008/03/23(日) 22:14:12ID:t1TOnFxg
>>854
基本クラス変数に派生クラス実体が入ってる時に関数を呼ぶと、
もし派生クラスがその関数をoverrideしてたら派生クラスの関数が呼ばれるんだぜ。
便利だと思わん?
0857名前は開発中のものです。2008/03/23(日) 22:22:19ID:Oei8nD2Z
仮想関数ならな。
0858名前は開発中のものです。2008/03/23(日) 22:28:35ID:UjPr9gEx
>>855
上に出たとおりだと、

いくつかのパターンは使ってる
ただし実装は書籍と違うけど

だと思うんだが。読み間違い?
0859名前は開発中のものです。2008/03/23(日) 22:51:49ID:t1TOnFxg
>>857
自分の中で、仮想でないメンバの上書きはシャドウで、オーバーライド=仮想メンバの上書きだと思ってた
0860名前は開発中のものです。2008/03/23(日) 23:11:46ID:QBAbg4un
>>856
そういうことができるのは知識としては持っているんだけど

例えば
モンスタークラスの派生でスライムクラス、ドラゴンクラスがあって…
とやらないで

モンスタークラスだけがあって
モンスタータイプっていうenumメンバ変数があってそれによって処理が変わる…
みたいに書いちゃうのね

まだまだスクリプト言語のときの癖が抜け切らないというか
たぶん継承をうまいこと使った方が生産性上がるんだろうけど
0861名前は開発中のものです。2008/03/23(日) 23:22:02ID:2zNLBPZ3
例えに突っ込むのは無粋だとは思うが、
外部ファイル読み込み(ハードコーティングでもいいけどさ)を考えると面倒じゃない?
0862名前は開発中のものです。2008/03/23(日) 23:40:01ID:QBAbg4un
>>861
ごめん。今の自分のレベルでは
継承だと外部ファイル読み込みが楽になる理由がよくわからない。
0863名前は開発中のものです。2008/03/23(日) 23:42:50ID:/kBQhQQw
スクリプト言語を使ってたときの癖とか
ノウハウとか捨てずに大事にするよろし

C++だのJavaだのC#だの使っても
最終的にはスクリプトなりテーブルなりで
キャラデータを管理することになるから
そんときに経験は生きるぜ

継承大好きっ子にありがちなハマリ道は
何でもかんでもソースに(ハードコーディングで)
記述してみたりクラス分けしてみたりして
結果として異様に複雑で深い継承木を
こさえて、仕様変更時の手間の多さに
戦慄して初心に返ること
0864名前は開発中のものです。2008/03/23(日) 23:58:07ID:VUhk8OhJ
継承って、外部ファイル読み込みを外部データベース読み込みに変えるとき楽になるとか
そういう使い方をするものだと思っていた。
今は>>860のスライムクラスみたいな継承の使い方をするの?
データに当たるような部分をコードに絡ませるのはなんか抵抗があるんだが。
08658612008/03/24(月) 00:07:17ID:tkEWMZpB
>863
言語仕様には開発者の哲学が詰まってるからなあ。

>864
俺の分かりづらい文章(>861)の翻訳dクス
08668622008/03/24(月) 00:11:51ID:KE3DiPkZ
>>864
なる。
ちょっとわかったような気がする。
08678622008/03/24(月) 00:21:04ID:KE3DiPkZ
いや、ごめん。
やっぱわかんね。

>>856風の継承が>>860みたいな感じかと思っていたんだけど(違ってたらスマン)
そういう継承の仕方は主流じゃなくて
>>864風の継承(どういうクラス構成なのかはイメージがわかないけど)のが主流なのかな?
0868名前は開発中のものです。2008/03/24(月) 00:21:28ID:uZDK8kFU
>>863
実装継承を適当に使うと、そうなりがち。

インターフェース継承は、設計しっかりしてれば問題ないでしょ。
0869名前は開発中のものです。2008/03/24(月) 00:22:39ID:Yr94LLRU
>>864
いや、リア厨のときに俺はそれ(>>863)やって
ゲロ吐いたの

でも継承木ビューワの眺めは壮観だったよ
オナニープログラミング
08708612008/03/24(月) 00:35:53ID:tkEWMZpB
>867
あくまで、RPGっぽい敵のデータを例として挙げたから、それに対してのツッコミってことね。
他のところで使う分には知らん。

で、だ。
RPGを作ったことがないアマチュアの意見なんで、聞き流すだけでいいんだが。

敵データを外部ファイル読み込みで作るとする。
敵の動きを変更したり、敵の種類を増やしたいと思った時は、当然そのデータを弄ることで対応するわけだ。

敵のデータを変えるたびに、ソースコードの中のクラスを書き換えるのか?
敵の種類を増やしたら、派生クラスを動的に生成するのか?
そういうこと。
0871名前は開発中のものです。2008/03/24(月) 00:42:36ID:nPahSoi8
>>869の継承図が見てみたい。自分も最初のころやって破綻したw
まあ多くても3回以上は継承したくはないよな

キャラ>モンスター>種族特性>個々のモンスター は既になんとやら

>>870
外部ファイルを作らず未だにステータスの固有値を派生クラスに直接書き込んでる俺はどうすrb・・・
0872名前は開発中のものです。2008/03/24(月) 00:46:42ID:uZDK8kFU
>>870
RPGだと、

struct IEnemy;
class EnemyBase : public IEnemy {};
class EnemyBase : public EnemyBase {}; // 敵ザコクラス
class EnemyBoss1 : public EnemyBase {}; // 敵ボス1
class EnemyBoss2 : public EnemyBase {}; // 敵ボス2


って感じにするな。

ザコは全部一つのクラスで、データファイルとスクリプトで駆動。ボスは
プログラムでの特殊処理が必要なら、個別で作る。
0873名前は開発中のものです。2008/03/24(月) 00:59:42ID:tkEWMZpB
>872
その辺は柔軟に、ってことね
08748622008/03/24(月) 01:09:59ID:KE3DiPkZ
>>870
えーと…
ごめん。なんか混乱してきた。
自分が何か読み違えているのかもしれないけど

>>864>>861の翻訳であるとあったので
>>864に書いてあることを
「モンスター の 派生で スライム みたいな(哺乳類 の 派生で 犬 みたいな)
 クラスの構成は間違っている。
 外部データを読み込む際に便利なるような継承の仕方が実はあるよん。」
―と解釈したんだけど誤解している?

で、>>870を読むと「継承なんて使わずにデータを弄ることで挙動を変えるんだ」
と解釈したんだけど、それだと>>864の主張と矛盾するのでアレ??と思った。

どっちを勘違いしているんだろう俺は。
0875名前は開発中のものです。2008/03/24(月) 01:23:08ID:tkEWMZpB
矛盾してるように思えないんだが
0876名前は開発中のものです。2008/03/24(月) 01:33:58ID:KE3DiPkZ
>>875
読み違えてはいないけど矛盾もしていない?
余計にわからなくなって混乱してきたので一晩寝て考えてみる。
色々有難う。
0877名前は開発中のものです。2008/03/24(月) 01:41:01ID:tkEWMZpB
>876

>864氏の主張を僕なりに解釈

●前半
敵データを記述するにしても、
テキストファイル(CSV)の場合もあれば、バイナリデータの場合もある。
ゲームによっては、ネット越しにデータベースへアクセスするかもしれない。
そういう部分を汎用的に書くのに継承は有効。

●後半
スライムとスライムベスとホイミスライムとドラゴンとオオアリクイと彷徨う鎧とで
いちいちクラス作ってたら一生終わんなくね?
0878名前は開発中のものです。2008/03/24(月) 08:29:41ID:lmwW1pW4
864だが、なんかいろいろと混乱を招いたようですまん。そしてさらに混乱させるのだが……


自分自身の意見としては>>877の通りなんだが、
種類ごとにクラスを作るような継承の使い方が全く見当がつかなかったので質問させてもらった。

本気で全種類分クラスを作るのか、
それともスライムとスライムベスはスライムクラスにまとめてしまうのか、
その場合出現テーブルなど外から参照するときはどうするんだ(クラス名?)とか、興味が尽きない。
実際どうやるんだ?

>>872のはどちらかというと戦闘時イベント(HP半減で台詞とか死亡エフェクトとか)など特殊処理を意識したものだと思うので
>>869の話を聞いてみたい。
0879名前は開発中のものです。2008/03/24(月) 12:03:07ID:nPahSoi8
集約とかせずに強引に継承で表そうとするとそうなるんじゃね。
と869ではないが予想
0880名前は開発中のものです。2008/03/24(月) 14:53:51ID:GL5PdgnZ
オナニーの話
クラス分けして幾つもの「科」を作り、何十もの「目」を作った
そして何百もの「種」を作ろうとしたとき、僕は秀丸のマクロで
大量のクラス(hpp、cpp)を作っていた

何かを間違えていることに気付き始めたのはその時だった
あれは14歳の夏休みでした
0881名前は開発中のものです。2008/03/24(月) 14:58:03ID:kALgXEvY
14歳か… その時、俺は何やってたかなー。6001とか叩いてた気がする。
0882名前は開発中のものです。2008/03/24(月) 15:00:11ID:GL5PdgnZ
>本気で全種類分クラスを作るのか

本気で作ったよ。リビルドにかかる時間の長さに興奮した
0883名前は開発中のものです。2008/03/24(月) 15:00:26ID:T1jBR36A
C#でモンスターの基底クラス作って
IronPythonでスライムクラスとか全部継承で作ったら面白いかも
0884名前は開発中のものです。2008/03/24(月) 15:09:53ID:ajtWFMqv
strategyパターンオヌヌメ
0885名前は開発中のものです。2008/03/24(月) 16:18:36ID:gcKvtXCR
>struct IEnemy;
>class EnemyBase : public IEnemy {};

まだこんな命名規則使うやつ居たのか
0886名前は開発中のものです。2008/03/24(月) 16:25:13ID:kALgXEvY
>885
おまいは 変数hoge や Func()関数にまで突っ込むのか
0887名前は開発中のものです。2008/03/24(月) 18:49:57ID:lmwW1pW4
>本気で作ったよ。リビルドにかかる時間の長さに興奮した
ひさしぶりに勇者を見た。

>>883
行動パターンとかをスクリプトにして外出しにするわけか。
でも動的に作成するのはなんだかコストが高そうな気がする。
08888722008/03/24(月) 21:24:32ID:KE3DiPkZ
うん。一晩寝て考えが纏まった。

昨日のあらすじ
>>864継承使うよ(外部データ読み込むのにね)
>>870継承使わないよ(外部データで弄えばいいじゃん)
>>874(俺)矛盾しているやん!どっちやねん!?
>>875矛盾してるように思えないんだが
>>876(俺)え?!!


↑は置いといて取り敢えず1番の疑問の解消から…
>>864
>継承って、外部ファイル読み込みを外部データベース読み込みに変えるとき楽になるとか

ごめん。この継承の使い方、どんな使い方なのかまるで想像できない。
どんなの?
0889名前は開発中のものです。2008/03/24(月) 22:09:39ID:kALgXEvY
できれば、せっかく俺が書いた>877を読んでくれるとありがたいんだが。
08908722008/03/24(月) 22:16:59ID:KE3DiPkZ
ああ、もちろんちゃんと読んでいるよ。
0891名前は開発中のものです。2008/03/24(月) 22:45:28ID:kALgXEvY
いや、読んでたら>888の発想は出てこないだろ?
08928722008/03/24(月) 22:48:16ID:KE3DiPkZ
悪い。マジですまん。理解力なくて。
もうちょっと考えてみるわ。
0893名前は開発中のものです。2008/03/24(月) 22:56:35ID:kALgXEvY
まず

 >>864継承使うよ(外部データ読み込むのにね)
 >>870継承使わないよ(外部データで弄えばいいじゃん)

この時点で間違えてる。
08948722008/03/24(月) 23:01:16ID:KE3DiPkZ
>>893
うん。たぶん自分が曲解しているんだろうと
そう思って>>874を書いたんだけど
>>875で矛盾していないっていわれたもんで
>>876 え、別に読み違えていないの?に到って
>>877読めば>>888にはならんだろと言われて余計に????
0895名前は開発中のものです。2008/03/24(月) 23:23:01ID:kALgXEvY
お前はまず落ち着けw

>894の疑問に関してだけ言うとだ。
>874と>888とでは、お前さんの言ってる内容が異なる……と、自分は感じた。

>874の文章を読んだ限りでは、ちゃんと理解しているように見える。
>888は間違って理解しているように見える。



>864は
・データの読み込み方法(外部ファイルとかデータベースとか)については、派生クラスを作るべき
・データだけが違うオブジェクトについて、いちいちクラス分割するのはどうなんよ? 正しいの?(疑問系)
の2点について述べている。
具体的には>877を参照してほしい。

>870は
データが違うだけのオブジェクトについて、クラスを分けるのは最適ではないのでは?と述べている。
データの読み込み方法については何も述べていない。

よって、両者は矛盾していない。
08968722008/03/24(月) 23:54:26ID:KE3DiPkZ
>>895
おけ。落ち着いたw
やっと謎が解けた。
俺が単純に 「継承使う」←→「継承使わない」で相反していることをいっているように
感じて何故かそこに噛み付いて「矛盾している!」叫んでいただけで

ずっと
「外部データの読み込みの為には派生クラスを作るけど、
 データの違いで吸収できるようなことにまで派生クラス作ってどうすんの?」
って主張してるだけで別に矛盾なんてしてねーじゃん
―と。

うん。それなら問題ない。確かに自分は読み違えてはいなかった。
変な方向にこだわって混乱させてスマン。
元々>>860でいうように継承使わない派だからクラスをうじゃうじゃ派生しない方が
良いのはわかるし。

残る疑問は「外部データを読み込みを楽にするために派生クラス」ってやつ。
これ、さっぱり実現方法がわからない。
0897名前は開発中のものです。2008/03/25(火) 00:54:06ID:MCdo/Bj3
えー?
インターフェースさえ揃えておけば
差し替えが楽になるってだけの話でしょ。

virtual void Img::Load(DestPtr* dst, FilePtr* src);
を継承したクラス郡
void Jpg::Load(DestPtr* dst, FilePtr* src);
void Png::Load(DestPtr* dst, FilePtr* src);
void Gif::Load(DestPtr* dst, FilePtr* src);
を作って差し替えるのが楽ってだけの。
08988722008/03/25(火) 01:22:10ID:kctvHJ5z
>>897
有難う。
説明するまでもないほど常識的なやり方なのね。
勉強不足ですまん。勉強になった。
ファイル形式が違うのを読み込むときに記述が楽出来るのね。
0899名前は開発中のものです。2008/03/25(火) 01:41:22ID:8j9nw6j1
RPGなんてデータ駆動の典型だろ・・・
0900名前は開発中のものです。2008/03/25(火) 02:09:10ID:+wFlCySY
落ち着け。
お前は本当に872か?w
09018722008/03/25(火) 02:11:16ID:kctvHJ5z
>>899ごめん
そもそも>>860でRPGを例に出したのが間違いだった。
敵の名前を皆が知ってるゲームでぱっと思いついたので安直に選んだ。
今思えばスーパーマリオの方が例としては良かった。

継承アレルギーの自分ならENEMYクラスひとつだけにして
全部データの違いで吸収するかなと。

ゲーム制作中にメットっていうファイヤーボールの効かない亀を思いついたとしても
ノコノコからの特化キャラとして派生させたりせずに
メンバ変数fireArmorを追加してメット以外のキャラを0に設定するかな。
09028722008/03/25(火) 02:13:27ID:kctvHJ5z
>>900
>>898の書き込みのこと?
俺また何か変なこと言ってる?
0903名前は開発中のものです。2008/03/25(火) 03:09:13ID:GnFPDA7U
ゲームルールとか現実世界に複数の同種に思えるものが見出せるから
という理由で継承の木にあてはめてしまうのはダメだよ
ていうかそんなのならやらない方がいいswitch文でよろしい
インターフェイスやスーパークラスを使う側に何が必要かということ
隠蔽のニーズのほうを第一に考えるべき
0904名前は開発中のものです。2008/03/25(火) 06:25:37ID:lx9o+WS2
君は872ではなくて862だと思うんだ。
0905×872 ○8622008/03/25(火) 10:48:21ID:kctvHJ5z
>>904
ほんとだ。スマン
0906名前は開発中のものです。2008/03/25(火) 14:06:40ID:OGAdbkNY
可愛いやつめw
0907名前は開発中のものです。2008/03/25(火) 21:21:33ID:AbKMyTJI
お前ら、委譲を使えよ。

継承は多態が必要なときにしか使わないな。
0908名前は開発中のものです。2008/03/25(火) 22:47:32ID:qKRP+2ua
継承より委譲を使えという文句が結構有名なためか、
委譲の形に書き直す際に、書き直す前の委譲元オブジェクトの継承関係を
委譲先オブジェクトがそのまま引き継いでしまうようなソースを書いても
何の疑問も持たない奴が意外と多いから注意な。
どの部分を委譲すればよいか、粒度は適切かどうかを見極めたうえで
コーディングすべき。
0909名前は開発中のものです。2008/03/25(火) 23:18:21ID:k9P0z5/O
当たり前のことだと思うんだが
0910名前は開発中のものです。2008/03/26(水) 00:49:14ID:WLaSa3Gs
よくよく考えれば当り前なことを
当り前だと認識する(定石・パターンを共有する)のが
設計・パターンの学習の第一歩なわけだから、
>>909は最も必要な思考ではあるが
最もレスしてはいけない文章でもあるな。
0911名前は開発中のものです。2008/03/26(水) 05:21:20ID:AnrQAT7U
ようは継承元の機能を手っ取り早く取り込む目的で継承をつかうな
ということだよ
そういうローカルな問題を解決するのに使ってしまうと
もっと大局的な構造を記述するために使われている継承との一貫性がなくなる

名前のつけ方からして一貫した目線であるべきなんだよ
ゲームを作ってる俺達はApplicationやSystemやEngineって呼べる一番高い位置から
見ているのだから敵キャラをEnemyと呼ぶのはおかしいよ
こんなのたまたまプレイヤーに敵対的なAIが乗ってるだけのゲームオブジェクト
に過ぎないんだから

データの入出力の種類どうこうはそんなの多分インスタンスが生成される必要も
ないんだろうからswitch文かなにかで書けば充分
「現実世界ではこれは〜の一種類とされています」なんてのを継承で
示してみせたところで後で見たとき何の役にも立たないわけだよ
0912名前は開発中のものです。2008/03/26(水) 08:27:56ID:WLaSa3Gs
>>911
Enemyクラスを作ろうが、一ゲームオブジェクトの処理内容をベタ書きしようが、
どちらもApplicationが敵を直接意識して操作しているという悪例に他ならず
そういった意味で両者の違いなんてほとんどないに等しいから
「現実世界のものどおりに継承関係構築するのは無意味だ」という主張の
引き合いとして「名前の付け方からして〜」以下の文章を出すのは
あまりにも不適当で意味不明。
0913名前は開発中のものです。2008/04/08(火) 17:58:37ID:o8llBZSA
ADVやRPGでシナリオの流れを状態で切り分けすることが多いと思います。
「1回目にここへ来たときはこっちのシナリオ、2回目以降はこっち」
「○○のアイテムを持ってるときに○○を調べるとこっちのシナリオ」
「○○への好感度が80以上のときに話しかけるとこっちのシナリオ」
様々な切り分け方があると思うのですが、そういう条件式とルートを
統括的に扱えるような設計というかやり方ってあるのでしょうか。
今やってるのはもうごちゃごちゃで、テストが不安で仕方ありません…
0914名前は開発中のものです。2008/04/08(火) 22:19:28ID:XhbGzrYy
ADVなら、シナリオがツリー構造になってたりグラフ構造になってたり
いろいろなタイプがあると思うけど、それぞれのシーン内の分岐は
基本的にはif分の羅列になると思うんだ

あとこういう枯れたジャンルなら既にある優秀なツール、例えば
RPGならRPGツクールを、ADVなら吉里吉里とかNスクを
それぞれ参考にするといいんでねの

サンプル見たりチュートリアルに沿って使ってみたりすれば
イベントの基本構造とかが何となく見えてくるぞ
0915名前は開発中のものです。2008/04/09(水) 10:51:18ID:2MmRi2Sh
>>913
基本的には if 文の羅列だけど、たとえば RPG なら

・基本となるスクリプト

を用意しておいて、その上で条件が成立したときだけ
オーバーライドする内容を列挙した

・派生スクリプト

を上にかぶせるような作りにしておくと、多少は管理が楽になる。
0916名前は開発中のものです。2008/04/12(土) 15:28:03ID:yutaDgBe
>>913
ちょっと考えたけど難しいわ。降参。
とりあえず綺麗にソースを書いといて。
シナリオそれぞれに分かりやすい名前付けといたがよさそうね。
300件以上とかあるだろうから、どうやって名前付けるんだろう・・・
0917名前は開発中のものです。2008/04/12(土) 21:03:35ID:JhGNA0fR
913のような問題は、構造化プログラミング的なコードだけで実現しようとすると
if文の羅列で凄まじいネストになってしまったりして見難くなるんだろうなぁ。
まぁそういう制御の部分を、コードではなくスクリプトでなるべく見易くするってのはいいよね。
これらの方法は、全ての状態をグローバルなフラグなどで管理することになるのだろうから
セーブやロードとかの処理は、結構簡単で良さそうだね。

915のいうような感じで、条件や処理を一つのオブジェクトに見立てて
それらを動的に拡張していくような構造なら、いままでのフラグ的なものを
上手いこと隠蔽化してくれそうに思うので、一歩進んでいると感じるなぁ。
ただこれは、とあるポイントに複数の拡張が生じる場合を考えると、
優先順位が必要になると思うので、そこは考慮しないといけないね。
場合によっては一つの拡張の優先順位が複数存在することもありそうだし、
拡張の呼び出し元を拡張要求ってなものにして、それに優先順位と実拡張への参照を持たせるといいのかな。
あと現在の拡張状態をセーブするのがちょっと面倒なのかなって思う。
0918名前は開発中のものです。2008/04/12(土) 21:12:31ID:mZOjOCQT
シナリオ構造をグラフにして、ステートマシンで管理すればOK
0919名前は開発中のものです。2008/04/12(土) 21:40:58ID:mVEHbkLg
>>917
> 優先順位が必要になると思うので、そこは考慮しないといけないね。
実際には、ほとんど必要ない。そこまでやると、シナリオ担当がついてこられなく
なるから。
0920名前は開発中のものです。2008/04/12(土) 22:32:44ID:arZb3bS0
>>918
ステートマシンって一般的な単語なのかな
波動やってないとたぶん分からないきもするが

でもそんなににきがつくならこんなアホな質問はせんか
スクリプトだろうがコードだろうがっどっちも同じプログラムであって根本の話ではないし
レス数が900を超えています。1000を超えると表示できなくなるよ。