logo

libbulletml

Library of Bullet Markup Language (forked from https://shinh.skr.jp/libbulletml/index_en.html )git clone https://hacktivis.me/git/libbulletml.git

bulletmlrunner.h (4368B)


  1. /// BulletML を実行する
  2. /**
  3. * 使い方:
  4. * BulletMLRunner を継承していくつかの純粋仮想関数を実装する。
  5. */
  6. #ifndef BULLETRUNNER_H_
  7. #define BULLETRUNNER_H_
  8. #include "bulletmltree.h"
  9. #include "bulletmlcommon.h"
  10. #include <vector>
  11. #include <memory>
  12. class BulletMLParser;
  13. class BulletMLNode;
  14. class BulletMLRunnerImpl;
  15. typedef std::vector<double> BulletMLParameter;
  16. /// BulletMLRunner が状態伝達に使用するクラス
  17. class BulletMLState {
  18. public:
  19. DECLSPEC BulletMLState(BulletMLParser* bulletml,
  20. const std::vector<BulletMLNode*>& node,
  21. std::shared_ptr<BulletMLParameter> para)
  22. : bulletml_(bulletml), node_(node.begin(), node.end()), para_(para) {}
  23. DECLSPEC BulletMLParser* getBulletML() { return bulletml_; }
  24. DECLSPEC const std::vector<BulletMLNode*>& getNode() const { return node_; }
  25. DECLSPEC std::shared_ptr<BulletMLParameter> getParameter() { return para_; }
  26. private:
  27. BulletMLParser* bulletml_;
  28. std::vector<BulletMLNode*> node_;
  29. std::shared_ptr<BulletMLParameter> para_;
  30. };
  31. /// BulletML を実行するクラス
  32. /**
  33. * <pre>
  34. * 使い方。
  35. * 1. これを継承して、Bullet を実際に動かせるクラスを作る。
  36. * 2. 純粋仮想関数を全て実装する。
  37. * 3. 必要なら、changeDirection などのために必要な仮想関数を実装する。
  38. * 4. このクラスのオブジェクトに対して、com_->run(); などとする。
  39. * </pre>
  40. */
  41. class BulletMLRunner {
  42. public:
  43. DECLSPEC explicit BulletMLRunner(BulletMLParser* bulletml);
  44. DECLSPEC explicit BulletMLRunner(BulletMLState* state);
  45. DECLSPEC virtual ~BulletMLRunner();
  46. /// 実行する
  47. DECLSPEC void run();
  48. public:
  49. /// 実行が終了しているかどうか
  50. DECLSPEC bool isEnd() const;
  51. public:
  52. // ----- 絶対実装しなければならない関数群の始まり -----
  53. //@{
  54. /// この弾の角度を求める
  55. /**
  56. * @return 角度を度単位で、上方向 0 で時計周りで返す
  57. */
  58. DECLSPEC virtual double getBulletDirection() =0;
  59. /// この弾から自機を狙う角度を求める
  60. /**
  61. * @return 角度を度単位で、上方向 0 で時計周りで返す
  62. */
  63. DECLSPEC virtual double getAimDirection() =0;
  64. /// この弾の速度を求める
  65. DECLSPEC virtual double getBulletSpeed() =0;
  66. /// デフォルトの速度を求める
  67. DECLSPEC virtual double getDefaultSpeed() =0;
  68. /// ランクを求める
  69. /**
  70. * @return 0 から 1 までの実数
  71. */
  72. DECLSPEC virtual double getRank() =0;
  73. /// action を持たない弾を作る
  74. DECLSPEC virtual void createSimpleBullet(double direction, double speed) =0;
  75. /// action を持つ弾を作る
  76. /**
  77. * @param state
  78. * 新しい弾の BulletMLRunner のコンストラクタに渡すこと。
  79. * もし渡さないのであれば、delete で解放しなければならない。
  80. */
  81. DECLSPEC virtual void createBullet(BulletMLState* state,
  82. double direction, double speed) =0;
  83. /// 弾の基準となるターンの値を返す、通常はフレーム数
  84. /**
  85. * @return
  86. * ゲームごとの基準でオーダーは変更して構いませんが、
  87. * 負数は許されません。
  88. * xml データ上で、wait と term のオーダーが揃っていれば問題ありません。
  89. */
  90. DECLSPEC virtual int getTurn() =0;
  91. /// 死ぬ
  92. DECLSPEC virtual void doVanish() =0;
  93. //@}
  94. // ----- 絶対実装しなければならない関数群の終わり -----
  95. // ----- 必要があれば実装する関数群の始まり -----
  96. //@{
  97. /// 弾の方向を指定した方向に変更する
  98. DECLSPEC virtual void doChangeDirection(double) {}
  99. /// 弾の速度を指定した値に変更する
  100. DECLSPEC virtual void doChangeSpeed(double) {}
  101. /// accel に対するインターフェイス
  102. /**
  103. * @todo
  104. * horizontal, vertical の type は未実装です。
  105. * どれも absolute になってしまいます。
  106. */
  107. DECLSPEC virtual void doAccelX(double) {}
  108. /// accel に対するインターフェイス
  109. /**
  110. * @todo
  111. * horizontal, vertical の type は未実装です。
  112. * どれも absolute になってしまいます。
  113. */
  114. DECLSPEC virtual void doAccelY(double) {}
  115. /// 弾の速さの X 方向成分を返します
  116. /**
  117. * accel を使う場合はオーバーライドして下さい
  118. */
  119. DECLSPEC virtual double getBulletSpeedX() { return 0; }
  120. /// 弾の速さの Y 方向成分を返します
  121. /**
  122. * accel を使う場合はオーバーライドして下さい
  123. */
  124. DECLSPEC virtual double getBulletSpeedY() { return 0; }
  125. //@}
  126. // ----- 必要があれば実装する関数群の終わり -----
  127. /// 乱数を返す
  128. /**
  129. * 見てのとおり、デフォルトでは std::rand が用いられます。
  130. */
  131. DECLSPEC virtual double getRand() { return (double)rand() / RAND_MAX; }
  132. private:
  133. /// BulletMLRunnerImpl をオーバーライドする場合、これもオーバーライドする
  134. DECLSPEC virtual BulletMLRunnerImpl* makeImpl(BulletMLState* state);
  135. protected:
  136. std::vector<BulletMLRunnerImpl*> impl_;
  137. };
  138. #endif // ! BULLETRUNNER_H_