logo

libbulletml

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

bulletmlrunnerimpl.h (4093B)


  1. #ifndef BULLETRUNNER_IMPL_H_
  2. #define BULLETRUNNER_IMPL_H_
  3. #include "bulletmltree.h"
  4. #include <vector>
  5. #include <memory>
  6. #include <stack>
  7. #include <memory>
  8. class BulletMLRunner;
  9. class BulletMLState;
  10. class BulletMLParser;
  11. typedef std::vector<double> BulletMLParameter;
  12. template<class C_>
  13. class Validatable {
  14. public:
  15. Validatable() : isValidate_(false) {}
  16. bool isValidate() const { return isValidate_; }
  17. void enValidate() { isValidate_ = true; }
  18. void disValidate() { isValidate_ = false; }
  19. operator C_& () { return val_; }
  20. C_& operator = (const C_& rhs) {
  21. isValidate_ = true;
  22. val_ = rhs;
  23. return *this;
  24. }
  25. protected:
  26. C_ val_;
  27. bool isValidate_;
  28. };
  29. /// xyの初期値・終値から任意のxに対するyの線形補間を得るクラス
  30. template <class X_ = double, class Y_ = double>
  31. class LinearFunc {
  32. public:
  33. LinearFunc(const X_& firstX, const X_& lastX,
  34. const Y_& firstY, const Y_& lastY)
  35. : firstX_(firstX), lastX_(lastX),
  36. firstY_(firstY), lastY_(lastY),
  37. gradient_((lastY-firstY)/(lastX-firstX)) {}
  38. Y_ getValue(const X_& x) {
  39. return firstY_ + gradient_ * (x-firstX_);
  40. }
  41. bool isLast(const X_& x) {
  42. return x >= lastX_;
  43. }
  44. Y_ getLast() {
  45. return lastY_;
  46. }
  47. protected:
  48. X_ firstX_, lastX_;
  49. Y_ firstY_, lastY_;
  50. Y_ gradient_;
  51. };
  52. class BulletMLRunnerImpl {
  53. public:
  54. explicit BulletMLRunnerImpl(BulletMLState* state, BulletMLRunner* runner);
  55. virtual ~BulletMLRunnerImpl();
  56. /// 実行する
  57. void run();
  58. public:
  59. /// 実行が終了しているかどうか
  60. bool isEnd() const {
  61. return end_;
  62. }
  63. public:
  64. /// 弾の方向変更を登録し、自前で各ターン変更する
  65. virtual void calcChangeDirection(double direction, int term, bool seq);
  66. /// 弾の速度変更を登録し、自前で各ターン変更する
  67. virtual void calcChangeSpeed(double speed, int term);
  68. /// 弾の加速を登録し、自前で各ターン変更する
  69. /**
  70. * @todo horizontal, vertical の type は未実装です。
  71. */
  72. virtual void calcAccelX(double vertical, int term,
  73. BulletMLNode::Type type);
  74. /// 弾の加速を登録し、自前で各ターン変更する
  75. /**
  76. * @todo horizontal, vertical の type は未実装です。
  77. */
  78. virtual void calcAccelY(double horizontal, int term,
  79. BulletMLNode::Type type);
  80. protected:
  81. /**
  82. * 本当に挙動が気に入らない場合は仮想関数化して、
  83. * これらのオーバーライドも考えてください。
  84. */
  85. //@{
  86. void runBullet();
  87. void runAction();
  88. void runFire();
  89. void runWait();
  90. void runRepeat();
  91. void runBulletRef();
  92. void runActionRef();
  93. void runFireRef();
  94. void runChangeDirection();
  95. void runChangeSpeed();
  96. void runAccel();
  97. void runVanish();
  98. //@}
  99. private:
  100. void changes();
  101. void runSub();
  102. void init();
  103. bool isTurnEnd();
  104. void doWait(int frame);
  105. void setDirection();
  106. void setSpeed();
  107. void shotInit() {
  108. spd_.disValidate();
  109. dir_.disValidate();
  110. }
  111. double getNumberContents(const BulletMLNode* node);
  112. std::vector<double>* getParameters();
  113. double getSpeed(BulletMLNode* spdNode);
  114. double getDirection(BulletMLNode* dirNode);
  115. private:
  116. private:
  117. std::auto_ptr<LinearFunc<int, double> > changeDir_;
  118. std::auto_ptr<LinearFunc<int, double> > changeSpeed_;
  119. std::auto_ptr<LinearFunc<int, double> > accelx_;
  120. std::auto_ptr<LinearFunc<int, double> > accely_;
  121. protected:
  122. Validatable<double> spd_, dir_, prevSpd_, prevDir_;
  123. typedef BulletMLParameter Parameters;
  124. std::shared_ptr<Parameters> parameters_;
  125. protected:
  126. BulletMLParser* bulletml_;
  127. BulletMLNode* act_;
  128. std::vector<BulletMLNode*> node_;
  129. int actTurn_;
  130. std::vector<int> actTurns_;
  131. int endTurn_;
  132. size_t actIte_;
  133. bool end_;
  134. protected:
  135. struct RepeatElem {
  136. RepeatElem(int i, int e, BulletMLNode* a)
  137. : ite(i), end(e), act(a) {}
  138. int ite, end;
  139. BulletMLNode* act;
  140. };
  141. typedef std::stack<RepeatElem*> RepeatStack;
  142. RepeatStack repeatStack_;
  143. typedef std::stack<std::pair<BulletMLNode*,
  144. std::shared_ptr<Parameters> > > RefStack;
  145. RefStack refStack_;
  146. typedef void (BulletMLRunnerImpl::*Method)();
  147. static Method commandMap_[BulletMLNode::nameSize];
  148. protected:
  149. BulletMLRunner* runner_;
  150. };
  151. #endif // ! BULLETRUNNER_IMPL_H_