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