76 lines
1.4 KiB
C++
76 lines
1.4 KiB
C++
#pragma once
|
|
|
|
enum ColliderType_e
|
|
{
|
|
CT_None,
|
|
CT_Aabb,
|
|
CT_Circle,
|
|
CT_Obb,
|
|
CT_Arc
|
|
};
|
|
|
|
class Entity;
|
|
class ColliderComponent
|
|
{
|
|
public:
|
|
Entity* owner = nullptr;
|
|
ColliderType_e type = CT_None;
|
|
bool active = true;
|
|
int tag = 0;
|
|
int param1 = 0;
|
|
int param2 = 0;
|
|
|
|
bool Intersect(ColliderComponent* b);
|
|
bool IntersectEx(const a8::Vec2& pos, ColliderComponent* b);
|
|
bool IntersectSegment(a8::Vec2& p0, a8::Vec2& p1);
|
|
bool CalcSafePoint(ColliderComponent* b, a8::Vec2& new_pos);
|
|
bool CalcSafePointEx(const a8::Vec2& a_pos, ColliderComponent* b, a8::Vec2& new_pos);
|
|
};
|
|
|
|
class AabbCollider : public ColliderComponent
|
|
{
|
|
public:
|
|
a8::Vec2 _min;
|
|
a8::Vec2 _max;
|
|
|
|
AabbCollider() { type = CT_Aabb; };
|
|
void MoveCenter(float x, float y);
|
|
};
|
|
|
|
class ObbCollider : public ColliderComponent
|
|
{
|
|
public:
|
|
float rotate = 0;
|
|
|
|
ObbCollider() { type = CT_Obb; };
|
|
};
|
|
|
|
class CircleCollider : public ColliderComponent
|
|
{
|
|
public:
|
|
a8::Vec2 pos;
|
|
float rad = 0.0f;
|
|
|
|
CircleCollider() { type = CT_Circle; };
|
|
};
|
|
|
|
class ArcCollider : public ColliderComponent
|
|
{
|
|
public:
|
|
float width = 0.0f;
|
|
|
|
ArcCollider() { type = CT_Arc; };
|
|
};
|
|
|
|
void DestoryCollider(ColliderComponent* collider);
|
|
|
|
/*
|
|
--圆与旋转矩形碰撞
|
|
--rx ry 圆坐标
|
|
--r 圆半径
|
|
--dx dy 矩形坐标
|
|
--dw dh 矩形长宽
|
|
--dro 矩形旋转角度
|
|
*/
|
|
bool Check2dRotationRectangle(float rx, float ry, float r, float dx, float dy, float dw, float dh, float dro);
|