310 lines
4.5 KiB
C++
310 lines
4.5 KiB
C++
#pragma once
|
|
#include "e2dbase.h"
|
|
|
|
|
|
namespace e2d
|
|
{
|
|
|
|
|
|
|
|
class ColliderManager;
|
|
|
|
// 碰撞事件
|
|
class Collision
|
|
{
|
|
friend Game;
|
|
friend ColliderManager;
|
|
|
|
public:
|
|
// 添加可互相碰撞物体的名称
|
|
static void addName(
|
|
const String& name1,
|
|
const String& name2
|
|
);
|
|
|
|
// 添加可互相碰撞物体的名称
|
|
static void addName(
|
|
const std::vector<std::pair<String, String> >& names
|
|
);
|
|
|
|
// 判断两个物体是否是可碰撞的
|
|
static bool isCollidable(
|
|
Node * node1,
|
|
Node * node2
|
|
);
|
|
|
|
// 判断两个物体是否是可碰撞的
|
|
static bool isCollidable(
|
|
const String& name1,
|
|
const String& name2
|
|
);
|
|
|
|
// 获取碰撞发生时的主动体
|
|
static Node * getActiveNode();
|
|
|
|
// 获取碰撞发生时的被动体
|
|
static Node * getPassiveNode();
|
|
|
|
// 判断碰撞是否由该节点引发
|
|
// 如果是,返回与其相撞的节点指针,否则返回空
|
|
static Node * isCausedBy(
|
|
Node * node
|
|
);
|
|
|
|
// 判断发生碰撞的节点名称是否相同
|
|
// 若相同,返回其指针,否则返回空
|
|
static Node * isCausedBy(
|
|
const String& name
|
|
);
|
|
|
|
// 开启或关闭物体碰撞监听功能(默认关闭)
|
|
static void setEnable(
|
|
bool enable
|
|
);
|
|
|
|
// 是否打开了物体碰撞监听
|
|
static bool isEnable();
|
|
|
|
// 添加碰撞监听
|
|
static void addListener(
|
|
const Function& func, /* 监听到碰撞时的执行函数 */
|
|
const String& name = L"", /* 监听器名称 */
|
|
bool paused = false /* 是否暂停 */
|
|
);
|
|
|
|
// 暂停碰撞监听
|
|
static void pauseListener(
|
|
const String& name
|
|
);
|
|
|
|
// 暂停碰撞监听
|
|
static void resumeListener(
|
|
const String& name
|
|
);
|
|
|
|
// 停止碰撞监听
|
|
static void stopListener(
|
|
const String& name
|
|
);
|
|
|
|
// 暂停所有监听器
|
|
static void pauseAllListeners();
|
|
|
|
// 继续所有监听器
|
|
static void resumeAllListeners();
|
|
|
|
// 停止所有监听器
|
|
static void stopAllListeners();
|
|
|
|
private:
|
|
// 更新监听器
|
|
static void __update(
|
|
Node * active,
|
|
Node * passive
|
|
);
|
|
|
|
// 清空监听器
|
|
static void __clearListeners();
|
|
};
|
|
|
|
|
|
// 碰撞体
|
|
class Collider :
|
|
public Object
|
|
{
|
|
friend ColliderManager;
|
|
friend Node;
|
|
|
|
public:
|
|
// 碰撞体类别
|
|
enum class Type : int
|
|
{
|
|
NONE, /* 无 */
|
|
RECT, /* 矩形 */
|
|
CIRCLE, /* 圆形 */
|
|
ELLIPSE /* 椭圆形 */
|
|
};
|
|
|
|
// 碰撞体交集关系
|
|
enum class Relation : int
|
|
{
|
|
UNKNOWN = 0, /* 关系不确定 */
|
|
DISJOIN = 1, /* 没有交集 */
|
|
IS_CONTAINED = 2, /* 完全被包含 */
|
|
CONTAINS = 3, /* 完全包含 */
|
|
OVERLAP = 4 /* 部分重叠 */
|
|
};
|
|
|
|
public:
|
|
Collider();
|
|
|
|
virtual ~Collider();
|
|
|
|
// 判断两碰撞体的交集关系
|
|
virtual Relation getRelationWith(
|
|
Collider * pCollider
|
|
) const;
|
|
|
|
// 获取父节点
|
|
Node * getParentNode() const;
|
|
|
|
// 获取绘制颜色
|
|
Color getColor() const;
|
|
|
|
// 启用或关闭该碰撞体
|
|
virtual void setEnable(
|
|
bool enable
|
|
);
|
|
|
|
// 设置碰撞体的可见性
|
|
void setVisiable(
|
|
bool bVisiable
|
|
);
|
|
|
|
// 设置绘制颜色
|
|
void setColor(
|
|
Color color
|
|
);
|
|
|
|
// 设置大小跟随
|
|
void setAutoResize(
|
|
bool enable
|
|
);
|
|
|
|
// 获取 ID2D1Geometry 对象
|
|
virtual ID2D1Geometry * getD2dGeometry() const = 0;
|
|
|
|
protected:
|
|
// 转换碰撞体
|
|
virtual void _transform();
|
|
|
|
// 重设大小
|
|
virtual void _resize() = 0;
|
|
|
|
// 渲染碰撞体
|
|
virtual void _render();
|
|
|
|
protected:
|
|
bool _enable;
|
|
bool _visiable;
|
|
bool _autoResize;
|
|
Color _color;
|
|
Node * _parentNode;
|
|
ID2D1TransformedGeometry * _transformed;
|
|
};
|
|
|
|
|
|
// 矩形碰撞体
|
|
class ColliderRect :
|
|
public Collider
|
|
{
|
|
public:
|
|
ColliderRect();
|
|
|
|
ColliderRect(
|
|
double x,
|
|
double y,
|
|
double width,
|
|
double height
|
|
);
|
|
|
|
ColliderRect(
|
|
Node * node
|
|
);
|
|
|
|
virtual ~ColliderRect();
|
|
|
|
// 修改矩形碰撞体大小
|
|
void setRect(
|
|
double left,
|
|
double top,
|
|
double right,
|
|
double bottom
|
|
);
|
|
|
|
// 获取 ID2D1Geometry 对象
|
|
virtual ID2D1RectangleGeometry * getD2dGeometry() const override;
|
|
|
|
protected:
|
|
// 重设大小
|
|
virtual void _resize();
|
|
|
|
protected:
|
|
ID2D1RectangleGeometry * _d2dRectangle;
|
|
};
|
|
|
|
|
|
// 圆形碰撞体
|
|
class ColliderCircle :
|
|
public Collider
|
|
{
|
|
public:
|
|
ColliderCircle();
|
|
|
|
ColliderCircle(
|
|
Point center,
|
|
double radius
|
|
);
|
|
|
|
ColliderCircle(
|
|
Node * node
|
|
);
|
|
|
|
virtual ~ColliderCircle();
|
|
|
|
// 修改圆形碰撞体大小
|
|
void setCircle(
|
|
Point center,
|
|
double radius
|
|
);
|
|
|
|
// 获取 ID2D1Geometry 对象
|
|
virtual ID2D1EllipseGeometry * getD2dGeometry() const override;
|
|
|
|
protected:
|
|
// 重设大小
|
|
virtual void _resize();
|
|
|
|
protected:
|
|
ID2D1EllipseGeometry * _d2dCircle;
|
|
};
|
|
|
|
|
|
// 椭圆形碰撞体
|
|
class ColliderEllipse :
|
|
public Collider
|
|
{
|
|
public:
|
|
ColliderEllipse();
|
|
|
|
ColliderEllipse(
|
|
Point center,
|
|
double radiusX,
|
|
double radiusY
|
|
);
|
|
|
|
ColliderEllipse(
|
|
Node * node
|
|
);
|
|
|
|
virtual ~ColliderEllipse();
|
|
|
|
// 修改椭圆碰撞体大小
|
|
void setEllipse(
|
|
Point center,
|
|
double radiusX,
|
|
double radiusY
|
|
);
|
|
|
|
// 获取 ID2D1Geometry 对象
|
|
virtual ID2D1EllipseGeometry * getD2dGeometry() const override;
|
|
|
|
protected:
|
|
// 重设大小
|
|
virtual void _resize();
|
|
|
|
protected:
|
|
ID2D1EllipseGeometry * _d2dEllipse;
|
|
};
|
|
|
|
} |