キャラクターに装備情報を持たせる

アバター
せんちゃ
記事: 50
登録日時: 15年前
住所: 江別市東野幌町
連絡を取る:

キャラクターに装備情報を持たせる

投稿記事 by せんちゃ » 14年前

シューティングゲームは基本的には装備という概念は薄いのですが、
最近プレイしたデススマイルズiPhone版があまりにも面白かったので

(このゲームの自機のカスタマイズシステムが非常に面白い)

自分のゲームにもこのシステムを入れることにしました。

複数の装備情報を持たせるクラス

CODE:

/*装備情報クラス*/
class Equipment{
public:
virtual void start() = 0;
virtual void update() = 0;
virtual void draw() = 0;
};
というクラスと先に作りましてここから継承

CODE:

/*武器情報クラス*/
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 );
}
という武器クラスを生成。
この下にさらに継承するクラスとして

CODE:

//========================================
//装備クラス
//========================================
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();
	};
};
ショットパターンをインナークラスにしてる意味は特にないです。
単に「一クラス一ファイル」ということから無理矢理こうしているだけであります。

あとはこの武器情報クラス内に処理内容を記述していき、

CODE:

	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() );
	}
というようなコードを作ってやることで、
ゲーム開始時の初期化の段階で指定された変数の数値から
欲しいインスタンスが生成できるのではないかと。

これらの抽象クラス情報をプレイヤークラスに持たせます。

CODE:

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();
};
初期化の実態はこのような感じ

CODE:

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(); /*ドレス製造*/
}
というような作りをすることで、
割と短い期間で装備プログラムは良い感じに出来てきました。

クラス単位で処理を記述するかわりに
グループで制作する際は他の人でもプログラムがいじりやすいのではないかと思います。


こんな感じで次は敵も作らなければ。。。。!
敵はショットパターンと移動パターンは同じような感じでクラス化していく予定です

ではでは($・・)))/
最後に編集したユーザー せんちゃ on 2011年9月19日(月) 01:04 [ 編集 2 回目 ]

コメントはまだありません。