敵のクラス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
inpure

敵のクラス

#1

投稿記事 by inpure » 14年前

C++で3D物のアクションゲームを作っています
敵に関してつまづいたので質問させて頂きます

とりあえず簡易的なコードです

コード:

// main.h
// 色々インクルードして
#include"Enemy.h"     // 敵クラス

int EnemyModel    // 敵のモデルハンドル
Enemy enemy           // Enemyクラスオブジェクト

// 色々宣言して
// モデルを読み込む関数
readModel();


// main.cpp
#include "main.h"      // プレイヤークラスや敵クラスをインクルードしている

// ゲームの動作の中心、とりあえずmainにしておく
int main(){
  // 色々処理があって
  // モデルのロード
      //    モデルハンドルにモデル情報を格納
  readMoel();
      
  // メインループ
  while(TRUE){
             // 敵の描画
    // モデルハンドルを引数に
             enemy.Render( EnemyModel );
       }
}


// Enemy.h
#include"EnemyDraw.h"  // 敵を描画するクラス

class Enemy{
       // 現在位置や回転角度を格納する変数など色々宣言して

  int                  E_Model;         // Enemyクラスでのモデルハンドル
       EnemyDraw    enemyDraw;    // EnemyDrawクラスオブジェクト

      // 初期化関数
      void Init( int Enemy_Model );

  // 敵と壁や床との当たり判定の関数
  void  Colision();

      // 敵の移動ベクトルを求めて移動させる
  void Move();

    // Enemyクラスの関数の実行
      // 外に呼び出せるのはこの関数だけ
      void  Render( int EnemyModel );
}


// Enemy.cpp

#include"Enemy.h"


void Init( int EnemyModel ){

       // 色々初期化する

       // mainから受け取った敵のモデルを
  // Enemyクラスのモデルハンドルに格納
       Enemy::E_Model = EnemyModel

}
void Colision(){

       // 色々処理を書く

}

void Move(){

      // 色々処理を書く

}

void Render( int EnemyModel ){
   
          // 初期化
          Init( Enemymodel );
          // 敵の壁と床との当たり当たり判定
          Colision();
          // 敵の移動ベクトルを求めて移動させる
          Move();

   // 敵を画面に映す
          enemyDraw.Render( Enemy::E_Model );

}


// EnemyDraw.h

 
class EnemyDraw{
       // 現在位置や回転角度を格納する変数など色々宣言して
 
  int      EDraw_Model;         // Enemyクラスでのモデルハンドル
       
 
      // 初期化関数
      void Init( int Enemy_Model );
 
  // 描画関数
       void Draw();
 
    // Enemyクラスの関数の実行
      // 外に呼び出せるのはこの関数だけ
      void  Render( int Enemy_Model );
}
 
 
// EnemyDraw.cpp
 
#include"EnemyDraw.h"
 
 
void EnemyDraw::Init( int EnemyModel ){
 
       // 色々初期化する
 
       // mainから受け取った敵のモデルを
  // Enemyクラスのモデルハンドルに格納
       EnemyDraw::EDraw_Model = EnemyModel
 
}

void EnemyDraw::Draw(){

          //   色々処理して
         // ライブラリでのモデルの描画関数の実行
         DrawModel( EnemyDraw::EDraw_Model );

}

 
void EnemyDraw::Render( int EnemyModel ){
   
          // 初期化
          Init( EnemyModel );
          
   // 描画関数
        void Draw();
 
   // 敵を画面に映す
          enemyDraw.Render( EnemyDraw::EDraw_Model );
 
}


質問は2つあります

敵を実装していきたいのですがクラスを使っての敵の実装は初めてです、前は構造体を使っていました
そこで敵を複数出現させる場合、1つのクラスの関数内で各情報を持った配列(構造体?)をループ処理させる方が良いのでしょうか?

コード:


Enemy::Draw{
 for( int i = 0; i < Enemy_Num; i++){
       Enemy[i].pos  =  // 色々な値
   Enemy[i].Angle =  // 色々な値
 }
}
それともクラスのオブジェクト自体を敵の数だけ用意したほうが良いのでしょうか?

コード:

Enemy enemy[ Enemy_Num ];     // Enemyクラスオブジェクト配列

int main(){

 for( int i = 0; i < Enemy_Num; i++){
       enemy[ i ].Render( Enemy_Model );
 }
}
2つめの質問です
ある程度動作しているプレイヤーのクラスもそうなんですが、モデルの受け渡しが
int main()
 ↓
ベクトルや座標を求めたり衝突を求めたりするクラス

描画するクラス

というようにリレーのようになっていますがこれはまずいでしょうか?
一応、main()は読み込みだけですがその他のクラスではモデルデータは計算の為になどに使われています


誤字、脱字や抜けている部分、説明が足りない部分はあると思いますが
元コードのコンパイルは通っています

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 敵のクラス

#2

投稿記事 by softya(ソフト屋) » 14年前

その1.
敵クラスのインスタンスを必要な数だけ生成したほうが素直だと思います。
弾幕などは速度的な制約から難しいことではありますが。

その2.
私はオブジェクト指向的に考えれば、敵や自分はオブジェクトですからオブジェクトの中にデータや機能はできるだけカプセル化して集約すべきだと思います。
なので、移動等の処理と描画が分離している設計には私は違和感を感じます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る