Collider碰撞体重做,所有的Collider合并为一个类,增加Collider::Type
This commit is contained in:
parent
bc4aa3eee5
commit
5ccae4a308
|
|
@ -1,63 +0,0 @@
|
||||||
#include "..\e2dcollider.h"
|
|
||||||
#include "..\e2dnode.h"
|
|
||||||
|
|
||||||
e2d::CircleCollider::CircleCollider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::CircleCollider::CircleCollider(Point center, double radius)
|
|
||||||
{
|
|
||||||
this->setCircle(center, radius);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::CircleCollider::CircleCollider(Node * node)
|
|
||||||
{
|
|
||||||
double minSide = std::min(node->getRealWidth(), node->getRealHeight());
|
|
||||||
this->setCircle(
|
|
||||||
Point(
|
|
||||||
node->getRealWidth() / 2,
|
|
||||||
node->getRealHeight() / 2
|
|
||||||
),
|
|
||||||
minSide / 2
|
|
||||||
);
|
|
||||||
this->setAutoResize(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::CircleCollider::~CircleCollider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::CircleCollider::setCircle(Point center, double radius)
|
|
||||||
{
|
|
||||||
SafeRelease(_geometry);
|
|
||||||
|
|
||||||
ID2D1EllipseGeometry* circle = nullptr;
|
|
||||||
Renderer::getFactory()->CreateEllipseGeometry(
|
|
||||||
D2D1::Ellipse(
|
|
||||||
D2D1::Point2F(
|
|
||||||
float(center.x),
|
|
||||||
float(center.y)
|
|
||||||
),
|
|
||||||
float(radius),
|
|
||||||
float(radius)
|
|
||||||
),
|
|
||||||
&circle
|
|
||||||
);
|
|
||||||
|
|
||||||
_geometry = circle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::CircleCollider::_resize()
|
|
||||||
{
|
|
||||||
if (_parentNode && _enabled)
|
|
||||||
{
|
|
||||||
double minSide = std::min(_parentNode->getRealWidth(), _parentNode->getRealHeight());
|
|
||||||
this->setCircle(
|
|
||||||
Point(
|
|
||||||
_parentNode->getRealWidth() / 2,
|
|
||||||
_parentNode->getRealHeight() / 2
|
|
||||||
),
|
|
||||||
minSide / 2
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
#include "..\e2dcollider.h"
|
|
||||||
#include "..\e2dnode.h"
|
|
||||||
|
|
||||||
e2d::EllipseCollider::EllipseCollider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::EllipseCollider::EllipseCollider(Point center, double radiusX, double radiusY)
|
|
||||||
{
|
|
||||||
this->setEllipse(center, radiusX, radiusY);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::EllipseCollider::EllipseCollider(Node * node)
|
|
||||||
{
|
|
||||||
this->setEllipse(
|
|
||||||
Point(
|
|
||||||
node->getWidth() / 2,
|
|
||||||
node->getHeight() / 2
|
|
||||||
),
|
|
||||||
node->getWidth() / 2,
|
|
||||||
node->getHeight() / 2
|
|
||||||
);
|
|
||||||
this->setAutoResize(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::EllipseCollider::~EllipseCollider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::EllipseCollider::setEllipse(Point center, double radiusX, double radiusY)
|
|
||||||
{
|
|
||||||
SafeRelease(_geometry);
|
|
||||||
|
|
||||||
ID2D1EllipseGeometry* ellipse = nullptr;
|
|
||||||
Renderer::getFactory()->CreateEllipseGeometry(
|
|
||||||
D2D1::Ellipse(
|
|
||||||
D2D1::Point2F(
|
|
||||||
float(center.x),
|
|
||||||
float(center.y)),
|
|
||||||
float(radiusX),
|
|
||||||
float(radiusY)),
|
|
||||||
&ellipse
|
|
||||||
);
|
|
||||||
_geometry = ellipse;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::EllipseCollider::_resize()
|
|
||||||
{
|
|
||||||
if (_parentNode && _enabled)
|
|
||||||
{
|
|
||||||
this->setEllipse(
|
|
||||||
Point(
|
|
||||||
_parentNode->getWidth() / 2,
|
|
||||||
_parentNode->getHeight() / 2
|
|
||||||
),
|
|
||||||
_parentNode->getWidth() / 2,
|
|
||||||
_parentNode->getHeight() / 2
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
#include "..\e2dcollider.h"
|
|
||||||
#include "..\e2dnode.h"
|
|
||||||
|
|
||||||
e2d::RectCollider::RectCollider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::RectCollider::RectCollider(double x, double y, double width, double height)
|
|
||||||
{
|
|
||||||
this->setRect(x, y, x + width, y + height);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::RectCollider::RectCollider(Node * node)
|
|
||||||
{
|
|
||||||
this->setRect(0, 0, node->getRealWidth(), node->getRealHeight());
|
|
||||||
this->setAutoResize(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
e2d::RectCollider::~RectCollider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::RectCollider::setRect(double left, double top, double right, double bottom)
|
|
||||||
{
|
|
||||||
SafeRelease(_geometry);
|
|
||||||
|
|
||||||
ID2D1RectangleGeometry* rectangle = nullptr;
|
|
||||||
Renderer::getFactory()->CreateRectangleGeometry(
|
|
||||||
D2D1::RectF(
|
|
||||||
float(left),
|
|
||||||
float(top),
|
|
||||||
float(right),
|
|
||||||
float(bottom)),
|
|
||||||
&rectangle
|
|
||||||
);
|
|
||||||
|
|
||||||
_geometry = rectangle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::RectCollider::_resize()
|
|
||||||
{
|
|
||||||
if (_parentNode && _enabled)
|
|
||||||
{
|
|
||||||
this->setRect(0, 0, _parentNode->getRealWidth(), _parentNode->getRealHeight());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -9,7 +9,7 @@ e2d::Collider::Collider()
|
||||||
, _transformed(nullptr)
|
, _transformed(nullptr)
|
||||||
, _geometry(nullptr)
|
, _geometry(nullptr)
|
||||||
, _enabled(true)
|
, _enabled(true)
|
||||||
, _autoResize(false)
|
, _type(Collider::Type::None)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -29,6 +29,16 @@ e2d::Color e2d::Collider::getColor() const
|
||||||
return _color;
|
return _color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ID2D1Geometry * e2d::Collider::getGeometry() const
|
||||||
|
{
|
||||||
|
return _geometry;
|
||||||
|
}
|
||||||
|
|
||||||
|
ID2D1TransformedGeometry * e2d::Collider::getTransformedGeometry() const
|
||||||
|
{
|
||||||
|
return _transformed;
|
||||||
|
}
|
||||||
|
|
||||||
void e2d::Collider::setEnabled(bool enabled)
|
void e2d::Collider::setEnabled(bool enabled)
|
||||||
{
|
{
|
||||||
_enabled = enabled;
|
_enabled = enabled;
|
||||||
|
|
@ -44,11 +54,6 @@ void e2d::Collider::setColor(Color color)
|
||||||
_color = color;
|
_color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Collider::setAutoResize(bool enabled)
|
|
||||||
{
|
|
||||||
_autoResize = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void e2d::Collider::_render()
|
void e2d::Collider::_render()
|
||||||
{
|
{
|
||||||
if (_transformed && _enabled)
|
if (_transformed && _enabled)
|
||||||
|
|
@ -83,29 +88,90 @@ e2d::Collider::Relation e2d::Collider::getRelationWith(Collider * pCollider) con
|
||||||
return Relation::Unknown;
|
return Relation::Unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Collider::_transform()
|
void e2d::Collider::_recreate(Collider::Type type)
|
||||||
{
|
{
|
||||||
if (_parentNode && _enabled && _geometry)
|
_type = type;
|
||||||
{
|
|
||||||
if (_autoResize)
|
|
||||||
{
|
|
||||||
this->_resize();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 释放原碰撞体
|
if (_parentNode)
|
||||||
|
{
|
||||||
|
SafeRelease(_geometry);
|
||||||
SafeRelease(_transformed);
|
SafeRelease(_transformed);
|
||||||
|
|
||||||
// 根据父节点转换几何图形
|
switch (type)
|
||||||
|
{
|
||||||
|
case Type::Rect:
|
||||||
|
{
|
||||||
|
ID2D1RectangleGeometry* rectangle = nullptr;
|
||||||
|
Renderer::getFactory()->CreateRectangleGeometry(
|
||||||
|
D2D1::RectF(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
float(_parentNode->getRealWidth()),
|
||||||
|
float(_parentNode->getRealHeight())),
|
||||||
|
&rectangle
|
||||||
|
);
|
||||||
|
_geometry = rectangle;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type::Circle:
|
||||||
|
{
|
||||||
|
double minSide = std::min(_parentNode->getRealWidth(), _parentNode->getRealHeight());
|
||||||
|
|
||||||
|
ID2D1EllipseGeometry* circle = nullptr;
|
||||||
|
Renderer::getFactory()->CreateEllipseGeometry(
|
||||||
|
D2D1::Ellipse(
|
||||||
|
D2D1::Point2F(
|
||||||
|
float(_parentNode->getRealWidth() / 2),
|
||||||
|
float(_parentNode->getRealHeight() / 2)
|
||||||
|
),
|
||||||
|
float(minSide / 2),
|
||||||
|
float(minSide / 2)
|
||||||
|
),
|
||||||
|
&circle
|
||||||
|
);
|
||||||
|
_geometry = circle;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type::Ellipse:
|
||||||
|
{
|
||||||
|
float halfWidth = float(_parentNode->getWidth() / 2),
|
||||||
|
halfHeight = float(_parentNode->getHeight() / 2);
|
||||||
|
|
||||||
|
ID2D1EllipseGeometry* ellipse = nullptr;
|
||||||
|
Renderer::getFactory()->CreateEllipseGeometry(
|
||||||
|
D2D1::Ellipse(
|
||||||
|
D2D1::Point2F(
|
||||||
|
halfWidth,
|
||||||
|
halfHeight),
|
||||||
|
halfWidth,
|
||||||
|
halfHeight),
|
||||||
|
&ellipse
|
||||||
|
);
|
||||||
|
_geometry = ellipse;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Collider::_transform()
|
||||||
|
{
|
||||||
|
if (_parentNode && _enabled)
|
||||||
|
{
|
||||||
|
// 重新生成碰撞体
|
||||||
|
_recreate(_type);
|
||||||
|
// 二维变换
|
||||||
Renderer::getFactory()->CreateTransformedGeometry(
|
Renderer::getFactory()->CreateTransformedGeometry(
|
||||||
_geometry,
|
_geometry,
|
||||||
_parentNode->_finalMatri,
|
_parentNode->_finalMatri,
|
||||||
&_transformed
|
&_transformed
|
||||||
);
|
);
|
||||||
|
// 通知碰撞体管理器
|
||||||
ColliderManager::__updateCollider(this);
|
ColliderManager::__updateCollider(this);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
SafeRelease(_transformed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -54,11 +54,6 @@ void e2d::ColliderManager::__addCollider(Collider * pCollider)
|
||||||
{
|
{
|
||||||
if (pCollider)
|
if (pCollider)
|
||||||
{
|
{
|
||||||
if (pCollider->_parentNode)
|
|
||||||
{
|
|
||||||
WARN("ColliderManager::__add Failed! The shape is already added.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pCollider->retain();
|
pCollider->retain();
|
||||||
s_vColliders.push_back(pCollider);
|
s_vColliders.push_back(pCollider);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,15 +31,13 @@ e2d::Node::Node()
|
||||||
, _needTransform(false)
|
, _needTransform(false)
|
||||||
, _autoUpdate(true)
|
, _autoUpdate(true)
|
||||||
, _positionFixed(false)
|
, _positionFixed(false)
|
||||||
|
, _colliderType(Collider::Type::None)
|
||||||
{
|
{
|
||||||
Point defPivot = Game::getInstance()->getConfig()->getNodeDefaultPivot();
|
Point defPivot = Game::getInstance()->getConfig()->getNodeDefaultPivot();
|
||||||
_pivotX = float(defPivot.x);
|
this->_pivotX = float(defPivot.x);
|
||||||
_pivotY = float(defPivot.y);
|
this->_pivotY = float(defPivot.y);
|
||||||
|
|
||||||
if (s_fDefaultColliderType != Collider::Type::None)
|
this->setColliderType(s_fDefaultColliderType);
|
||||||
{
|
|
||||||
this->setCollider(s_fDefaultColliderType);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
e2d::Node::~Node()
|
e2d::Node::~Node()
|
||||||
|
|
@ -189,7 +187,7 @@ void e2d::Node::_updateTransform()
|
||||||
_finalMatri = _finalMatri * _parent->_initialMatri;
|
_finalMatri = _finalMatri * _parent->_initialMatri;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绑定于自身的碰撞体也进行相应转换
|
// 重新生成碰撞体
|
||||||
if (_collider)
|
if (_collider)
|
||||||
{
|
{
|
||||||
_collider->_transform();
|
_collider->_transform();
|
||||||
|
|
@ -539,56 +537,53 @@ void e2d::Node::setProperty(Property prop)
|
||||||
this->setSkew(prop.skewAngleX, prop.skewAngleY);
|
this->setSkew(prop.skewAngleX, prop.skewAngleY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Node::setCollider(Collider::Type type)
|
void e2d::Node::setColliderType(Collider::Type type)
|
||||||
|
{
|
||||||
|
if (_colliderType == type)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_colliderType = type;
|
||||||
|
if (_collider)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case Collider::Type::Rect:
|
case Collider::Type::Rect:
|
||||||
{
|
|
||||||
this->setCollider(Create<RectCollider>(this));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Collider::Type::Circle:
|
case Collider::Type::Circle:
|
||||||
{
|
|
||||||
this->setCollider(Create<CircleCollider>(this));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case Collider::Type::Ellipse:
|
case Collider::Type::Ellipse:
|
||||||
{
|
{
|
||||||
this->setCollider(Create<EllipseCollider>(this));
|
this->_collider->_recreate(type);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case Collider::Type::None:
|
default:
|
||||||
{
|
{
|
||||||
this->setCollider(nullptr);
|
// 删除碰撞体
|
||||||
|
ColliderManager::__removeCollider(_collider);
|
||||||
|
_collider = nullptr;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case Collider::Type::Rect:
|
||||||
|
case Collider::Type::Circle:
|
||||||
|
case Collider::Type::Ellipse:
|
||||||
|
{
|
||||||
|
this->_collider = Create<Collider>();
|
||||||
|
this->_collider->_parentNode = this;
|
||||||
|
this->_collider->_recreate(type);
|
||||||
|
// 添加新的碰撞体
|
||||||
|
ColliderManager::__addCollider(this->_collider);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Node::setCollider(Collider * pCollider)
|
|
||||||
{
|
|
||||||
// 删除旧的碰撞体
|
|
||||||
ColliderManager::__removeCollider(_collider);
|
|
||||||
// 添加新的碰撞体
|
|
||||||
ColliderManager::__addCollider(pCollider);
|
|
||||||
|
|
||||||
if (pCollider)
|
|
||||||
{
|
|
||||||
// 双向绑定
|
|
||||||
this->_collider = pCollider;
|
|
||||||
pCollider->_parentNode = this;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->_collider = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
void e2d::Node::addChild(Node * child, int order /* = 0 */)
|
||||||
|
|
@ -813,9 +808,9 @@ bool e2d::Node::containsPoint(const Point& point) const
|
||||||
{
|
{
|
||||||
BOOL ret = 0;
|
BOOL ret = 0;
|
||||||
// 如果存在碰撞体,用碰撞体判断
|
// 如果存在碰撞体,用碰撞体判断
|
||||||
if (_collider)
|
if (_collider && _collider->getGeometry())
|
||||||
{
|
{
|
||||||
_collider->getD2dGeometry()->FillContainsPoint(
|
_collider->getGeometry()->FillContainsPoint(
|
||||||
D2D1::Point2F(
|
D2D1::Point2F(
|
||||||
float(point.x),
|
float(point.x),
|
||||||
float(point.y)),
|
float(point.y)),
|
||||||
|
|
|
||||||
|
|
@ -122,184 +122,4 @@ private:
|
||||||
static void __clearListeners();
|
static void __clearListeners();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 碰撞体
|
|
||||||
class Collider :
|
|
||||||
public Object
|
|
||||||
{
|
|
||||||
friend class ColliderManager;
|
|
||||||
friend class Node;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// 碰撞体类别
|
|
||||||
enum class Type
|
|
||||||
{
|
|
||||||
None, /* 无 */
|
|
||||||
Rect, /* 矩形 */
|
|
||||||
Circle, /* 圆形 */
|
|
||||||
Ellipse /* 椭圆形 */
|
|
||||||
};
|
|
||||||
|
|
||||||
// 碰撞体交集关系
|
|
||||||
enum class Relation : int
|
|
||||||
{
|
|
||||||
Unknown = 0, /* 关系不确定 */
|
|
||||||
Disjoin = 1, /* 没有交集 */
|
|
||||||
IsContained = 2, /* 完全被包含 */
|
|
||||||
Contains = 3, /* 完全包含 */
|
|
||||||
Overlap = 4 /* 部分重叠 */
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
Collider();
|
|
||||||
|
|
||||||
virtual ~Collider();
|
|
||||||
|
|
||||||
// 判断两碰撞体的交集关系
|
|
||||||
virtual Relation getRelationWith(
|
|
||||||
Collider * pCollider
|
|
||||||
) const;
|
|
||||||
|
|
||||||
// 获取父节点
|
|
||||||
Node * getParentNode() const;
|
|
||||||
|
|
||||||
// 获取绘制颜色
|
|
||||||
Color getColor() const;
|
|
||||||
|
|
||||||
// 启用或关闭该碰撞体
|
|
||||||
virtual void setEnabled(
|
|
||||||
bool enabled
|
|
||||||
);
|
|
||||||
|
|
||||||
// 设置碰撞体的可见性
|
|
||||||
void setVisiable(
|
|
||||||
bool bVisiable
|
|
||||||
);
|
|
||||||
|
|
||||||
// 设置绘制颜色
|
|
||||||
void setColor(
|
|
||||||
Color color
|
|
||||||
);
|
|
||||||
|
|
||||||
// 设置大小跟随
|
|
||||||
void setAutoResize(
|
|
||||||
bool enabled
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 转换碰撞体
|
|
||||||
virtual void _transform();
|
|
||||||
|
|
||||||
// 重设大小
|
|
||||||
virtual void _resize() = 0;
|
|
||||||
|
|
||||||
// 渲染碰撞体
|
|
||||||
virtual void _render();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool _enabled;
|
|
||||||
bool _visiable;
|
|
||||||
bool _autoResize;
|
|
||||||
Color _color;
|
|
||||||
Node * _parentNode;
|
|
||||||
ID2D1Geometry* _geometry;
|
|
||||||
ID2D1TransformedGeometry* _transformed;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 矩形碰撞体
|
|
||||||
class RectCollider :
|
|
||||||
public Collider
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
RectCollider();
|
|
||||||
|
|
||||||
explicit RectCollider(
|
|
||||||
double x,
|
|
||||||
double y,
|
|
||||||
double width,
|
|
||||||
double height
|
|
||||||
);
|
|
||||||
|
|
||||||
explicit RectCollider(
|
|
||||||
Node * node
|
|
||||||
);
|
|
||||||
|
|
||||||
virtual ~RectCollider();
|
|
||||||
|
|
||||||
// 修改矩形碰撞体大小
|
|
||||||
void setRect(
|
|
||||||
double left,
|
|
||||||
double top,
|
|
||||||
double right,
|
|
||||||
double bottom
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 重设大小
|
|
||||||
virtual void _resize();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 圆形碰撞体
|
|
||||||
class CircleCollider :
|
|
||||||
public Collider
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CircleCollider();
|
|
||||||
|
|
||||||
explicit CircleCollider(
|
|
||||||
Point center,
|
|
||||||
double radius
|
|
||||||
);
|
|
||||||
|
|
||||||
explicit CircleCollider(
|
|
||||||
Node * node
|
|
||||||
);
|
|
||||||
|
|
||||||
virtual ~CircleCollider();
|
|
||||||
|
|
||||||
// 修改圆形碰撞体大小
|
|
||||||
void setCircle(
|
|
||||||
Point center,
|
|
||||||
double radius
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 重设大小
|
|
||||||
virtual void _resize();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 椭圆形碰撞体
|
|
||||||
class EllipseCollider :
|
|
||||||
public Collider
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EllipseCollider();
|
|
||||||
|
|
||||||
explicit EllipseCollider(
|
|
||||||
Point center,
|
|
||||||
double radiusX,
|
|
||||||
double radiusY
|
|
||||||
);
|
|
||||||
|
|
||||||
explicit EllipseCollider(
|
|
||||||
Node * node
|
|
||||||
);
|
|
||||||
|
|
||||||
virtual ~EllipseCollider();
|
|
||||||
|
|
||||||
// 修改椭圆碰撞体大小
|
|
||||||
void setEllipse(
|
|
||||||
Point center,
|
|
||||||
double radiusX,
|
|
||||||
double radiusY
|
|
||||||
);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// 重设大小
|
|
||||||
virtual void _resize();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -697,6 +697,95 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ColliderManager;
|
||||||
|
|
||||||
|
// 碰撞体
|
||||||
|
class Collider :
|
||||||
|
public Object
|
||||||
|
{
|
||||||
|
friend class Node;
|
||||||
|
friend class ColliderManager;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// 碰撞体类别
|
||||||
|
enum class Type
|
||||||
|
{
|
||||||
|
None, /* 无 */
|
||||||
|
Rect, /* 矩形 */
|
||||||
|
Circle, /* 圆形 */
|
||||||
|
Ellipse /* 椭圆形 */
|
||||||
|
};
|
||||||
|
|
||||||
|
// 碰撞体交集关系
|
||||||
|
enum class Relation : int
|
||||||
|
{
|
||||||
|
Unknown = 0, /* 关系不确定 */
|
||||||
|
Disjoin = 1, /* 没有交集 */
|
||||||
|
IsContained = 2, /* 完全被包含 */
|
||||||
|
Contains = 3, /* 完全包含 */
|
||||||
|
Overlap = 4 /* 部分重叠 */
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
Collider();
|
||||||
|
|
||||||
|
virtual ~Collider();
|
||||||
|
|
||||||
|
// 启用或关闭该碰撞体
|
||||||
|
virtual void setEnabled(
|
||||||
|
bool enabled
|
||||||
|
);
|
||||||
|
|
||||||
|
// 设置碰撞体的可见性
|
||||||
|
void setVisiable(
|
||||||
|
bool bVisiable
|
||||||
|
);
|
||||||
|
|
||||||
|
// 设置绘制颜色
|
||||||
|
void setColor(
|
||||||
|
Color color
|
||||||
|
);
|
||||||
|
|
||||||
|
// 判断两碰撞体的交集关系
|
||||||
|
virtual Relation getRelationWith(
|
||||||
|
Collider * pCollider
|
||||||
|
) const;
|
||||||
|
|
||||||
|
// 获取父节点
|
||||||
|
Node * getParentNode() const;
|
||||||
|
|
||||||
|
// 获取绘制颜色
|
||||||
|
Color getColor() const;
|
||||||
|
|
||||||
|
// 获取 ID2D1Geometry* 对象
|
||||||
|
ID2D1Geometry* getGeometry() const;
|
||||||
|
|
||||||
|
// 获取 ID2D1TransformedGeometry* 对象
|
||||||
|
ID2D1TransformedGeometry* getTransformedGeometry() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// 重新生成
|
||||||
|
void _recreate(
|
||||||
|
Collider::Type type
|
||||||
|
);
|
||||||
|
|
||||||
|
// 二维变换
|
||||||
|
void _transform();
|
||||||
|
|
||||||
|
// 渲染碰撞体
|
||||||
|
void _render();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool _enabled;
|
||||||
|
bool _visiable;
|
||||||
|
Color _color;
|
||||||
|
Node * _parentNode;
|
||||||
|
Type _type;
|
||||||
|
ID2D1Geometry* _geometry;
|
||||||
|
ID2D1TransformedGeometry* _transformed;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
#if _MSC_VER > 1700
|
#if _MSC_VER > 1700
|
||||||
|
|
||||||
// 创建可自动回收内存的对象
|
// 创建可自动回收内存的对象
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "e2dbase.h"
|
#include "e2dbase.h"
|
||||||
#include "e2dcollider.h"
|
|
||||||
|
|
||||||
namespace e2d
|
namespace e2d
|
||||||
{
|
{
|
||||||
|
|
@ -8,7 +7,6 @@ namespace e2d
|
||||||
|
|
||||||
class Action;
|
class Action;
|
||||||
class Transition;
|
class Transition;
|
||||||
class ColliderManager;
|
|
||||||
|
|
||||||
class Node :
|
class Node :
|
||||||
public Object
|
public Object
|
||||||
|
|
@ -16,7 +14,6 @@ class Node :
|
||||||
friend class Scene;
|
friend class Scene;
|
||||||
friend class Collider;
|
friend class Collider;
|
||||||
friend class Transition;
|
friend class Transition;
|
||||||
friend class ColliderManager;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// 节点属性
|
// 节点属性
|
||||||
|
|
@ -334,16 +331,11 @@ public:
|
||||||
Property prop
|
Property prop
|
||||||
);
|
);
|
||||||
|
|
||||||
// ÉèÖÃÅöײÌå
|
// ÉèÖÃÅöײÌåÀàÐÍ
|
||||||
virtual void setCollider(
|
virtual void setColliderType(
|
||||||
Collider::Type type
|
Collider::Type type
|
||||||
);
|
);
|
||||||
|
|
||||||
// ÉèÖÃÅöײÌå
|
|
||||||
virtual void setCollider(
|
|
||||||
Collider * pCollider
|
|
||||||
);
|
|
||||||
|
|
||||||
// 添加子节点
|
// 添加子节点
|
||||||
virtual void addChild(
|
virtual void addChild(
|
||||||
Node * child,
|
Node * child,
|
||||||
|
|
@ -445,6 +437,7 @@ protected:
|
||||||
Collider * _collider;
|
Collider * _collider;
|
||||||
Scene * _parentScene;
|
Scene * _parentScene;
|
||||||
Node * _parent;
|
Node * _parent;
|
||||||
|
Collider::Type _colliderType;
|
||||||
D2D1::Matrix3x2F _initialMatri;
|
D2D1::Matrix3x2F _initialMatri;
|
||||||
D2D1::Matrix3x2F _finalMatri;
|
D2D1::Matrix3x2F _finalMatri;
|
||||||
std::vector<Node*> _children;
|
std::vector<Node*> _children;
|
||||||
|
|
|
||||||
|
|
@ -58,11 +58,8 @@
|
||||||
<ClCompile Include="..\..\core\Base\Renderer.cpp" />
|
<ClCompile Include="..\..\core\Base\Renderer.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\CircleCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collision.cpp" />
|
<ClCompile Include="..\..\core\Collider\Collision.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\EllipseCollider.cpp" />
|
<ClCompile Include="..\..\core\Common\Collider.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\RectCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Common\Color.cpp" />
|
<ClCompile Include="..\..\core\Common\Color.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Config.cpp" />
|
<ClCompile Include="..\..\core\Common\Config.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -122,20 +122,11 @@
|
||||||
<ClCompile Include="..\..\core\Base\Window.cpp">
|
<ClCompile Include="..\..\core\Base\Window.cpp">
|
||||||
<Filter>Base</Filter>
|
<Filter>Base</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Collider\CircleCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collision.cpp">
|
<ClCompile Include="..\..\core\Collider\Collision.cpp">
|
||||||
<Filter>Collider</Filter>
|
<Filter>Collider</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Collider\EllipseCollider.cpp">
|
<ClCompile Include="..\..\core\Common\Collider.cpp">
|
||||||
<Filter>Collider</Filter>
|
<Filter>Common</Filter>
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\RectCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Common\Color.cpp">
|
<ClCompile Include="..\..\core\Common\Color.cpp">
|
||||||
<Filter>Common</Filter>
|
<Filter>Common</Filter>
|
||||||
|
|
|
||||||
|
|
@ -202,11 +202,8 @@
|
||||||
<ClCompile Include="..\..\core\Base\Renderer.cpp" />
|
<ClCompile Include="..\..\core\Base\Renderer.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\CircleCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collision.cpp" />
|
<ClCompile Include="..\..\core\Collider\Collision.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\EllipseCollider.cpp" />
|
<ClCompile Include="..\..\core\Common\Collider.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\RectCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Common\Color.cpp" />
|
<ClCompile Include="..\..\core\Common\Color.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Config.cpp" />
|
<ClCompile Include="..\..\core\Common\Config.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -122,20 +122,11 @@
|
||||||
<ClCompile Include="..\..\core\Base\Window.cpp">
|
<ClCompile Include="..\..\core\Base\Window.cpp">
|
||||||
<Filter>Base</Filter>
|
<Filter>Base</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Collider\CircleCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collision.cpp">
|
<ClCompile Include="..\..\core\Collider\Collision.cpp">
|
||||||
<Filter>Collider</Filter>
|
<Filter>Collider</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Collider\EllipseCollider.cpp">
|
<ClCompile Include="..\..\core\Common\Collider.cpp">
|
||||||
<Filter>Collider</Filter>
|
<Filter>Common</Filter>
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\RectCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Common\Color.cpp">
|
<ClCompile Include="..\..\core\Common\Color.cpp">
|
||||||
<Filter>Common</Filter>
|
<Filter>Common</Filter>
|
||||||
|
|
|
||||||
|
|
@ -221,11 +221,8 @@
|
||||||
<ClCompile Include="..\..\core\Base\Renderer.cpp" />
|
<ClCompile Include="..\..\core\Base\Renderer.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
<ClCompile Include="..\..\core\Base\Time.cpp" />
|
||||||
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
<ClCompile Include="..\..\core\Base\Window.cpp" />
|
||||||
<ClCompile Include="..\..\core\Collider\Collider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\CircleCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\EllipseCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\RectCollider.cpp" />
|
|
||||||
<ClCompile Include="..\..\core\Collider\Collision.cpp" />
|
<ClCompile Include="..\..\core\Collider\Collision.cpp" />
|
||||||
|
<ClCompile Include="..\..\core\Common\Collider.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Color.cpp" />
|
<ClCompile Include="..\..\core\Common\Color.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Config.cpp" />
|
<ClCompile Include="..\..\core\Common\Config.cpp" />
|
||||||
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
<ClCompile Include="..\..\core\Common\Font.cpp" />
|
||||||
|
|
|
||||||
|
|
@ -99,9 +99,6 @@
|
||||||
<ClCompile Include="..\..\core\Tool\Path.cpp">
|
<ClCompile Include="..\..\core\Tool\Path.cpp">
|
||||||
<Filter>Tool</Filter>
|
<Filter>Tool</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Collider\Collider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Manager\ColliderManager.cpp">
|
<ClCompile Include="..\..\core\Manager\ColliderManager.cpp">
|
||||||
<Filter>Manager</Filter>
|
<Filter>Manager</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
@ -219,15 +216,6 @@
|
||||||
<ClCompile Include="..\..\core\Transition\MoveTransition.cpp">
|
<ClCompile Include="..\..\core\Transition\MoveTransition.cpp">
|
||||||
<Filter>Transition</Filter>
|
<Filter>Transition</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\core\Collider\CircleCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\EllipseCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Collider\RectCollider.cpp">
|
|
||||||
<Filter>Collider</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\core\Action\FiniteTimeAction.cpp">
|
<ClCompile Include="..\..\core\Action\FiniteTimeAction.cpp">
|
||||||
<Filter>Action</Filter>
|
<Filter>Action</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
@ -246,6 +234,9 @@
|
||||||
<ClCompile Include="..\..\core\Common\Config.cpp">
|
<ClCompile Include="..\..\core\Common\Config.cpp">
|
||||||
<Filter>Common</Filter>
|
<Filter>Common</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\core\Common\Collider.cpp">
|
||||||
|
<Filter>Common</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\core\easy2d.h" />
|
<ClInclude Include="..\..\core\easy2d.h" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue