diff --git a/core/Collider/CircleCollider.cpp b/core/Collider/CircleCollider.cpp index a616a8a8..1fc16e05 100644 --- a/core/Collider/CircleCollider.cpp +++ b/core/Collider/CircleCollider.cpp @@ -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; -} diff --git a/core/Collider/Collider.cpp b/core/Collider/Collider.cpp index 3f1709b0..21b3cfc2 100644 --- a/core/Collider/Collider.cpp +++ b/core/Collider/Collider.cpp @@ -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); + } } diff --git a/core/Collider/EllipseCollider.cpp b/core/Collider/EllipseCollider.cpp index 8ead8b38..f5cdc100 100644 --- a/core/Collider/EllipseCollider.cpp +++ b/core/Collider/EllipseCollider.cpp @@ -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; -} diff --git a/core/Collider/RectCollider.cpp b/core/Collider/RectCollider.cpp index 35f2c024..6709f3c4 100644 --- a/core/Collider/RectCollider.cpp +++ b/core/Collider/RectCollider.cpp @@ -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; -} diff --git a/core/e2dcollider.h b/core/e2dcollider.h index 2f7de93d..94605e71 100644 --- a/core/e2dcollider.h +++ b/core/e2dcollider.h @@ -186,9 +186,6 @@ public: bool enabled ); - // 获取 ID2D1Geometry 对象 - virtual ID2D1Geometry * getD2dGeometry() const = 0; - protected: // 转换碰撞体 virtual void _transform(); @@ -205,7 +202,8 @@ protected: bool _autoResize; Color _color; Node * _parentNode; - ID2D1TransformedGeometry * _transformed; + 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; }; } \ No newline at end of file