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"
e2d::CircleCollider::CircleCollider()
: _d2dCircle(nullptr)
{
}
e2d::CircleCollider::CircleCollider(Point center, double radius)
: _d2dCircle(nullptr)
{
this->setCircle(center, radius);
}
e2d::CircleCollider::CircleCollider(Node * node)
: _d2dCircle(nullptr)
{
double minSide = std::min(node->getRealWidth(), node->getRealHeight());
this->setCircle(
@ -28,22 +25,26 @@ e2d::CircleCollider::CircleCollider(Node * node)
e2d::CircleCollider::~CircleCollider()
{
SafeRelease(_d2dCircle);
}
void e2d::CircleCollider::setCircle(Point center, double radius)
{
SafeRelease(_d2dCircle);
SafeRelease(_geometry);
ID2D1EllipseGeometry* circle = nullptr;
Renderer::getFactory()->CreateEllipseGeometry(
D2D1::Ellipse(
D2D1::Point2F(
float(center.x),
float(center.y)),
float(center.y)
),
float(radius),
float(radius)),
&_d2dCircle
float(radius)
),
&circle
);
_geometry = circle;
}
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)
, _parentNode(nullptr)
, _transformed(nullptr)
, _geometry(nullptr)
, _enabled(true)
, _autoResize(false)
{
@ -15,6 +16,7 @@ e2d::Collider::Collider()
e2d::Collider::~Collider()
{
SafeRelease(_transformed);
SafeRelease(_geometry);
}
e2d::Node * e2d::Collider::getParentNode() const
@ -83,7 +85,7 @@ e2d::Collider::Relation e2d::Collider::getRelationWith(Collider * pCollider) con
void e2d::Collider::_transform()
{
if (_parentNode && _enabled)
if (_parentNode && _enabled && _geometry)
{
if (_autoResize)
{
@ -95,11 +97,15 @@ void e2d::Collider::_transform()
// 根据父节点转换几何图形
Renderer::getFactory()->CreateTransformedGeometry(
getD2dGeometry(),
_geometry,
_parentNode->_finalMatri,
&_transformed
);
ColliderManager::__updateCollider(this);
}
else
{
SafeRelease(_transformed);
}
}

View File

@ -2,18 +2,15 @@
#include "..\e2dnode.h"
e2d::EllipseCollider::EllipseCollider()
: _d2dEllipse(nullptr)
{
}
e2d::EllipseCollider::EllipseCollider(Point center, double radiusX, double radiusY)
: _d2dEllipse(nullptr)
{
this->setEllipse(center, radiusX, radiusY);
}
e2d::EllipseCollider::EllipseCollider(Node * node)
: _d2dEllipse(nullptr)
{
this->setEllipse(
Point(
@ -28,13 +25,13 @@ e2d::EllipseCollider::EllipseCollider(Node * node)
e2d::EllipseCollider::~EllipseCollider()
{
SafeRelease(_d2dEllipse);
}
void e2d::EllipseCollider::setEllipse(Point center, double radiusX, double radiusY)
{
SafeRelease(_d2dEllipse);
SafeRelease(_geometry);
ID2D1EllipseGeometry* ellipse = nullptr;
Renderer::getFactory()->CreateEllipseGeometry(
D2D1::Ellipse(
D2D1::Point2F(
@ -42,8 +39,9 @@ void e2d::EllipseCollider::setEllipse(Point center, double radiusX, double radiu
float(center.y)),
float(radiusX),
float(radiusY)),
&_d2dEllipse
&ellipse
);
_geometry = ellipse;
}
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"
e2d::RectCollider::RectCollider()
: _d2dRectangle(nullptr)
{
}
e2d::RectCollider::RectCollider(double x, double y, double width, double height)
: _d2dRectangle(nullptr)
{
this->setRect(x, y, x + width, y + height);
}
e2d::RectCollider::RectCollider(Node * node)
: _d2dRectangle(nullptr)
{
this->setRect(0, 0, node->getRealWidth(), node->getRealHeight());
this->setAutoResize(true);
@ -21,21 +18,23 @@ e2d::RectCollider::RectCollider(Node * node)
e2d::RectCollider::~RectCollider()
{
SafeRelease(_d2dRectangle);
}
void e2d::RectCollider::setRect(double left, double top, double right, double bottom)
{
SafeRelease(_d2dRectangle);
SafeRelease(_geometry);
ID2D1RectangleGeometry* rectangle = nullptr;
Renderer::getFactory()->CreateRectangleGeometry(
D2D1::RectF(
float(left),
float(top),
float(right),
float(bottom)),
&_d2dRectangle
&rectangle
);
_geometry = rectangle;
}
void e2d::RectCollider::_resize()
@ -45,8 +44,3 @@ void e2d::RectCollider::_resize()
this->setRect(0, 0, _parentNode->getRealWidth(), _parentNode->getRealHeight());
}
}
ID2D1RectangleGeometry * e2d::RectCollider::getD2dGeometry() const
{
return _d2dRectangle;
}

View File

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