ページ 11

C++でのゲームプログラミング設計について

Posted: 2012年3月15日(木) 19:25
by jinten
初めまして、自分はC++を勉強しようと思い、クラスについてチマチマと手を出しています。

ゲームプログラミング設計において、モジュール単位での処理は分かるのですが、C++でそれを実現しようとすれば、
オブジェクトのインスタンス化は何処で行えばよいのでしょうか?

一応、ゲーム作成を目指していますので、ゲームループの外・・・WinMain関数の直後で宣言して、ポインタ引数でクラスのアドレスを渡し、
その先の関数でクラスのメソッド扱うのか、それともヘッダーでグローバルとしてインスタンス化し、mainでは実体として・・・他ファイルからはexternで呼び込むような方法なのでしょうか?

グローバルのインスタンス制御に関しては、「龍神録プログラミングの館」様で説明されていた「プリプロセッサ」を使用した制御を参考にさせてもらっています。
#ifndef GV_INSTANCE
#define GV
#else
#define GV extern
#endif

プレイヤーの情報(座標やHP等)を保持したまま、インスタンス化したオブジェクトを、どう扱えばいいのか分からなくて・・・

分かりにくい説明でスミマセン・・・。お暇であればご教授の方、是非お願いいたします。m(_ _;)m

Re: C++でのゲームプログラミング設計について

Posted: 2012年3月15日(木) 20:11
by とっち
「龍神録プログラミングの館」のような書き方はオブジェクト指向ではなく、あまりよい書き方ではありません。
c++でclassを使うのであれば全く別の方法をとるべきです。

僕も独学ですので、あまり自信はありませんが、

コード:

// testというクラスで考えてみる

// test.h
class CTest{
   int num;
public:
   CTest();
   void show();
};

// test.cpp
#include "test.h"
CTest::CTest(){
   num=0;
}

void CTest::show(){
   printf("%d",num);
}

// main.cpp
#include "test.h"

int WinMain(略){
   CTest *t;
   // 初期化とかするとこ
  t=new CTest();

   while(略){
      test->show();
   }
}
みたいな感じで書けばよろしいかと思います。

Re: C++でのゲームプログラミング設計について

Posted: 2012年3月15日(木) 20:40
by jinten
ご返信ありがとうございます。

やはり、グローバルではなくポインタでの渡し合いになるのですね。
引数が長くなるのを避けために、構造体もしくはもう一つのclassでclassをまとめるといった手法はOKなんでしょうか?

もちろん、保持しなくてもいいメンバ変数を持つクラスは、ローカル関数のスコープ内でインスタンス化して使用します。
敵や味方等の永続的に使用するようなパラメーターを持ったclassは、やはりWinMain直下で宣言し、あとはポインタでの引き渡しで管理するのでしょうか?

Re: C++でのゲームプログラミング設計について

Posted: 2012年3月15日(木) 21:34
by softya(ソフト屋)
龍神録の下の方に、四聖龍神録plus次回作のソースコード(C++)をDixq(管理人)さんが公開されていますので参考にされてはどうでしょうか?
http://dixq.net/rp/
龍神録と違い完全にオブジェクト指向で書かれていますので答えの一つにはなると思います。

[追記]
やはり、グローバルではなくポインタでの渡し合いになるのですね。
引数が長くなるのを避けために、構造体もしくはもう一つのclassでclassをまとめるといった手法はOKなんでしょうか?
なんでも引数の構造体にまとめるのはグローバル変数と変わらないので避けたほうが良いでしょう。
グローバル参照の害は誰(どの関数)が更新しているのか分かりづらいことです。
何でもかんでも引き渡してやるとグローバル変数と変わらなくなってします。

Re: C++でのゲームプログラミング設計について

Posted: 2012年3月15日(木) 22:02
by jinten
C++でのオープンソースがありましたか・・・何とか理解できるくらいの知識を身に付けて拝見させていただきます。

また一つ知識が深まりました。ありがとうございます。m(_ _)m