こんばんは~
またお世話になります(¨;)
ゲームを始める前に自機選択画面を設け、性能の違う自機を何種類か選べるようにしたいです。
最低でも、
・自機の画像
・自機のショットの画像
・移動速度
・ショットの性質(ホーミング、拡散など)
・ボスのエフェクト
は変えたいと思っています。
今の所、switch構文で、自機別に場合分けし、
自機Aのときは
cshot_main_A();
effect_main_A();
・
・
・
自機Bのときは
cshot_main_B();
effect_main_B();
・
・
・
というようにして、自機別に作ったものを読み込んでいくという方法しか思い付きません。
ですが、これだと後々caseをかなり増やさなければならなくなってしまいます。
もっとすっきりと実装することはできないでしょうか?
自機の場合分け
Re:自機の場合分け
・自機の画像
グラフィックハンドル
・自機のショット画像
グラフィックハンドル
・移動速度
double型変数
・ショットの性質
ショット種別変数・発射位置配列、個数
上記のように内部に情報を持つ事で対応した分岐になると思います。
・ボスのエフェクト
これは何なのかよく分かりません。
グラフィックハンドル
・自機のショット画像
グラフィックハンドル
・移動速度
double型変数
・ショットの性質
ショット種別変数・発射位置配列、個数
上記のように内部に情報を持つ事で対応した分岐になると思います。
・ボスのエフェクト
これは何なのかよく分かりません。
Re:自機の場合分け
ねこさん回答ありがとうございます_^)
ショット種別変数
について詳しく教えていただけませんか?
・ボスのエフェクト
↑
すいません打ち間違えました。
ボムのエフェクトです。
ショット種別変数
について詳しく教えていただけませんか?
・ボスのエフェクト
↑
すいません打ち間違えました。
ボムのエフェクトです。
Re:自機の場合分け
デザインパターンの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:自機の場合分け
ショット種別は例えば int iShotTypeとでもプレイヤーの構造体の中に作成して
0⇒直線移動
1⇒曲線移動
2⇒ホーミング移動
というように分岐の判断にするだけです。
0⇒直線移動
1⇒曲線移動
2⇒ホーミング移動
というように分岐の判断にするだけです。
Re:自機の場合分け
たくさんの回答ありがとうございます_^)
>conioさん
そのようなものがあるのですか…
ありがとうございます
詳しく調べてみようと思います(^^ゞ
>ねこさん
理解できました!
どうもです
>紅葉さん
配列で用意する
というのはどういうことをすればいいのでしょうか?
>conioさん
そのようなものがあるのですか…
ありがとうございます
詳しく調べてみようと思います(^^ゞ
>ねこさん
理解できました!
どうもです
>紅葉さん
配列で用意する
というのはどういうことをすればいいのでしょうか?
Re:自機の場合分け
情報を構造体でもってそれれの配列を作るということです。
typedef struct{ float Px,Py; }CHR; CHR Chr[5];などと書いてはいかがでしょうかという意味です。