Collider::Type改为Collider::Shape;增加节点变化差值。

This commit is contained in:
Nomango 2018-07-10 00:30:17 +08:00
parent 0c6044491e
commit 2ac7ac6591
6 changed files with 104 additions and 51 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -3,9 +3,45 @@
#include "..\e2daction.h"
#include <algorithm>
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.");

View File

@ -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;
};

View File

@ -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;