1 #include "Object.h"
2
Object(float x,float y,int width,int height)3 Object::Object(float x, float y, int width, int height) {
4 X = x;
5 Y = y;
6 m_width = width;
7 m_height = height;
8 m_left = -m_width / 2;
9 m_right = m_width / 2;
10 m_top = -m_height / 2;
11 m_bottom = m_height / 2;
12 Scale = 1.0f;
13 Angle = 0.0f;
14 RMask = BMask = GMask = AMask = 1.0f;
15 HitR = 1.0f;
16 Acceleration = 0.1f;
17 Speed = 0.0f;
18 }
19
~Object()20 Object::~Object()
21 {
22 //nothing
23 }
24
fixAngle(float angle)25 float Object::fixAngle(float angle) {
26 if (angle < 0)
27 angle += 360;
28 else if (angle > 360)
29 angle -= 360;
30
31 return angle;
32 }
33
turn(float targetAngle,float angleSpeed,int deltaTime)34 void Object::turn(float targetAngle, float angleSpeed, int deltaTime) {
35 float arch1;
36 float arch2;
37
38 if (Angle > targetAngle) {
39 arch1 = Angle - targetAngle;
40 arch2 = 360 - arch1;
41 }
42 else {
43 arch2 = targetAngle - Angle;
44 arch1 = 360 - arch2;
45 }
46
47 float delta = deltaTime * angleSpeed;
48 if (arch1 < arch2)
49 if(arch1 < delta)
50 Angle = targetAngle;
51 else
52 Angle -= delta;
53 else
54 if(arch2 < delta)
55 Angle = targetAngle;
56 else
57 Angle += delta;
58 }
59
calc_angle(float x1,float y1,float x2,float y2)60 float Object::calc_angle(float x1, float y1, float x2, float y2) {
61 return 180.0f / M_PI * atan2(x2 - x1, -y2 + y1);
62 }
63
calc_dist(float x1,float y1,float x2,float y2)64 float Object::calc_dist(float x1, float y1, float x2, float y2) {
65 return hypot(x2 - x1, -y2 + y1);
66 }
67
move(int deltaTime)68 void Object::move(int deltaTime) {
69 X -= cos((Angle + 90) * M_PI / 180) * deltaTime * Speed;
70 Y -= sin((Angle + 90) * M_PI / 180) * deltaTime * Speed;
71 }
72
detectCollide(Object * refObj)73 const bool Object::detectCollide(Object *refObj) {
74 return calc_dist(X, Y, refObj->X, refObj->Y) < HitR * Scale * m_width
75 + refObj->HitR * refObj->Scale * refObj->getWidth();
76 }
77
detectCollide(float x,float y)78 const bool Object::detectCollide(float x, float y) {
79 return calc_dist(X, Y, x, y) < HitR * Scale * m_width;
80 }
81
detectCollide(float x1,float y1,float x2,float y2)82 const bool Object::detectCollide(float x1, float y1, float x2, float y2) {
83 float tx, ty;
84 return detectCollide(x1, y1, x2, y2, &tx, &ty);
85 }
86
detectCollide(float x1,float y1,float x2,float y2,float * ix,float * iy)87 const bool Object::detectCollide(float x1, float y1, float x2, float y2,
88 float* ix, float* iy) {
89 float k = (y1 - y2) / (x1 - x2);
90 float b = y1 - k * x1;
91 float r = HitR * Scale * m_width;
92
93 float d = (pow((2 * k * b - 2 * X - 2 * Y * k), 2) - (4 + 4 * pow(k, 2))
94 * (pow(b, 2) - pow(r, 2) + pow(X, 2) + pow(Y, 2) - 2 * Y * b));
95
96 if (d < 0) {
97 return false;
98 }
99
100 float resX1 = (-(2 * k * b - 2 * X - 2 * Y * k) - sqrt(d)) / (2 + 2 * pow(
101 k, 2));
102 // float resX2 = ((-(2* k * b - 2* targetX - 2* targetY * k) + sqrt(d)) / (2
103 // + 2* k * k));
104
105 float resY1 = k * resX1 + b;
106
107 if (std::abs(std::abs(x1 - resX1) + std::abs(x2 - resX1)
108 - std::abs(x2 - x1)) < 1) {
109 *ix = resX1;
110 *iy = resY1;
111 return true;
112 }
113
114 // if (resX1 == resX2) {
115 // one intersection at resX1, y1
116 // return true;
117 // }
118
119 // two intersections: resX1, y1 и resX2, y2
120 // float y1 = k * resX1 + b;
121 // float y2 = k * resX2 + b;
122
123 return false;
124 }
setMask(float _RMask,float _GMask,float _BMask,float _AMask)125 void Object::setMask(float _RMask, float _GMask, float _BMask, float _AMask) {
126 RMask = _RMask;
127 GMask = _GMask;
128 BMask = _BMask;
129 AMask = _AMask;
130 }
131