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

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

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

関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0741名前は開発中のものです。2008/02/19(火) 22:44:36ID:sVjxRGgG
なるべく一般性の高いゲームの骨作りをしたいんだけど
みんなどうしているんだろう…
CGやBGMのロード、キーチェックをどこで実施すべきか悩んでしまう
↓だいたいこんな感じで組んでいるけど変?
//----main.cpp----
int WINAPI WinMain( ... ){
GameFrame *game = new GameFrame();
game->doMainLoop();
delete game;
}
//---gameframe.cpp---
void GameFrame::doMainLoop();{
loadCG();//ここ?
loadBGM();//ここ?
while(ProcessMessage()==0 && ...){
switch(gameState){
case GAME_DEMO : drawGameDemo ();break;
case GAME_TITLE : drawGameTitle();break;
case GAME_MAIN : drawGameMain ();break;
...
}
...
}

void GameFrame::drawGameMain(){
checKey();//どこに入れよう?
drawBG();
drawEnemy();
drawPlayChara();
drawHoge();
}
0742名前は開発中のものです。2008/02/19(火) 22:58:48ID:kk7YgASy
class Task { public: virutal ~Task() {} virtual void exec() = 0; virtual void draw() const = 0; virutal bool needGC() const = 0; };

void GameFrame::doMainLoop() {
 // シングルトン系の処理実行
 g_pad.exec(); // パッド入力処理
 g_file_loader.exec(); // ファイル非同期読み込み処理
 // その他の処理実行
 std::for_each(m_task_list.begin(), m_task_list.end(), boost::bind(&Task::exec, ::_1));
 std::for_each(m_task_list.begin(), m_task_list.end(), boost::bind(&Task::draw, ::_1));
 m_task_list.remove_if(boost::bind(&Task::needGC, ::_1));
}

こんな感じだと思うが。ファイルの読み込みは Task 派生クラスの exec の中で

TestTask1::exec() {
  switch (m_state) {
  case INIT:
    g_loader.load("file1.arc");
    ++m_state;
    break;
  case LOADING:
    if (g_loader.isLoaded("file1.arc"))
      ++m_state;
    break;
  case MAIN:
    ...
}

って感じで。マジメに作るとファイルは事前にアーカイブ&圧縮しておいて、ロード時に
展開するとか、そもそも名前ではなく #define シンボルで扱えるようにして下らないバグを
出さないようにするとか、断片化防ぐためにメモリのセグメント分割するとか、いろいろ
あるけど。
■ このスレッドは過去ログ倉庫に格納されています