SDXFrameWork  0.09
SDXFrameWork
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
Motion.h
1 #pragma once//©SDXFramework http://sourceforge.jp/projects/dxframework/
2 #include <SDXFramework.h>
3 #include <Utility/IMotion.h>
4 #include <Framework/Shape.h>
5 
6 namespace SDX
7 {
8 namespace MOTION
9 {
10  /*
11  //コピペ用ひな形
12  template <class TSpeed>
13  class Base : public IMotion
14  {
15  MOTION_BASE
16  public:
17  Base(const TSpeed &速度):
18  speed(速度)
19  {}
20 
21  void Update(IModel* 移動対象)
22  {
23  移動対象
24  }
25  };
26  */
27 
29  template <class TSpeed>
30  class ToFront : public IMotion
31  {
32  private:
33  TSpeed speed;
34  public:
35  ToFront(TSpeed 速度):
36  speed(速度)
37  {}
38 
39  void Update(IModel* 移動対象) override
40  {
41  移動対象->MovePolar(speed.Update(),移動対象->GetAngle());
42  }
43  };
44 
46  template <class TSpeed>
47  class Bound : public IMotion
48  {
49  private:
50  TSpeed speed;
51  double 進行方向;
52  Rect 移動範囲;
53  public:
54  Bound(const TSpeed &速度,const Rect& 移動範囲,double 進行方向):
55  speed(速度),
56  移動範囲(移動範囲)
57  {}
58 
59  void Update(IModel* 移動対象)
60  {
61  //範囲外にいる
62  if (移動対象->GetX() < 移動範囲.GetLeft())
63  {
64  if (進行方向 > PAI / 2 && 進行方向 < PAI * 3 / 2)
65  {
66  進行方向 = -PAI - 進行方向;
67  }
68  }
69 
70  if (移動対象->GetX() > 移動範囲.GetRight())
71  {
72  if (進行方向 < PAI / 2 || 進行方向 > PAI * 3 / 2)
73  {
74  進行方向 = PAI - 進行方向;
75  }
76  }
77  else if (移動対象->GetY() < 移動範囲.GetTop())
78  {
79  if (進行方向 > PAI)
80  {
81  進行方向 = PAI * 2 - 進行方向;
82  }
83  }
84  else if (移動対象->GetY() > 移動範囲.GetBottom())
85  {
86  if (進行方向 < PAI)
87  {
88  進行方向 = -進行方向;
89  }
90  }
91 
92  if (進行方向 < 0) 進行方向 += PAI * 2;
93  if (進行方向 > PAI * 2) 進行方向 -= PAI * 2;
94 
95  移動対象->MovePolar(speed.Update() , 進行方向);
96  }
97  };
98 
100  template <class TSpeed>
101  class ToPoint : public IMotion
102  {
103  private:
104  TSpeed speed;
105  Point 目標座標;
106  public:
107  ToPoint(const TSpeed &速度 , const Point& 目標座標):
108  speed(速度),
109  目標座標(目標座標)
110  {}
111 
112  void Update(IModel* 移動対象)
113  {
114  //移動対象
115  const double nowSpeed = speed.Update();
116  const double lx = 目標座標.GetX() - 移動対象->GetX();
117  const double ly = 目標座標.GetY() - 移動対象->GetY();
118 
119  if (lx * lx + ly * ly <= nowSpeed * nowSpeed)
120  {
121  移動対象->SetPos(目標座標.GetX(),目標座標.GetY() );
122  }else{
123  const double angle = atan2(ly, lx);
124  移動対象->MovePolar( nowSpeed , angle);
125  }
126  }
127  };
128 
130  template <class TSpeed>
131  class Orbit: public IMotion
132  {
133  private:
134  TSpeed speed;
135  Point 軌道中心;
136  double 角度;
137  double 半径X;
138  double 半径Y;
139 
140  Point 前座標;
141  public:
142  Orbit(const TSpeed &速度):
143  speed(速度),
144  前座標(0,0)
145  {}
146 
147  void Update(IModel* 移動対象)
148  {
149  //移動対象
150  角度 += speed.Update();
151 
152  const double nextX = cos(角度) * 半径X;
153  const double nextY = sin(角度) * 半径Y;
154 
155  移動対象->Move(nextX - 前座標.GetX() , nextY - 前座標.GetX() );
156 
157  前座標.SetPos(nextX,nextY);
158  }
159  };
160 
162  class Vibrate : public IMotion
163  {
164  private:
165  double 最大振れ幅;
166  double 前振れ幅X = 0;
167  double 前振れ幅Y = 0;
168  public:
169  Vibrate(double 最大振れ幅):
170  最大振れ幅(最大振れ幅)
171  {}
172 
173  void Update(IModel* 移動対象)
174  {
175  //移動対象
176  double 振れ幅 = 最大振れ幅;
177  前振れ幅X = Rand::Get(-振れ幅, 振れ幅) - 前振れ幅X;
178  前振れ幅X = Rand::Get(-振れ幅, 振れ幅) - 前振れ幅X;
179  移動対象->Move(前振れ幅X, 前振れ幅Y);
180  }
181  };
182 }
183 }
目標座標に移動.
Definition: Motion.h:101
矩形を表す図形クラス.
Definition: Shape.h:536
double GetY() const
Y座標を取得.
Definition: Shape.h:176
double GetY() const
Y座標を取得.
Definition: Model.h:188
円周上を移動.
Definition: Motion.h:131
点を表す図形クラス.
Definition: Shape.h:129
double GetX() const
X座標を取得.
Definition: Shape.h:171
Modelの移動方法.
Definition: IMotion.h:13
double GetAngle()
角度を取得する.
Definition: Model.h:151
void SetPos(double X座標, double Y座標)
指定座標に移動.
Definition: Shape.h:159
void Move(double X移動量, double Y移動量)
相対座標で移動.
Definition: Model.h:98
範囲内で跳ね返る.
Definition: Motion.h:47
void MovePolar(double 距離, double 角度)
極座標で移動.
Definition: Model.h:104
前方に移動.
Definition: Motion.h:30
範囲内で振動.
Definition: Motion.h:162
ShapeとSpriteをまとめて、2Dモデルを表すクラス.
Definition: Model.h:12
static double Get(double 最大値)
0~最大値の乱数を取得.
Definition: Rand.h:22
double GetX() const
X座標を取得.
Definition: Model.h:182
void SetPos(double X座標, double Y座標)
指定座標に移動.
Definition: Model.h:110