ページ 11

ゲームの構成

Posted: 2008年4月13日(日) 15:25
by kazuoni
お邪魔します。
なんだか質問してばっかですみません。。

管理人さんはよくScreenFlip()は一回だけメイン文に書いて、毎回そこを通るようにしたほうがいいとおっしゃっていたんですが、これはゲームプログラミングでは必須ですか?^^;今気がついたら、自分はメイン文以外でwhile文を使用し、その中でScreenFlip()を書いていました。。やはり変えていったほうがいいでしょうか^^;

Re:ゲームの構成

Posted: 2008年4月13日(日) 16:03
by 管理人
私もプロの世界でどのように作られるのが主流なのかわかりませんし、最適なプログラミングの方法も存じませんから、私の我流を、単なる参考としてしかかけないのですが、
それを承知の上でご覧下さい。


画面クリア関数や裏画面反映関数はプログラムの中1箇所で書けばよく色んな場所で書く必要が無いということをはじめ、色んなところでループして、あちこちで処理が返ってこないとバグが出た時に追いにくく、管理がしにくいです。
ブレイクポイントを設定したとしても、それを通らなかったり、一体何処で不具合が出ているのかわからなくなってきます。
小さいゲームではそれが明確に実感できないかもしれませんが、少し規模が大きくなり、運営や常時バグ取りが必須になってくると、あちこちでループしたり、似たような処理が色んな箇所で行われていると、
とてもじゃないけど、効率的にそれが行えません。

それに、「1周に1度この処理を入れたい」と思ったとしても、あちこちにループがあると、その挿入をあちこちでしなければならなくなります。
つまり

ループA

ループB

ループC

メインループ

が合った時、それぞれのループは独立して処理はメインに返ってこないものだとすると、処理1を追加したい時、

ループA 処理1

ループB 処理1

ループC 処理1

メインループ

と追加しなければならず、とても無駄であり、追加ミスも出てくるでしょう。でも、メインループでABCがまわっていれば
処理1はメインループにだけ追加すればよく、便利です。

私は是非ともメインループには必ず1周に1回返って来るようなプログラムをオススメします。

Re:ゲームの構成

Posted: 2008年4月13日(日) 20:46
by kazuoni
管理人さんご回答ありがとうございます!

今自分の書いたコードを見直してたんですけど・・・なんて効率の悪いことを最初しているんだっ・・・って落胆しました^^;ww
一ヶ月前に書いたものがなんだか残念すぎるものだったので、これを機に全体的にきれいにしてきます。flagの使いすぎで、どれがどのflagか究極にわかりづらいです。。

ありがとうございました!またよろしくお願いします。

Re:ゲームの構成

Posted: 2008年4月13日(日) 23:58
by 管理人
フラグはそのフラグごとに構造体にするといいですよ。
それらのフラグはまた更に一つの構造体に纏めます。
するとすべてflag.~~で指定出来るのでカテゴリごとにまとめられますし、
初期化する時はmemsetで全て一気に0に出来るので初期化漏れも生まれません。
例

typedef struct{
  int ○○;
}メニューフラグ_t;

typedef struct{
  int ○○;
}ステータスフラグ_t;

typedef struct{
  int ○○;
}自機フラグ_t;

typedef struct{
    メニューフラグ_t メニューフラグ;
  ステータスフラグ_t ステータス;
  自機フラグ_t 自機フラグ;
}flag_t;

flag_t flag;

こうすればflag.メニューフラグ.○○と指定出来るので、カテゴリわけされて管理でき、便利です。

Re:ゲームの構成

Posted: 2008年4月14日(月) 00:28
by kazuoni
こりゃすごいっ!!ww思いつきませんでした。。

即座に変えます^^

ありがとうございました。またよろしくお願いします。

Re:ゲームの構成

Posted: 2008年4月14日(月) 02:37
by 管理人
おぉ、そんなに驚いてもらえるとは^^;

初期化漏れが起きそうな、初期化する必要のある何か量の多い変数は全て構造体にしてしまえばいいと思います。

更にもっと量が多いものについてはVector等を用いるといいと思います。
これはC++の機能になりますので、STL関係の本じゃないと詳しく載ってなかったりするのですが、
簡単に言うと、配列の長さが自由に調整できるもの、
配列の中に挿入したり、切り取ったり、特定の中身を取り出して後ろから前に詰めてくれたり、自動でしてくれる機能です。

まぁmallocや線形リスト等で自分で実装してもいいと思いますが、こちらの方が処理が早いんですかね・・?詳細はよくわかりませんけど、覚えてしまうと便利です。