SDXFrameWork  0.07
SDXFrameWork
 全て クラス ネームスペース 関数 変数 列挙型 列挙型の値 ページ
ModelMove.h
1 #pragma once//☀SDXFramework
2 #include <SDXFrameWork.h>
3 
4 namespace SDX
5 {
8 class ModelMove
9 {
10 public:
11  Model *model;
12 
13  ModelMove(Model *移動対象):
14  model(移動対象)
15  {}
16 
18  void MoveFront(double 速度)
19  {
20  model->MovePolar(速度, model->GetAngle());
21  }
22 
24  void MoveBound(double 速度, double &角度, Rect &移動範囲)
25  {
26  //範囲外にいる
27  if (model->GetX() < 移動範囲.GetLeft())
28  {
29  if (角度 > PAI / 2 && 角度 < PAI * 3 / 2)
30  {
31  角度 = -PAI - 角度;
32  }
33  }
34 
35  if (model->GetX() > 移動範囲.GetRight())
36  {
37  if (角度 < PAI / 2 || 角度 > PAI * 3 / 2)
38  {
39  角度 = PAI - 角度;
40  }
41  }
42  else if (model->GetY() < 移動範囲.GetTop())
43  {
44  if (角度 > PAI)
45  {
46  角度 = PAI * 2 - 角度;
47  }
48  }
49  else if (model->GetY() > 移動範囲.GetBottom())
50  {
51  if (角度 < PAI)
52  {
53  角度 = -角度;
54  }
55  }
56 
57  if (角度 < 0) 角度 += PAI * 2;
58  if (角度 > PAI * 2) 角度 -= PAI * 2;
59 
60  model->MovePolar(速度, 角度);
61  }
62 
64  bool MoveToPoint(double 速度, double 目標X, double 目標Y)
65  {
66  const double lx = 目標X - model->GetX();
67  const double ly = 目標Y - model->GetY();
68 
69  if (lx * lx + ly * ly <= 速度 * 速度)
70  {
71  model->SetPos(目標X, 目標Y);
72  return true;
73  }
74  else{
75  const double angle = atan2(ly, lx);
76  model->MovePolar(速度, angle);
77  return false;
78  }
79  }
80 
82  {
83  MoveCircleState(double 初角) :
84  angle(初角)
85  {}
86 
87  double angle;
88  double preX;
89  double preY;
90  bool isInit = false;
91  };
92 
94  void MoveCircle( double 角速度, MoveCircleState &状態, double 半径X, double 半径Y)
95  {
96  if (!状態.isInit)
97  {
98  状態.preX = cos(状態.angle) * 半径X;
99  状態.preY = sin(状態.angle) * 半径Y;
100  }
101 
102  状態.angle += 角速度;
103 
104  const double nextX = cos(状態.angle) * 半径X;
105  const double nextY = sin(状態.angle) * 半径Y;
106 
107  model->Move(nextX - 状態.preX, nextY - 状態.preY);
108 
109  状態.preX = nextX;
110  状態.preY = nextY;
111  }
112 
114  {
115  double moveX = 0;
116  double moveY = 0;
117  };
118 
120  void Vibrate(VibrateState &状態, double X振幅, double Y振幅)
121  {
122  状態.moveX = Rand::Get(-X振幅, X振幅) - 状態.moveX;
123  状態.moveY = Rand::Get(-Y振幅, Y振幅) - 状態.moveY;
124  model->Move(状態.moveX, 状態.moveY);
125  }
126 };
127 }
ShapeとSpriteをまとめて、2Dモデルを表すクラス.
Definition: Model.h:12
void MoveFront(double 速度)
Modelの向きに移動.
Definition: ModelMove.h:18
矩形を表す図形クラス.
Definition: Shape.h:702
void Vibrate(VibrateState &状態, double X振幅, double Y振幅)
範囲内でランダムに移動.
Definition: ModelMove.h:120
bool MoveToPoint(double 速度, double 目標X, double 目標Y)
目標座標まで移動.
Definition: ModelMove.h:64
void MovePolar(double 距離, double 角度)
極座標で移動.
Definition: Model.h:131
void MoveBound(double 速度, double &角度, Rect &移動範囲)
範囲外に出ると反転する.
Definition: ModelMove.h:24
double GetAngle()
角度を取得する.
Definition: Model.h:186
double GetY() const
Y座標を取得.
Definition: Model.h:229
void Move(double X移動量, double Y移動量)
相対座標で移動.
Definition: Model.h:125
Definition: ModelMove.h:81
double GetX() const
X座標を取得.
Definition: Model.h:223
void MoveCircle(double 角速度, MoveCircleState &状態, double 半径X, double 半径Y)
円周上を移動.
Definition: ModelMove.h:94
Definition: ModelMove.h:113
static double Get(double 最大値)
0~最大値の乱数を取得.
Definition: Rand.h:22
Modelの移動を行うクラス.
Definition: ModelMove.h:8
void SetPos(double X座標, double Y座標)
指定座標に移動.
Definition: Model.h:137