bulletmlrunner.h (4368B)
- /// BulletML を実行する
- /**
- * 使い方:
- * BulletMLRunner を継承していくつかの純粋仮想関数を実装する。
- */
- #ifndef BULLETRUNNER_H_
- #define BULLETRUNNER_H_
- #include "bulletmltree.h"
- #include "bulletmlcommon.h"
- #include <vector>
- #include <memory>
- class BulletMLParser;
- class BulletMLNode;
- class BulletMLRunnerImpl;
- typedef std::vector<double> BulletMLParameter;
- /// BulletMLRunner が状態伝達に使用するクラス
- class BulletMLState {
- public:
- DECLSPEC BulletMLState(BulletMLParser* bulletml,
- const std::vector<BulletMLNode*>& node,
- std::shared_ptr<BulletMLParameter> para)
- : bulletml_(bulletml), node_(node.begin(), node.end()), para_(para) {}
- DECLSPEC BulletMLParser* getBulletML() { return bulletml_; }
- DECLSPEC const std::vector<BulletMLNode*>& getNode() const { return node_; }
- DECLSPEC std::shared_ptr<BulletMLParameter> getParameter() { return para_; }
- private:
- BulletMLParser* bulletml_;
- std::vector<BulletMLNode*> node_;
- std::shared_ptr<BulletMLParameter> para_;
- };
- /// BulletML を実行するクラス
- /**
- * <pre>
- * 使い方。
- * 1. これを継承して、Bullet を実際に動かせるクラスを作る。
- * 2. 純粋仮想関数を全て実装する。
- * 3. 必要なら、changeDirection などのために必要な仮想関数を実装する。
- * 4. このクラスのオブジェクトに対して、com_->run(); などとする。
- * </pre>
- */
- class BulletMLRunner {
- public:
- DECLSPEC explicit BulletMLRunner(BulletMLParser* bulletml);
- DECLSPEC explicit BulletMLRunner(BulletMLState* state);
- DECLSPEC virtual ~BulletMLRunner();
- /// 実行する
- DECLSPEC void run();
- public:
- /// 実行が終了しているかどうか
- DECLSPEC bool isEnd() const;
- public:
- // ----- 絶対実装しなければならない関数群の始まり -----
- //@{
- /// この弾の角度を求める
- /**
- * @return 角度を度単位で、上方向 0 で時計周りで返す
- */
- DECLSPEC virtual double getBulletDirection() =0;
- /// この弾から自機を狙う角度を求める
- /**
- * @return 角度を度単位で、上方向 0 で時計周りで返す
- */
- DECLSPEC virtual double getAimDirection() =0;
- /// この弾の速度を求める
- DECLSPEC virtual double getBulletSpeed() =0;
- /// デフォルトの速度を求める
- DECLSPEC virtual double getDefaultSpeed() =0;
- /// ランクを求める
- /**
- * @return 0 から 1 までの実数
- */
- DECLSPEC virtual double getRank() =0;
- /// action を持たない弾を作る
- DECLSPEC virtual void createSimpleBullet(double direction, double speed) =0;
- /// action を持つ弾を作る
- /**
- * @param state
- * 新しい弾の BulletMLRunner のコンストラクタに渡すこと。
- * もし渡さないのであれば、delete で解放しなければならない。
- */
- DECLSPEC virtual void createBullet(BulletMLState* state,
- double direction, double speed) =0;
- /// 弾の基準となるターンの値を返す、通常はフレーム数
- /**
- * @return
- * ゲームごとの基準でオーダーは変更して構いませんが、
- * 負数は許されません。
- * xml データ上で、wait と term のオーダーが揃っていれば問題ありません。
- */
- DECLSPEC virtual int getTurn() =0;
- /// 死ぬ
- DECLSPEC virtual void doVanish() =0;
- //@}
- // ----- 絶対実装しなければならない関数群の終わり -----
- // ----- 必要があれば実装する関数群の始まり -----
- //@{
- /// 弾の方向を指定した方向に変更する
- DECLSPEC virtual void doChangeDirection(double) {}
- /// 弾の速度を指定した値に変更する
- DECLSPEC virtual void doChangeSpeed(double) {}
- /// accel に対するインターフェイス
- /**
- * @todo
- * horizontal, vertical の type は未実装です。
- * どれも absolute になってしまいます。
- */
- DECLSPEC virtual void doAccelX(double) {}
- /// accel に対するインターフェイス
- /**
- * @todo
- * horizontal, vertical の type は未実装です。
- * どれも absolute になってしまいます。
- */
- DECLSPEC virtual void doAccelY(double) {}
- /// 弾の速さの X 方向成分を返します
- /**
- * accel を使う場合はオーバーライドして下さい
- */
- DECLSPEC virtual double getBulletSpeedX() { return 0; }
- /// 弾の速さの Y 方向成分を返します
- /**
- * accel を使う場合はオーバーライドして下さい
- */
- DECLSPEC virtual double getBulletSpeedY() { return 0; }
- //@}
- // ----- 必要があれば実装する関数群の終わり -----
- /// 乱数を返す
- /**
- * 見てのとおり、デフォルトでは std::rand が用いられます。
- */
- DECLSPEC virtual double getRand() { return (double)rand() / RAND_MAX; }
- private:
- /// BulletMLRunnerImpl をオーバーライドする場合、これもオーバーライドする
- DECLSPEC virtual BulletMLRunnerImpl* makeImpl(BulletMLState* state);
- protected:
- std::vector<BulletMLRunnerImpl*> impl_;
- };
- #endif // ! BULLETRUNNER_H_