皆さんから意見を聞きたくて、このトピックを立てました。
現在、c++でシューティングゲームを制作しています。
そこで、以下の様なクラスがあります。(簡素にしています)
class Character
{
public:
Character(void);
virtual ~Character(void);
virtual void update(void) = 0;
virtual void draw(void);
//位置アクセサ
int getX(void);
int getY(void);
void setX(int x);
void setY(int y);
private:
//左上座標
int x, y;
};
class Player :
public Character
{
public:
Player(void);
~Player(void);
void update(void);
void draw(void);
private:
Weapon *weapon;
};
class Weapon
{
public:
Weapon(void);
~Weapon(void);
//弾などの描画、更新関数
virtual void draw(void) = 0;
virtual void update(void) = 0;
};
class RapidShotWeapon :
public Weapon
{
public:
RapidShotWeapon(void);
~RapidShotWeapon(void);
void update(void);
void draw(void);
};
作成している途中で、RapidShotWeaponクラスのupdate()関数にて、Playerクラスの座標情報を知る必要が出てきました。
そこで、
- Weaponクラスのupdate()関数の引数で座標を持ってくるようにする
- RapidShotWeaponクラスのコンストラクタの引数でPlayerクラスのポインタを持ってくるようにする
前者については、他の武器を実装する場合に、Playerクラスの座標情報を知る必要がない場合がすでに考えられているという点であまり好ましくなさそうだと感じています。
後者については、Playerクラスが持つRapidShotWeaponクラスがPlayerクラスを参照できるという点が、これも好ましくなさそうだと感じます。
自分では他に納得できそうな案が思いつかず、困り果てています。
皆さんは、以上のような問題の例ならば、どのような実装を行いますか?