自機の場合分け

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

自機の場合分け

#1

投稿記事 by yrao » 16年前

こんばんは~

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


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


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


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




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




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

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

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

ねこ

Re:自機の場合分け

#2

投稿記事 by ねこ » 16年前

・自機の画像
 グラフィックハンドル
・自機のショット画像
 グラフィックハンドル
・移動速度
 double型変数
・ショットの性質
 ショット種別変数・発射位置配列、個数

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

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

yrao

Re:自機の場合分け

#3

投稿記事 by yrao » 16年前

ねこさん回答ありがとうございます_^)


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



・ボスのエフェクト

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

conio

Re:自機の場合分け

#4

投稿記事 by conio » 16年前

デザインパターンの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:自機の場合分け

#5

投稿記事 by ねこ » 16年前

ショット種別は例えば int iShotTypeとでもプレイヤーの構造体の中に作成して
0⇒直線移動
1⇒曲線移動
2⇒ホーミング移動
というように分岐の判断にするだけです。

紅葉

Re:自機の場合分け

#6

投稿記事 by 紅葉 » 16年前

構造体の型をつくり
それを配列で用意してはどうでしょうか?

yrao

Re:自機の場合分け

#7

投稿記事 by yrao » 16年前

たくさんの回答ありがとうございます_^)


>conioさん

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

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



>ねこさん

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



>紅葉さん

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

紅葉

Re:自機の場合分け

#8

投稿記事 by 紅葉 » 16年前

情報を構造体でもってそれれの配列を作るということです。
typedef struct{
   float Px,Py;
}CHR;

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

yrao

Re:自機の場合分け

#9

投稿記事 by yrao » 16年前

>紅葉さん


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


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

閉鎖

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