ページ 11

自機の場合分け

Posted: 2009年6月20日(土) 20:23
by yrao
こんばんは~

またお世話になります(¨;)


ゲームを始める前に自機選択画面を設け、性能の違う自機を何種類か選べるようにしたいです。


最低でも、
・自機の画像
・自機のショットの画像
・移動速度
・ショットの性質(ホーミング、拡散など)
・ボスのエフェクト
は変えたいと思っています。


今の所、switch構文で、自機別に場合分けし、
自機Aのときは
cshot_main_A();
effect_main_A();




自機Bのときは
cshot_main_B();
effect_main_B();




というようにして、自機別に作ったものを読み込んでいくという方法しか思い付きません。

ですが、これだと後々caseをかなり増やさなければならなくなってしまいます。

もっとすっきりと実装することはできないでしょうか?

Re:自機の場合分け

Posted: 2009年6月20日(土) 21:23
by ねこ
・自機の画像
 グラフィックハンドル
・自機のショット画像
 グラフィックハンドル
・移動速度
 double型変数
・ショットの性質
 ショット種別変数・発射位置配列、個数

上記のように内部に情報を持つ事で対応した分岐になると思います。

・ボスのエフェクト
 これは何なのかよく分かりません。

Re:自機の場合分け

Posted: 2009年6月20日(土) 22:34
by yrao
ねこさん回答ありがとうございます_^)


ショット種別変数
について詳しく教えていただけませんか?



・ボスのエフェクト

すいません打ち間違えました。
ボムのエフェクトです。

Re:自機の場合分け

Posted: 2009年6月20日(土) 23:52
by conio
デザインパターンのAbstract Factoryパターンを使ってみではどうでしょう?
(・・・と言っても、自分も勉強途中で きちんと使えている自信はないです)

以下、ソースです。
----------------------------------------------------------------------------
#include<stdio.h>

class MachineDrawType{
public:
	virtual void DrawMachine() = 0;

};

class MachineDrawType1 : public MachineDrawType{
	virtual void DrawMachine(){
		puts("【自機の画像】(タイプ1)");
		puts(" ▲");
		puts("▲■▲");
		puts("■ ■");
	}
};
class MachineDrawType2 : public MachineDrawType{
	virtual void DrawMachine(){
		puts("【自機の画像】(タイプ2)");
		puts(" ■");
		puts("■■■");
		puts("■■■");
	}
};

class BulletDrawType{
public:
	virtual void DrawBullet() = 0;
};

class BulletDrawType1 : public BulletDrawType{
	virtual void DrawBullet(){
		puts("【弾の画像】(タイプ1)");
		puts(" ●");
		puts(" ●");
		puts(" ●");
	};
};

class BulletDrawType2 : public BulletDrawType{
	virtual void DrawBullet(){
		puts("【弾の画像】(タイプ2)");
		puts(" ■");
		puts(" ■");
	};
};
class AbstractMachine{
public:
	virtual MachineDrawType* CreateMachineDrawType(void) = 0;
	virtual BulletDrawType* CreateBulletDrawType(void) = 0;
};

class AbstractMachineType1 : public AbstractMachine
{
public:
	virtual MachineDrawType* CreateMachineDrawType() {
      return new MachineDrawType1;
   }
	virtual BulletDrawType* CreateBulletDrawType() {
      return new BulletDrawType1;
   }
};

class AbstractMachineType2 : public AbstractMachine
{
public:
	virtual MachineDrawType* CreateMachineDrawType() {
      return new MachineDrawType2;
   }
	virtual BulletDrawType* CreateBulletDrawType() {
      return new BulletDrawType2;
   }
};

class Machine
{
private:
	MachineDrawType* mMachineDrawType;
	BulletDrawType* mBulletDrawType;
public:
	Machine():mMachineDrawType(0),mBulletDrawType(0){ }
	~Machine(){
		delete mMachineDrawType;
		mMachineDrawType = 0;
		delete mBulletDrawType;
		mBulletDrawType = 0;
	};
	void CreateMachine(AbstractMachine* Abs)
	{
		mMachineDrawType = Abs->CreateMachineDrawType();
		mBulletDrawType = Abs->CreateBulletDrawType();
	}
	void DrawMachine(){mMachineDrawType->DrawMachine();}
	void DrawBullet(){mBulletDrawType->DrawBullet();}
};

int main(void)
{
	Machine MyMachine;
	AbstractMachineType1 AbsType1;
	AbstractMachineType2 AbsType2;
	char m_type;
	puts("機種を選んで下さい。(1 ~ 2)");
	scanf("%c", &m_type);
	switch(m_type)
	{
		case '1':
				MyMachine.CreateMachine(&AbsType1);
				break;
		case '2':
				MyMachine.CreateMachine(&AbsType2);
				break;
		default:break;
	}

	MyMachine.DrawMachine();
	MyMachine.DrawBullet();
}
--------------------------------------------------------------------------------------
ソースファイル1つに纏めてしまったので、必要に応じて分割コンパイルなどしてみて下さい。

とりあえず、どんな自機を作ろうが、全て
-----------------------------------
  MyMachine.DrawMachine();
  MyMachine.DrawBullet();
-----------------------------------
みたいに関数を呼び出せば、自機のタイプに応じて描画してくれます。

Re:自機の場合分け

Posted: 2009年6月21日(日) 01:16
by ねこ
ショット種別は例えば int iShotTypeとでもプレイヤーの構造体の中に作成して
0⇒直線移動
1⇒曲線移動
2⇒ホーミング移動
というように分岐の判断にするだけです。

Re:自機の場合分け

Posted: 2009年6月21日(日) 04:16
by 紅葉
構造体の型をつくり
それを配列で用意してはどうでしょうか?

Re:自機の場合分け

Posted: 2009年6月21日(日) 11:23
by yrao
たくさんの回答ありがとうございます_^)


>conioさん

そのようなものがあるのですか…

ありがとうございます
詳しく調べてみようと思います(^^ゞ



>ねこさん

理解できました!
どうもです



>紅葉さん

配列で用意する
というのはどういうことをすればいいのでしょうか?

Re:自機の場合分け

Posted: 2009年6月22日(月) 21:05
by 紅葉
情報を構造体でもってそれれの配列を作るということです。
typedef struct{
   float Px,Py;
}CHR;

CHR Chr[5];
などと書いてはいかがでしょうかという意味です。

Re:自機の場合分け

Posted: 2009年6月23日(火) 22:34
by yrao
>紅葉さん


遅れてしまってすいません(+_+)


理解しましたf^_
ありがとうございました!