Collider内部实现细节调整

This commit is contained in:
Nomango 2018-07-04 17:23:47 +08:00
parent 2c0f7c5178
commit bc4aa3eee5
5 changed files with 29 additions and 60 deletions

View File

@ -2,18 +2,15 @@
#include "..\e2dnode.h" #include "..\e2dnode.h"
e2d::CircleCollider::CircleCollider() e2d::CircleCollider::CircleCollider()
: _d2dCircle(nullptr)
{ {
} }
e2d::CircleCollider::CircleCollider(Point center, double radius) e2d::CircleCollider::CircleCollider(Point center, double radius)
: _d2dCircle(nullptr)
{ {
this->setCircle(center, radius); this->setCircle(center, radius);
} }
e2d::CircleCollider::CircleCollider(Node * node) e2d::CircleCollider::CircleCollider(Node * node)
: _d2dCircle(nullptr)
{ {
double minSide = std::min(node->getRealWidth(), node->getRealHeight()); double minSide = std::min(node->getRealWidth(), node->getRealHeight());
this->setCircle( this->setCircle(
@ -28,22 +25,26 @@ e2d::CircleCollider::CircleCollider(Node * node)
e2d::CircleCollider::~CircleCollider() e2d::CircleCollider::~CircleCollider()
{ {
SafeRelease(_d2dCircle);
} }
void e2d::CircleCollider::setCircle(Point center, double radius) void e2d::CircleCollider::setCircle(Point center, double radius)
{ {
SafeRelease(_d2dCircle); SafeRelease(_geometry);
ID2D1EllipseGeometry* circle = nullptr;
Renderer::getFactory()->CreateEllipseGeometry( Renderer::getFactory()->CreateEllipseGeometry(
D2D1::Ellipse( D2D1::Ellipse(
D2D1::Point2F( D2D1::Point2F(
float(center.x), float(center.x),
float(center.y)), float(center.y)
),
float(radius), float(radius),
float(radius)), float(radius)
&_d2dCircle ),
&circle
); );
_geometry = circle;
} }
void e2d::CircleCollider::_resize() void e2d::CircleCollider::_resize()
@ -60,8 +61,3 @@ void e2d::CircleCollider::_resize()
); );
} }
} }
ID2D1EllipseGeometry * e2d::CircleCollider::getD2dGeometry() const
{
return _d2dCircle;
}

View File

@ -7,6 +7,7 @@ e2d::Collider::Collider()
, _color(Color::Red, 0.7) , _color(Color::Red, 0.7)
, _parentNode(nullptr) , _parentNode(nullptr)
, _transformed(nullptr) , _transformed(nullptr)
, _geometry(nullptr)
, _enabled(true) , _enabled(true)
, _autoResize(false) , _autoResize(false)
{ {
@ -15,6 +16,7 @@ e2d::Collider::Collider()
e2d::Collider::~Collider() e2d::Collider::~Collider()
{ {
SafeRelease(_transformed); SafeRelease(_transformed);
SafeRelease(_geometry);
} }
e2d::Node * e2d::Collider::getParentNode() const e2d::Node * e2d::Collider::getParentNode() const
@ -83,7 +85,7 @@ e2d::Collider::Relation e2d::Collider::getRelationWith(Collider * pCollider) con
void e2d::Collider::_transform() void e2d::Collider::_transform()
{ {
if (_parentNode && _enabled) if (_parentNode && _enabled && _geometry)
{ {
if (_autoResize) if (_autoResize)
{ {
@ -95,11 +97,15 @@ void e2d::Collider::_transform()
// 根据父节点转换几何图形 // 根据父节点转换几何图形
Renderer::getFactory()->CreateTransformedGeometry( Renderer::getFactory()->CreateTransformedGeometry(
getD2dGeometry(), _geometry,
_parentNode->_finalMatri, _parentNode->_finalMatri,
&_transformed &_transformed
); );
ColliderManager::__updateCollider(this); ColliderManager::__updateCollider(this);
} }
else
{
SafeRelease(_transformed);
}
} }

View File

@ -2,18 +2,15 @@
#include "..\e2dnode.h" #include "..\e2dnode.h"
e2d::EllipseCollider::EllipseCollider() e2d::EllipseCollider::EllipseCollider()
: _d2dEllipse(nullptr)
{ {
} }
e2d::EllipseCollider::EllipseCollider(Point center, double radiusX, double radiusY) e2d::EllipseCollider::EllipseCollider(Point center, double radiusX, double radiusY)
: _d2dEllipse(nullptr)
{ {
this->setEllipse(center, radiusX, radiusY); this->setEllipse(center, radiusX, radiusY);
} }
e2d::EllipseCollider::EllipseCollider(Node * node) e2d::EllipseCollider::EllipseCollider(Node * node)
: _d2dEllipse(nullptr)
{ {
this->setEllipse( this->setEllipse(
Point( Point(
@ -28,13 +25,13 @@ e2d::EllipseCollider::EllipseCollider(Node * node)
e2d::EllipseCollider::~EllipseCollider() e2d::EllipseCollider::~EllipseCollider()
{ {
SafeRelease(_d2dEllipse);
} }
void e2d::EllipseCollider::setEllipse(Point center, double radiusX, double radiusY) void e2d::EllipseCollider::setEllipse(Point center, double radiusX, double radiusY)
{ {
SafeRelease(_d2dEllipse); SafeRelease(_geometry);
ID2D1EllipseGeometry* ellipse = nullptr;
Renderer::getFactory()->CreateEllipseGeometry( Renderer::getFactory()->CreateEllipseGeometry(
D2D1::Ellipse( D2D1::Ellipse(
D2D1::Point2F( D2D1::Point2F(
@ -42,8 +39,9 @@ void e2d::EllipseCollider::setEllipse(Point center, double radiusX, double radiu
float(center.y)), float(center.y)),
float(radiusX), float(radiusX),
float(radiusY)), float(radiusY)),
&_d2dEllipse &ellipse
); );
_geometry = ellipse;
} }
void e2d::EllipseCollider::_resize() void e2d::EllipseCollider::_resize()
@ -60,8 +58,3 @@ void e2d::EllipseCollider::_resize()
); );
} }
} }
ID2D1EllipseGeometry * e2d::EllipseCollider::getD2dGeometry() const
{
return _d2dEllipse;
}

View File

@ -2,18 +2,15 @@
#include "..\e2dnode.h" #include "..\e2dnode.h"
e2d::RectCollider::RectCollider() e2d::RectCollider::RectCollider()
: _d2dRectangle(nullptr)
{ {
} }
e2d::RectCollider::RectCollider(double x, double y, double width, double height) e2d::RectCollider::RectCollider(double x, double y, double width, double height)
: _d2dRectangle(nullptr)
{ {
this->setRect(x, y, x + width, y + height); this->setRect(x, y, x + width, y + height);
} }
e2d::RectCollider::RectCollider(Node * node) e2d::RectCollider::RectCollider(Node * node)
: _d2dRectangle(nullptr)
{ {
this->setRect(0, 0, node->getRealWidth(), node->getRealHeight()); this->setRect(0, 0, node->getRealWidth(), node->getRealHeight());
this->setAutoResize(true); this->setAutoResize(true);
@ -21,21 +18,23 @@ e2d::RectCollider::RectCollider(Node * node)
e2d::RectCollider::~RectCollider() e2d::RectCollider::~RectCollider()
{ {
SafeRelease(_d2dRectangle);
} }
void e2d::RectCollider::setRect(double left, double top, double right, double bottom) void e2d::RectCollider::setRect(double left, double top, double right, double bottom)
{ {
SafeRelease(_d2dRectangle); SafeRelease(_geometry);
ID2D1RectangleGeometry* rectangle = nullptr;
Renderer::getFactory()->CreateRectangleGeometry( Renderer::getFactory()->CreateRectangleGeometry(
D2D1::RectF( D2D1::RectF(
float(left), float(left),
float(top), float(top),
float(right), float(right),
float(bottom)), float(bottom)),
&_d2dRectangle &rectangle
); );
_geometry = rectangle;
} }
void e2d::RectCollider::_resize() void e2d::RectCollider::_resize()
@ -45,8 +44,3 @@ void e2d::RectCollider::_resize()
this->setRect(0, 0, _parentNode->getRealWidth(), _parentNode->getRealHeight()); this->setRect(0, 0, _parentNode->getRealWidth(), _parentNode->getRealHeight());
} }
} }
ID2D1RectangleGeometry * e2d::RectCollider::getD2dGeometry() const
{
return _d2dRectangle;
}

View File

@ -186,9 +186,6 @@ public:
bool enabled bool enabled
); );
// 获取 ID2D1Geometry 对象
virtual ID2D1Geometry * getD2dGeometry() const = 0;
protected: protected:
// 转换碰撞体 // 转换碰撞体
virtual void _transform(); virtual void _transform();
@ -205,7 +202,8 @@ protected:
bool _autoResize; bool _autoResize;
Color _color; Color _color;
Node * _parentNode; Node * _parentNode;
ID2D1TransformedGeometry * _transformed; ID2D1Geometry* _geometry;
ID2D1TransformedGeometry* _transformed;
}; };
@ -237,15 +235,9 @@ public:
double bottom double bottom
); );
// 获取 ID2D1Geometry 对象
virtual ID2D1RectangleGeometry * getD2dGeometry() const override;
protected: protected:
// 重设大小 // 重设大小
virtual void _resize(); virtual void _resize();
protected:
ID2D1RectangleGeometry * _d2dRectangle;
}; };
@ -273,15 +265,9 @@ public:
double radius double radius
); );
// 获取 ID2D1Geometry 对象
virtual ID2D1EllipseGeometry * getD2dGeometry() const override;
protected: protected:
// 重设大小 // 重设大小
virtual void _resize(); virtual void _resize();
protected:
ID2D1EllipseGeometry * _d2dCircle;
}; };
@ -311,15 +297,9 @@ public:
double radiusY double radiusY
); );
// 获取 ID2D1Geometry 对象
virtual ID2D1EllipseGeometry * getD2dGeometry() const override;
protected: protected:
// 重设大小 // 重设大小
virtual void _resize(); virtual void _resize();
protected:
ID2D1EllipseGeometry * _d2dEllipse;
}; };
} }