#1
by あげだま » 3年前
STGを作っています。ボスの行動パターンをBossActionクラスという抽象クラス化し、そのクラスへのポインタスマートポインタ(bossaction)から派生の行動パターンをループ内で動的確保するプログラムを作っています。行動id(bs.act_id)によって行動パターンを場合分けするようにしているのですが、ループ内でそのまま確保すると延々と確保し続けてしまうので、idが切り替わった瞬間だけ確保するようにしなければならないと思い、typeidを使ってポインタがその行動パターンを指してない時のみ確保するように試みたのですが、実行してみると結局延々と確保し続けているようです。改善策を教えていただけると幸いです。「bossaction->Action(sp , bs);」がボスを動かすメソッドです。
コード:
class BossAction {
protected:
int t;
int t_limit;
void LimitCnt();
public:
BossAction() {t = 0; };
virtual void Action(SpriteData &sp , BossData &bs) = 0;
int ReturnTimeLimit() {return t_limit; };
};
class BossActionIn : public BossAction {
public:
BossActionIn():BossAction() { t_limit = 30; };
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossActionTurn : public BossAction {
public:
BossActionTurn() :BossAction() {};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossActionWait : public BossAction {
public:
BossActionWait() :BossAction() { };
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction01 : public BossAction{
public:
BossAction01() :BossAction() { t_limit = 30;};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction02 : public BossAction {
public:
BossAction02() :BossAction() {t_limit = 60;};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction03 : public BossAction {
public:
BossAction03() :BossAction() {t_limit = 30;};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction04 : public BossAction {
public:
BossAction04() :BossAction() {t_limit = 120; };
virtual void Action(SpriteData& sp, BossData& bs)override;
};
//以下は本来はBossクラスのupdate()メソッドに内に書かれているです部分です。
switch (bs.act_id) {
case -2:
if (typeid(bossaction) != typeid(BossActionWait))bossaction.reset(new BossActionWait);
break;
case -1:
if (typeid(bossaction) != typeid(BossActionTurn))bossaction.reset(new BossActionTurn);
break;
case 0:
if (typeid(bossaction) != typeid(BossActionIn))bossaction.reset(new BossActionIn);
break;
case 1:
if (typeid(bossaction) != typeid(BossAction01))bossaction.reset(new BossAction01);
break;
case 2:
if (typeid(bossaction) != typeid(BossAction02))bossaction.reset(new BossAction02);
break;
case 3:
if (typeid(bossaction) != typeid(BossAction03))bossaction.reset(new BossAction03);
break;
case 4:
if (typeid(bossaction) != typeid(BossAction04))bossaction.reset(new BossAction04);
break;
}
bossaction->Action(sp , bs);
STGを作っています。ボスの行動パターンをBossActionクラスという抽象クラス化し、そのクラスへのポインタスマートポインタ(bossaction)から派生の行動パターンをループ内で動的確保するプログラムを作っています。行動id(bs.act_id)によって行動パターンを場合分けするようにしているのですが、ループ内でそのまま確保すると延々と確保し続けてしまうので、idが切り替わった瞬間だけ確保するようにしなければならないと思い、typeidを使ってポインタがその行動パターンを指してない時のみ確保するように試みたのですが、実行してみると結局延々と確保し続けているようです。改善策を教えていただけると幸いです。「bossaction->Action(sp , bs);」がボスを動かすメソッドです。
[code]
class BossAction {
protected:
int t;
int t_limit;
void LimitCnt();
public:
BossAction() {t = 0; };
virtual void Action(SpriteData &sp , BossData &bs) = 0;
int ReturnTimeLimit() {return t_limit; };
};
class BossActionIn : public BossAction {
public:
BossActionIn():BossAction() { t_limit = 30; };
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossActionTurn : public BossAction {
public:
BossActionTurn() :BossAction() {};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossActionWait : public BossAction {
public:
BossActionWait() :BossAction() { };
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction01 : public BossAction{
public:
BossAction01() :BossAction() { t_limit = 30;};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction02 : public BossAction {
public:
BossAction02() :BossAction() {t_limit = 60;};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction03 : public BossAction {
public:
BossAction03() :BossAction() {t_limit = 30;};
virtual void Action(SpriteData& sp, BossData& bs)override;
};
class BossAction04 : public BossAction {
public:
BossAction04() :BossAction() {t_limit = 120; };
virtual void Action(SpriteData& sp, BossData& bs)override;
};
//以下は本来はBossクラスのupdate()メソッドに内に書かれているです部分です。
switch (bs.act_id) {
case -2:
if (typeid(bossaction) != typeid(BossActionWait))bossaction.reset(new BossActionWait);
break;
case -1:
if (typeid(bossaction) != typeid(BossActionTurn))bossaction.reset(new BossActionTurn);
break;
case 0:
if (typeid(bossaction) != typeid(BossActionIn))bossaction.reset(new BossActionIn);
break;
case 1:
if (typeid(bossaction) != typeid(BossAction01))bossaction.reset(new BossAction01);
break;
case 2:
if (typeid(bossaction) != typeid(BossAction02))bossaction.reset(new BossAction02);
break;
case 3:
if (typeid(bossaction) != typeid(BossAction03))bossaction.reset(new BossAction03);
break;
case 4:
if (typeid(bossaction) != typeid(BossAction04))bossaction.reset(new BossAction04);
break;
}
bossaction->Action(sp , bs);
[/code]