最近プレイしたデススマイルズiPhone版があまりにも面白かったので
(このゲームの自機のカスタマイズシステムが非常に面白い)
自分のゲームにもこのシステムを入れることにしました。
複数の装備情報を持たせるクラス
/*装備情報クラス*/
class Equipment{
public:
virtual void start() = 0;
virtual void update() = 0;
virtual void draw() = 0;
};
/*武器情報クラス*/
class Arm : public Equipment{
public:
bool flag; //発射フラグ
int time; //フレーム時間
Player* player; //ショットを撃つキャラクターのポジション
EnemyBase* enemy; //エネミー情報(当たり判定チェックとか)
size_t enemySize; //エネミーのデータ量
BulletBase_GC bullet; //ゲームに使われる弾幕の情報
BulletData_GC bulletData; //弾データ
public:
void setEnemy( EnemyBase* _enemy , size_t _enemySize );
void shotStart(); //発射開始
void shotEnd(); //発射終了
void setPlayer( Player* _player );
void hitCheckBulletAndEnemy( int i );
}
この下にさらに継承するクラスとして
//========================================
//装備クラス
//========================================
class ArmCollection{
public:
/********************/
/*ショットパターン00*/
/********************/
class Arm_00 : public Arm{
public:
typedef enum{
MAXBULLET = 100 ,
};
public :
BulletBase::BulletData getBulletData( int i );
void start();
void update();
void draw();
public:
};
/********************/
/*ショットパターン01*/
/********************/
class Arm_01 : public Arm{
public:
typedef enum{
MAXBULLET = 100 ,
};
public :
BlendMode blendMode;
BulletBase::BulletData getBulletData( int i );
void start();
void update();
void draw();
public:
};
/********************/
/*ショットパターン02*/
/********************/
class Arm_02 : public Arm{
public:
typedef enum{
MAXBULLET = 100 ,
MAXDATA = 4 ,
};
public :
BlendMode blendMode;
BulletBase::BulletData getBulletData( int i );
void start();
void update();
void draw();
private:
bool sw;
int dataNumber;
void updateDataNumber();
};
};
単に「一クラス一ファイル」ということから無理矢理こうしているだけであります。
あとはこの武器情報クラス内に処理内容を記述していき、
static Arm_PTR getArm( int instanceName )
{
switch( instanceName ){
case 0 : return Arm_PTR( new ArmCollection::Arm_00() );
case 1 : return Arm_PTR( new ArmCollection::Arm_01() );
case 2 : return Arm_PTR( new ArmCollection::Arm_02() );
default : return Arm_PTR( new ArmCollection::Arm_00() );
}
return Arm_PTR( new ArmCollection::Arm_00() );
}
ゲーム開始時の初期化の段階で指定された変数の数値から
欲しいインスタンスが生成できるのではないかと。
これらの抽象クラス情報をプレイヤークラスに持たせます。
class CustomPlayer{
public:
EnemyBase* enemy;
size_t enemySize;
private:
Player player; /*プレイヤーの情報*/
int armID; /*武器情報*/
int accID; /*アクセサリ情報*/
int dressID; /*ドレス情報*/
Arm_PTR arms; /*武器製造*/
Accessorie_PTR acc; /*アクセサリー製造*/
Dress_PTR dress; /*ドレス製造*/
public:
void enemySet( EnemyBase* enemy , size_t size );
void start();
void update();
void draw();
};
void CustomPlayer::start()
{
/********************************/
/*生成するインスタンスIDはここで*/
/********************************/
dressID = 0; /*ドレス情報*/
armID = 2; /*武器情報*/
accID = 2; /*アクセサリ情報*/
/******************/
/*インスタンス製造*/
/******************/
arms = getArm ( armID );
acc = getAccessorie( accID );
dress = getDress ( dressID );
/******/
/*製造*/
/******/
arms.get()->start(); /*武器製造*/
acc.get()->start(); /*アクセサリー製造*/
dress.get()->start(); /*ドレス製造*/
}
割と短い期間で装備プログラムは良い感じに出来てきました。
クラス単位で処理を記述するかわりに
グループで制作する際は他の人でもプログラムがいじりやすいのではないかと思います。
こんな感じで次は敵も作らなければ。。。。!
敵はショットパターンと移動パターンは同じような感じでクラス化していく予定です
ではでは($・・)))/