| 76 | } |
| 77 | |
| 78 | static inline bool CollisionCheck(GameObject* p1, GameObject* p2)LNOEXCEPT |
| 79 | { |
| 80 | if (!p1->colli || !p2->colli) // ���Բ���ײ���� |
| 81 | return false; |
| 82 | |
| 83 | // ���ټ�� |
| 84 | if ((p1->x - p1->col_r >= p2->x + p2->col_r) || |
| 85 | (p1->x + p1->col_r <= p2->x - p2->col_r) || |
| 86 | (p1->y - p1->col_r >= p2->y + p2->col_r) || |
| 87 | (p1->y + p1->col_r <= p2->y - p2->col_r)) |
| 88 | { |
| 89 | return false; |
| 90 | } |
| 91 | |
| 92 | fcyVec2 pos1((float)p1->x, (float)p1->y), pos2((float)p2->x, (float)p2->y); |
| 93 | fcyVec2 size1((float)p1->a, (float)p1->b), size2((float)p2->a, (float)p2->b); // half size |
| 94 | float r1((float)p1->col_r), r2((float)p2->col_r); |
| 95 | |
| 96 | // ���Բ��� |
| 97 | if (!CircleHitTest(pos1, r1, pos2, r2)) |
| 98 | return false; |
| 99 | |
| 100 | // ��ȷ��ײ��� |
| 101 | if (p1->rect) |
| 102 | { |
| 103 | if (p2->rect) |
| 104 | return OBBHitTest(pos1, size1, (float)p1->rot, pos2, size2, (float)p2->rot); |
| 105 | else |
| 106 | return OBBCircleHitTest(pos1, size1, (float)p1->rot, pos2, r2); |
| 107 | } |
| 108 | else |
| 109 | { |
| 110 | if (p2->rect) |
| 111 | return OBBCircleHitTest(pos2, size2, (float)p2->rot, pos1, r1); |
| 112 | else |
| 113 | return true; // ���Բ���ͨ���� |
| 114 | } |
| 115 | |
| 116 | /* |
| 117 | // ! ����luastg�Ĵ��� ԭ�������� |
| 118 | double a = p2->a; |
| 119 | double b = p2->b; |
| 120 | double r = p1->a; |
| 121 | double l = a + b + r; |
| 122 | double dx = p2->x - p1->x; |
| 123 | double dy = p2->y - p1->y; |
| 124 | if (fabs(dx) > l || fabs(dy) > l) |
| 125 | return false; |
| 126 | double x = dx*cos(p1->rot) + dy*sin(p1->rot); |
| 127 | double y = -dx*sin(p1->rot) + dy*cos(p1->rot); |
| 128 | a += r; |
| 129 | b += r; |
| 130 | a = a*a; b = b*b; |
| 131 | x = x*x; y = y*y; |
| 132 | if (p2->rect) |
| 133 | return x < a && y < b; |
| 134 | else |
| 135 | return (x * b + y * a) < a * b; |
no test coverage detected