SDXFrameWork  0.04
SDXFrameWork
 全て クラス ネームスペース 関数 変数 ページ
ModelMove.h
1 #pragma once
2 #include <SDXFrameWork.h>
3 
4 namespace SDX
5 {
7 class ModelMove
9 {
10 public:
11  Model *model;
12 
13  ModelMove(Model *移動対象):
14  model(移動対象)
15  {}
16 
18  void 前進(double 速度)
19  {
20  model->MovePolar(速度, model->GetAngle());
21  }
22 
24  void 直進(double 速度, double 角度)
25  {
26  model->MovePolar(速度, 角度);
27  }
28 
30  void 跳ね返り(double 速度, double &角度, Rect &移動範囲)
31  {
32  //範囲外にいる
33  if (model->GetX() < 移動範囲.GetLeft())
34  {
35  if (角度 > PAI / 2 && 角度 < PAI * 3 / 2)
36  {
37  角度 = -PAI - 角度;
38  }
39  }
40 
41  if (model->GetX() > 移動範囲.GetRight())
42  {
43  if (角度 < PAI / 2 || 角度 > PAI * 3 / 2)
44  {
45  角度 = PAI - 角度;
46  }
47  }
48  else if (model->GetY() < 移動範囲.GetTop())
49  {
50  if (角度 > PAI)
51  {
52  角度 = PAI * 2 - 角度;
53  }
54  }
55  else if (model->GetY() > 移動範囲.GetBottom())
56  {
57  if (角度 < PAI)
58  {
59  角度 = -角度;
60  }
61  }
62 
63  if (角度 < 0) 角度 += PAI * 2;
64  if (角度 > PAI * 2) 角度 -= PAI * 2;
65 
66  model->MovePolar(速度, 角度);
67  }
68 
70  bool 指定移動(double 速度, double 目標X, double 目標Y)
71  {
72  const double lx = 目標X - model->GetX();
73  const double ly = 目標Y - model->GetY();
74 
75  if (lx * lx + ly * ly <= 速度 * 速度)
76  {
77  model->SetPos(目標X, 目標Y);
78  return true;
79  }
80  else{
81  const double angle = atan2(ly, lx);
82  model->MovePolar(速度, angle);
83  return false;
84  }
85  }
86 
88  {
89  円軌道状態(double 初角) :
90  角度(初角)
91  {}
92 
93  double 角度;
94  double 前位置X;
95  double 前位置Y;
96  bool 初期化フラグ = false;
97  };
98 
100  void 円軌道( double 角速度, 円軌道状態 &状態, double 半径X, double 半径Y)
101  {
102  if (!状態.初期化フラグ)
103  {
104  状態.前位置X = cos(状態.角度) * 半径X;
105  状態.前位置Y = sin(状態.角度) * 半径Y;
106  }
107 
108  状態.角度 += 角速度;
109 
110  const double nextX = cos(状態.角度) * 半径X;
111  const double nextY = sin(状態.角度) * 半径Y;
112 
113  model->Move(nextX - 状態.前位置X, nextY - 状態.前位置Y);
114 
115  状態.前位置X = nextX;
116  状態.前位置Y = nextY;
117  }
118 
120  {
121  double 移動量X = 0;
122  double 移動量Y = 0;
123  };
124 
126  void 振動(振動状態 &状態, double X振幅, double Y振幅)
127  {
128  状態.移動量X = Rand::Get(-X振幅, X振幅) - 状態.移動量X;
129  状態.移動量Y = Rand::Get(-Y振幅, Y振幅) - 状態.移動量Y;
130  model->Move(状態.移動量X, 状態.移動量Y);
131  }
132 };
133 }
矩形を表す図形クラス.
Definition: Shape.h:689
void MovePolar(double 距離, double 方向)
極座標で移動.
Definition: Model.h:123
void 直進(double 速度, double 角度)
角度を指定して移動.
Definition: ModelMove.h:24
Definition: ModelMove.h:119
void 前進(double 速度)
Modelの向きに移動.
Definition: ModelMove.h:18
double GetAngle()
角度を取得する.
Definition: Model.h:178
double GetY() const
Y座標を取得.
Definition: Model.h:221
bool 指定移動(double 速度, double 目標X, double 目標Y)
目標座標まで移動.
Definition: ModelMove.h:70
void Move(double X移動量, double Y移動量)
相対座標で移動.
Definition: Model.h:117
Definition: ModelMove.h:87
double GetX() const
X座標を取得.
Definition: Model.h:215
void 振動(振動状態 &状態, double X振幅, double Y振幅)
範囲内でランダムに移動.
Definition: ModelMove.h:126
static double Get(double 最大値)
0~最大値の乱数を取得.
Definition: Rand.h:22
void 円軌道(double 角速度, 円軌道状態 &状態, double 半径X, double 半径Y)
円周上を移動.
Definition: ModelMove.h:100
void 跳ね返り(double 速度, double &角度, Rect &移動範囲)
範囲外に出ると反転する.
Definition: ModelMove.h:30
void SetPos(double X座標, double Y座標)
指定座標に移動.
Definition: Model.h:129