Collider内部实现细节调整
This commit is contained in:
parent
2c0f7c5178
commit
bc4aa3eee5
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -186,9 +186,6 @@ public:
|
||||||
bool enabled
|
bool enabled
|
||||||
);
|
);
|
||||||
|
|
||||||
// 获取 ID2D1Geometry 对象
|
|
||||||
virtual ID2D1Geometry * getD2dGeometry() const = 0;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// 转换碰撞体
|
// 转换碰撞体
|
||||||
virtual void _transform();
|
virtual void _transform();
|
||||||
|
|
@ -205,6 +202,7 @@ protected:
|
||||||
bool _autoResize;
|
bool _autoResize;
|
||||||
Color _color;
|
Color _color;
|
||||||
Node * _parentNode;
|
Node * _parentNode;
|
||||||
|
ID2D1Geometry* _geometry;
|
||||||
ID2D1TransformedGeometry* _transformed;
|
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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue