From 2ac7ac659137eec061a9bf7def3d4e79866acc84 Mon Sep 17 00:00:00 2001 From: Nomango <569629550@qq.com> Date: Tue, 10 Jul 2018 00:30:17 +0800 Subject: [PATCH] =?UTF-8?q?Collider::Type=E6=94=B9=E4=B8=BACollider::Shape?= =?UTF-8?q?=EF=BC=9B=E5=A2=9E=E5=8A=A0=E8=8A=82=E7=82=B9=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E5=B7=AE=E5=80=BC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/Common/Collider.cpp | 25 +++++++---- core/Common/Config.cpp | 16 +++---- core/Manager/CollisionManager.cpp | 2 +- core/Node/Node.cpp | 69 +++++++++++++++++++++++-------- core/e2dcommon.h | 28 ++++++++----- core/e2dnode.h | 15 ++++--- 6 files changed, 104 insertions(+), 51 deletions(-) diff --git a/core/Common/Collider.cpp b/core/Common/Collider.cpp index be020f1d..12801aa2 100644 --- a/core/Common/Collider.cpp +++ b/core/Common/Collider.cpp @@ -8,9 +8,9 @@ e2d::Collider::Collider(Node * parent) , _parentNode(parent) , _geometry(nullptr) , _enabled(true) - , _type(Collider::Type::None) + , _shape(Collider::Shape::None) { - _type = Game::getInstance()->getConfig()->getDefaultColliderType(); + _shape = Game::getInstance()->getConfig()->getDefaultColliderShape(); } e2d::Collider::~Collider() @@ -23,11 +23,22 @@ e2d::Color e2d::Collider::getColor() const return _color; } +e2d::Collider::Shape e2d::Collider::getShape() const +{ + return _shape; +} + ID2D1Geometry * e2d::Collider::getGeometry() const { return _geometry; } +void e2d::Collider::setShape(Shape shape) +{ + _shape = shape; + this->_recreate(); +} + void e2d::Collider::setEnabled(bool enabled) { _enabled = enabled; @@ -81,12 +92,12 @@ void e2d::Collider::_recreate() { SafeRelease(_geometry); - if (_type == Type::None) + if (!_enabled || _shape == Shape::None) return; - switch (_type) + switch (_shape) { - case Type::Rect: + case Shape::Rect: { ID2D1RectangleGeometry* rectangle = nullptr; Renderer::getFactory()->CreateRectangleGeometry( @@ -101,7 +112,7 @@ void e2d::Collider::_recreate() } break; - case Type::Circle: + case Shape::Circle: { double minSide = std::min(_parentNode->getRealWidth(), _parentNode->getRealHeight()); @@ -121,7 +132,7 @@ void e2d::Collider::_recreate() } break; - case Type::Ellipse: + case Shape::Ellipse: { float halfWidth = float(_parentNode->getWidth() / 2), halfHeight = float(_parentNode->getHeight() / 2); diff --git a/core/Common/Config.cpp b/core/Common/Config.cpp index 78da7fd3..f4f4f91b 100644 --- a/core/Common/Config.cpp +++ b/core/Common/Config.cpp @@ -3,12 +3,12 @@ e2d::Config::Config() : _gameName() - , _nodeDefPivot() + , _defaultNodePivot() , _soundEnabled(true) , _outlineVisible(false) , _collisionEnabled(false) , _colliderVisible(false) - , _nodeDefColliderType(Collider::Type::None) + , _defaultColliderShape(Collider::Shape::None) , _unconfigured(true) { } @@ -43,15 +43,15 @@ void e2d::Config::setCollisionEnabled(bool enabled) void e2d::Config::setNodeDefaultPivot(Point pivot) { - _nodeDefPivot = Point( + _defaultNodePivot = Point( std::min(std::max(pivot.x, 0.0), 1.0), std::min(std::max(pivot.y, 0.0), 1.0) ); } -void e2d::Config::setDefaultColliderType(Collider::Type type) +void e2d::Config::setDefaultColliderShape(Collider::Shape shape) { - _nodeDefColliderType = type; + _defaultColliderShape = shape; } void e2d::Config::setColliderVisible(bool visible) @@ -81,12 +81,12 @@ bool e2d::Config::isCollisionEnabled() const e2d::Point e2d::Config::getNodeDefaultPivot() const { - return _nodeDefPivot; + return _defaultNodePivot; } -e2d::Collider::Type e2d::Config::getDefaultColliderType() const +e2d::Collider::Shape e2d::Config::getDefaultColliderShape() const { - return _nodeDefColliderType; + return _defaultColliderShape; } bool e2d::Config::isColliderVisible() const diff --git a/core/Manager/CollisionManager.cpp b/core/Manager/CollisionManager.cpp index 6f6bba30..c513d9fb 100644 --- a/core/Manager/CollisionManager.cpp +++ b/core/Manager/CollisionManager.cpp @@ -47,7 +47,7 @@ void e2d::CollisionManager::updateCollider(Node * node) { if (node) { - if (node->getCollider()->_type != Collider::Type::None) + if (node->getCollider()->_shape != Collider::Shape::None) { node->getCollider()->_recreate(); _collisionNodes.insert(node); diff --git a/core/Node/Node.cpp b/core/Node/Node.cpp index 94436338..b0a90fb5 100644 --- a/core/Node/Node.cpp +++ b/core/Node/Node.cpp @@ -3,9 +3,45 @@ #include "..\e2daction.h" #include +const e2d::Node::Property e2d::Node::Property::Origin = { 0 }; + +e2d::Node::Property e2d::Node::Property::operator+(Property const & prop) const +{ + Property result; + result.posX = this->posX + prop.posX; + result.posY = this->posY + prop.posY; + result.width = this->width + prop.width; + result.height = this->height + prop.height; + result.pivotX = this->pivotX + prop.pivotX; + result.pivotY = this->pivotY + prop.pivotY; + result.scaleX = this->scaleX + prop.scaleX; + result.scaleY = this->scaleY + prop.scaleY; + result.rotation = this->rotation + prop.rotation; + result.skewAngleX = this->skewAngleX + prop.skewAngleX; + result.skewAngleY = this->skewAngleY + prop.skewAngleY; + return std::move(result); +} + +e2d::Node::Property e2d::Node::Property::operator-(Property const & prop) const +{ + Property result; + result.posX = this->posX - prop.posX; + result.posY = this->posY - prop.posY; + result.width = this->width - prop.width; + result.height = this->height - prop.height; + result.pivotX = this->pivotX - prop.pivotX; + result.pivotY = this->pivotY - prop.pivotY; + result.scaleX = this->scaleX - prop.scaleX; + result.scaleY = this->scaleY - prop.scaleY; + result.rotation = this->rotation - prop.rotation; + result.skewAngleX = this->skewAngleX - prop.skewAngleX; + result.skewAngleY = this->skewAngleY - prop.skewAngleY; + return std::move(result); +} + e2d::Node::Node() - : _nOrder(0) + : _order(0) , _posX(0) , _posY(0) , _width(0) @@ -31,6 +67,7 @@ e2d::Node::Node() , _positionFixed(false) , _outline(nullptr) , _collider(this) + , _extrapolate(Property::Origin) { // 设置默认中心点位置 Point defPivot = Game::getInstance()->getConfig()->getNodeDefaultPivot(); @@ -374,12 +411,10 @@ double e2d::Node::getOpacity() const e2d::Node::Property e2d::Node::getProperty() const { Property prop; - prop.visible = _visible; prop.posX = _posX; prop.posY = _posY; prop.width = _width; prop.height = _height; - prop.opacity = _realOpacity; prop.pivotX = _pivotX; prop.pivotY = _pivotY; prop.scaleX = _scaleX; @@ -387,7 +422,7 @@ e2d::Node::Property e2d::Node::getProperty() const prop.rotation = _rotation; prop.skewAngleX = _skewAngleX; prop.skewAngleY = _skewAngleY; - return prop; + return std::move(prop); } e2d::Collider* e2d::Node::getCollider() @@ -397,12 +432,12 @@ e2d::Collider* e2d::Node::getCollider() int e2d::Node::getOrder() const { - return _nOrder; + return _order; } void e2d::Node::setOrder(int order) { - _nOrder = order; + _order = order; } void e2d::Node::setPosX(double x) @@ -427,6 +462,8 @@ void e2d::Node::setPos(double x, double y) _posX = float(x); _posY = float(y); + _extrapolate.posX += x; + _extrapolate.posY += y; _needTransform = true; } @@ -481,6 +518,8 @@ void e2d::Node::setScale(double scaleX, double scaleY) _scaleX = float(scaleX); _scaleY = float(scaleY); + _extrapolate.scaleX += scaleX; + _extrapolate.scaleY += scaleY; _needTransform = true; } @@ -501,6 +540,8 @@ void e2d::Node::setSkew(double angleX, double angleY) _skewAngleX = float(angleX); _skewAngleY = float(angleY); + _extrapolate.skewAngleX += angleX; + _extrapolate.skewAngleY += angleY; _needTransform = true; } @@ -510,6 +551,7 @@ void e2d::Node::setRotation(double angle) return; _rotation = float(angle); + _extrapolate.rotation += angle; _needTransform = true; } @@ -540,6 +582,8 @@ void e2d::Node::setPivot(double pivotX, double pivotY) _pivotX = std::min(std::max(float(pivotX), 0.f), 1.f); _pivotY = std::min(std::max(float(pivotY), 0.f), 1.f); + _extrapolate.pivotX += pivotX; + _extrapolate.pivotY += pivotY; _needTransform = true; } @@ -560,6 +604,8 @@ void e2d::Node::setSize(double width, double height) _width = float(width); _height = float(height); + _extrapolate.width += width; + _extrapolate.height += height; _needTransform = true; } @@ -570,25 +616,14 @@ void e2d::Node::setSize(Size size) void e2d::Node::setProperty(Property prop) { - this->setVisible(prop.visible); this->setPos(prop.posX, prop.posY); this->setSize(prop.width, prop.height); - this->setOpacity(prop.opacity); this->setPivot(prop.pivotX, prop.pivotY); this->setScale(prop.scaleX, prop.scaleY); this->setRotation(prop.rotation); this->setSkew(prop.skewAngleX, prop.skewAngleY); } -void e2d::Node::setColliderType(Collider::Type type) -{ - if (_collider._type != type) - { - _collider._type = type; - _needTransform = true; - } -} - void e2d::Node::addChild(Node * child, int order /* = 0 */) { WARN_IF(child == nullptr, "Node::addChild NULL pointer exception."); diff --git a/core/e2dcommon.h b/core/e2dcommon.h index 024c5e47..e5eef4d6 100644 --- a/core/e2dcommon.h +++ b/core/e2dcommon.h @@ -450,8 +450,8 @@ class Collider friend class CollisionManager; public: - // 碰撞体类别 - enum class Type + // 碰撞体形状 + enum class Shape { None, /* 无 */ Rect, /* 矩形 */ @@ -470,6 +470,11 @@ public: }; public: + // 设置碰撞体形状 + virtual void setShape( + Shape shape + ); + // 启用或关闭该碰撞体 virtual void setEnabled( bool enabled @@ -493,6 +498,9 @@ public: // 获取绘制颜色 Color getColor() const; + // 获取形状 + Shape getShape() const; + // 获取 ID2D1Geometry* 对象 ID2D1Geometry* getGeometry() const; @@ -516,7 +524,7 @@ protected: bool _visible; Color _color; Node * _parentNode; - Type _type; + Shape _shape; ID2D1Geometry* _geometry; }; @@ -797,10 +805,10 @@ public: Point pivot ); - // 设置节点的默认碰撞体类型 - // 默认:Collider::Type::None - void setDefaultColliderType( - Collider::Type type + // 设置节点的默认碰撞体形状 + // 默认:Collider::Shape::None + void setDefaultColliderShape( + Collider::Shape shape ); // 打开或关闭碰撞体可视化 @@ -825,7 +833,7 @@ public: Point getNodeDefaultPivot() const; // 获取节点的默认碰撞体类型 - Collider::Type getDefaultColliderType() const; + Collider::Shape getDefaultColliderShape() const; // 获取碰撞体可视化状态 bool isColliderVisible() const; @@ -840,8 +848,8 @@ protected: bool _collisionEnabled; bool _colliderVisible; String _gameName; - Point _nodeDefPivot; - Collider::Type _nodeDefColliderType; + Point _defaultNodePivot; + Collider::Shape _defaultColliderShape; }; diff --git a/core/e2dnode.h b/core/e2dnode.h index a3835750..bca02721 100644 --- a/core/e2dnode.h +++ b/core/e2dnode.h @@ -19,12 +19,10 @@ public: // 节点属性 struct Property { - bool visible; // 可见性 double posX; // X 坐标 double posY; // Y 坐标 double width; // 宽度 double height; // 高度 - double opacity; // 透明度 double pivotX; // 中心点 X 坐标 double pivotY; // 中心点 Y 坐标 double scaleX; // 横向缩放 @@ -32,6 +30,11 @@ public: double rotation; // 旋转角度 double skewAngleX; // 横向倾斜角度 double skewAngleY; // 纵向倾斜角度 + + Property operator+ (Property const & prop) const; + Property operator- (Property const & prop) const; + + static const Property Origin; }; public: @@ -331,11 +334,6 @@ public: Property prop ); - // 设置碰撞体类型 - virtual void setColliderType( - Collider::Type type - ); - // 添加子节点 virtual void addChild( Node * child, @@ -425,7 +423,7 @@ protected: float _realOpacity; float _pivotX; float _pivotY; - int _nOrder; + int _order; bool _visible; bool _autoUpdate; bool _needSort; @@ -434,6 +432,7 @@ protected: Collider _collider; Scene * _parentScene; Node * _parent; + Property _extrapolate; ID2D1Geometry* _outline; D2D1::Matrix3x2F _initialMatri; D2D1::Matrix3x2F _finalMatri;