敵のクラス
Posted: 2012年5月27日(日) 11:15
C++で3D物のアクションゲームを作っています
敵に関してつまづいたので質問させて頂きます
とりあえず簡易的なコードです
質問は2つあります
敵を実装していきたいのですがクラスを使っての敵の実装は初めてです、前は構造体を使っていました
そこで敵を複数出現させる場合、1つのクラスの関数内で各情報を持った配列(構造体?)をループ処理させる方が良いのでしょうか?
それともクラスのオブジェクト自体を敵の数だけ用意したほうが良いのでしょうか?
2つめの質問です
ある程度動作しているプレイヤーのクラスもそうなんですが、モデルの受け渡しが
int main()
↓
ベクトルや座標を求めたり衝突を求めたりするクラス
↓
描画するクラス
というようにリレーのようになっていますがこれはまずいでしょうか?
一応、main()は読み込みだけですがその他のクラスではモデルデータは計算の為になどに使われています
誤字、脱字や抜けている部分、説明が足りない部分はあると思いますが
元コードのコンパイルは通っています
敵に関してつまづいたので質問させて頂きます
とりあえず簡易的なコードです
// 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 );
}
}
ある程度動作しているプレイヤーのクラスもそうなんですが、モデルの受け渡しが
int main()
↓
ベクトルや座標を求めたり衝突を求めたりするクラス
↓
描画するクラス
というようにリレーのようになっていますがこれはまずいでしょうか?
一応、main()は読み込みだけですがその他のクラスではモデルデータは計算の為になどに使われています
誤字、脱字や抜けている部分、説明が足りない部分はあると思いますが
元コードのコンパイルは通っています