增加节点的Border属性
This commit is contained in:
		
							parent
							
								
									3a8428d54e
								
							
						
					
					
						commit
						cc2dff2afd
					
				|  | @ -186,12 +186,12 @@ void e2d::Collider::recreate() | ||||||
| 	break; | 	break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ID2D1TransformedGeometry * _transformed; | 	ID2D1TransformedGeometry * transformed; | ||||||
| 	factory->CreateTransformedGeometry( | 	factory->CreateTransformedGeometry( | ||||||
| 		_geometry, | 		_geometry, | ||||||
| 		_parentNode->_finalMatri, | 		_parentNode->_finalMatri, | ||||||
| 		&_transformed | 		&transformed | ||||||
| 	); | 	); | ||||||
| 	SafeRelease(_geometry); | 	SafeRelease(_geometry); | ||||||
| 	_geometry = _transformed; | 	_geometry = transformed; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -66,12 +66,16 @@ e2d::Node::Node() | ||||||
| 	, _needTransform(false) | 	, _needTransform(false) | ||||||
| 	, _positionFixed(false) | 	, _positionFixed(false) | ||||||
| 	, _collider(this) | 	, _collider(this) | ||||||
|  | 	, _border(nullptr) | ||||||
|  | 	, _borderColor(Color::Red, 0.6f) | ||||||
| 	, _extrapolate(Property::Origin) | 	, _extrapolate(Property::Origin) | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| e2d::Node::~Node() | e2d::Node::~Node() | ||||||
| { | { | ||||||
|  | 	SafeRelease(_border); | ||||||
|  | 
 | ||||||
| 	ActionManager::getInstance()->clearAllBindedWith(this); | 	ActionManager::getInstance()->clearAllBindedWith(this); | ||||||
| 	for (const auto& child : _children) | 	for (const auto& child : _children) | ||||||
| 	{ | 	{ | ||||||
|  | @ -84,22 +88,18 @@ void e2d::Node::visit() | ||||||
| 	if (!_visible) | 	if (!_visible) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	auto game = Game::getInstance(); | 	if (!Game::getInstance()->isPaused()) | ||||||
| 	if (!game->isPaused()) |  | ||||||
| 	{ | 	{ | ||||||
| 		auto updatableNode = dynamic_cast<Updatable*>(this); | 		auto updatableNode = dynamic_cast<Updatable*>(this); | ||||||
| 		if (updatableNode) | 		if (updatableNode) | ||||||
| 		{ | 		{ | ||||||
| 			updatableNode->update(); | 			updatableNode->update(); | ||||||
| 		} | 		} | ||||||
| 
 |  | ||||||
| 		// 更新转换矩阵
 |  | ||||||
| 		_updateTransform(); |  | ||||||
| 
 |  | ||||||
| 		// 保留差别属性
 |  | ||||||
| 		_extrapolate = this->getProperty(); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	_updateTransform(); | ||||||
|  | 	_extrapolate = this->getProperty(); | ||||||
|  | 
 | ||||||
| 	auto renderTarget = Renderer::getInstance()->getRenderTarget(); | 	auto renderTarget = Renderer::getInstance()->getRenderTarget(); | ||||||
| 	if (_clipEnabled) | 	if (_clipEnabled) | ||||||
| 	{ | 	{ | ||||||
|  | @ -157,36 +157,38 @@ void e2d::Node::visit() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Node::drawOutline() | void e2d::Node::_drawBorder() | ||||||
| { | { | ||||||
| 	if (_visible) | 	if (_visible) | ||||||
| 	{ | 	{ | ||||||
| 		auto renderer = Renderer::getInstance(); | 		if (_border) | ||||||
| 		renderer->getRenderTarget()->SetTransform(_finalMatri); | 		{ | ||||||
| 		renderer->getRenderTarget()->DrawRectangle( | 			auto renderer = Renderer::getInstance(); | ||||||
| 			D2D1::RectF(0, 0, _width, _height), | 			auto brush = renderer->getSolidColorBrush(); | ||||||
| 			renderer->getSolidColorBrush(), | 			brush->SetColor(D2D1_COLOR_F(_borderColor)); | ||||||
| 			1.5f | 			renderer->getRenderTarget()->DrawGeometry( | ||||||
| 		); | 				_border, | ||||||
|  | 				brush, | ||||||
|  | 				1.5f | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
| 
 | 
 | ||||||
| 		// 渲染所有子节点的轮廓
 |  | ||||||
| 		for (const auto& child : _children) | 		for (const auto& child : _children) | ||||||
| 		{ | 		{ | ||||||
| 			child->drawOutline(); | 			child->_drawBorder(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Node::drawCollider() | void e2d::Node::_drawCollider() | ||||||
| { | { | ||||||
| 	if (_visible) | 	if (_visible) | ||||||
| 	{ | 	{ | ||||||
| 		_collider.render(); | 		_collider.render(); | ||||||
| 
 | 
 | ||||||
| 		// 绘制所有子节点的几何碰撞体
 |  | ||||||
| 		for (const auto& child : _children) | 		for (const auto& child : _children) | ||||||
| 		{ | 		{ | ||||||
| 			child->drawCollider(); | 			child->_drawCollider(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -225,6 +227,29 @@ void e2d::Node::_updateTransform() | ||||||
| 		_finalMatri = _finalMatri * _parent->_initialMatri; | 		_finalMatri = _finalMatri * _parent->_initialMatri; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// 重新构造轮廓
 | ||||||
|  | 	SafeRelease(_border); | ||||||
|  | 
 | ||||||
|  | 	ID2D1Factory * factory = Renderer::getFactory(); | ||||||
|  | 	ID2D1RectangleGeometry * rectangle = nullptr; | ||||||
|  | 	ID2D1TransformedGeometry * transformed = nullptr; | ||||||
|  | 	ThrowIfFailed( | ||||||
|  | 		factory->CreateRectangleGeometry( | ||||||
|  | 			D2D1::RectF(0, 0, _width, _height), | ||||||
|  | 			&rectangle | ||||||
|  | 		) | ||||||
|  | 	); | ||||||
|  | 	ThrowIfFailed( | ||||||
|  | 		factory->CreateTransformedGeometry( | ||||||
|  | 			rectangle, | ||||||
|  | 			_finalMatri, | ||||||
|  | 			&transformed | ||||||
|  | 		) | ||||||
|  | 	); | ||||||
|  | 	_border = transformed; | ||||||
|  | 
 | ||||||
|  | 	SafeRelease(rectangle); | ||||||
|  | 
 | ||||||
| 	// 通知子节点进行转换
 | 	// 通知子节点进行转换
 | ||||||
| 	for (const auto& child : _children) | 	for (const auto& child : _children) | ||||||
| 	{ | 	{ | ||||||
|  | @ -620,6 +645,11 @@ void e2d::Node::setClipEnabled(bool enabled) | ||||||
| 	_clipEnabled = enabled; | 	_clipEnabled = enabled; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void e2d::Node::setBorderColor(const Color & color) | ||||||
|  | { | ||||||
|  | 	_borderColor = color; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void e2d::Node::addChild(Node * child, int order  /* = 0 */) | void e2d::Node::addChild(Node * child, int order  /* = 0 */) | ||||||
| { | { | ||||||
| 	WARN_IF(child == nullptr, "Node::addChild NULL pointer exception."); | 	WARN_IF(child == nullptr, "Node::addChild NULL pointer exception."); | ||||||
|  | @ -837,90 +867,40 @@ void e2d::Node::stopAction(const String& name) | ||||||
| 
 | 
 | ||||||
| bool e2d::Node::containsPoint(const Point& point) | bool e2d::Node::containsPoint(const Point& point) | ||||||
| { | { | ||||||
| 	// 更新转换矩阵
 | 	if (_width == 0.f || _height == 0.f) | ||||||
|  | 		return false; | ||||||
|  | 
 | ||||||
| 	_updateTransform(); | 	_updateTransform(); | ||||||
| 
 | 
 | ||||||
| 	// 为节点创建一个轮廓
 |  | ||||||
| 	BOOL ret = 0; | 	BOOL ret = 0; | ||||||
| 	ID2D1RectangleGeometry * rectGeo = nullptr; |  | ||||||
| 	auto factory = Renderer::getFactory(); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( | 	ThrowIfFailed( | ||||||
| 		factory->CreateRectangleGeometry( | 		_border->FillContainsPoint( | ||||||
| 			D2D1::RectF(0, 0, _width, _height), |  | ||||||
| 			&rectGeo |  | ||||||
| 		) |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( |  | ||||||
| 		rectGeo->FillContainsPoint( |  | ||||||
| 			D2D1::Point2F(point.x, point.y), | 			D2D1::Point2F(point.x, point.y), | ||||||
| 			_finalMatri, | 			D2D1::Matrix3x2F::Identity(), | ||||||
| 			&ret | 			&ret | ||||||
| 		) | 		) | ||||||
| 	); | 	); | ||||||
| 
 |  | ||||||
| 	SafeRelease(rectGeo); |  | ||||||
| 
 |  | ||||||
| 	return ret != 0; | 	return ret != 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool e2d::Node::intersects(Node * node) | bool e2d::Node::intersects(Node * node) | ||||||
| { | { | ||||||
|  | 	if (_width == 0.f || _height == 0.f || node->_width == 0.f || node->_height == 0.f) | ||||||
|  | 		return false; | ||||||
|  | 
 | ||||||
| 	// 更新转换矩阵
 | 	// 更新转换矩阵
 | ||||||
| 	_updateTransform(); | 	_updateTransform(); | ||||||
| 	node->_updateTransform(); | 	node->_updateTransform(); | ||||||
| 
 | 
 | ||||||
| 	// 为节点创建轮廓
 | 	// 获取相交状态
 | ||||||
| 	D2D1_GEOMETRY_RELATION relation = D2D1_GEOMETRY_RELATION_UNKNOWN; | 	D2D1_GEOMETRY_RELATION relation = D2D1_GEOMETRY_RELATION_UNKNOWN; | ||||||
| 	ID2D1RectangleGeometry *rectGeo = nullptr, *rectGeo2 = nullptr; |  | ||||||
| 	ID2D1TransformedGeometry *transGeo = nullptr, *transGeo2 = nullptr; |  | ||||||
| 	auto factory = Renderer::getFactory(); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( | 	ThrowIfFailed( | ||||||
| 		factory->CreateRectangleGeometry( | 		_border->CompareWithGeometry( | ||||||
| 			D2D1::RectF(0, 0, _width, _height), | 			node->_border, | ||||||
| 			&rectGeo |  | ||||||
| 		) |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( |  | ||||||
| 		factory->CreateRectangleGeometry( |  | ||||||
| 			D2D1::RectF(0, 0, node->_width, node->_height), |  | ||||||
| 			&rectGeo2 |  | ||||||
| 		) |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( |  | ||||||
| 		factory->CreateTransformedGeometry( |  | ||||||
| 			rectGeo, |  | ||||||
| 			_finalMatri, |  | ||||||
| 			&transGeo |  | ||||||
| 		) |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( |  | ||||||
| 		factory->CreateTransformedGeometry( |  | ||||||
| 			rectGeo2, |  | ||||||
| 			node->_finalMatri, |  | ||||||
| 			&transGeo2 |  | ||||||
| 		) |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	ThrowIfFailed( |  | ||||||
| 		// 获取相交状态
 |  | ||||||
| 		transGeo->CompareWithGeometry( |  | ||||||
| 			transGeo2, |  | ||||||
| 			D2D1::Matrix3x2F::Identity(), | 			D2D1::Matrix3x2F::Identity(), | ||||||
| 			&relation | 			&relation | ||||||
| 		) | 		) | ||||||
| 	); | 	); | ||||||
| 
 |  | ||||||
| 	SafeRelease(rectGeo); |  | ||||||
| 	SafeRelease(rectGeo2); |  | ||||||
| 	SafeRelease(transGeo); |  | ||||||
| 	SafeRelease(transGeo2); |  | ||||||
| 
 |  | ||||||
| 	return relation != D2D1_GEOMETRY_RELATION_UNKNOWN && | 	return relation != D2D1_GEOMETRY_RELATION_UNKNOWN && | ||||||
| 		relation != D2D1_GEOMETRY_RELATION_DISJOINT; | 		relation != D2D1_GEOMETRY_RELATION_DISJOINT; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
| #include "..\e2dmanager.h" | #include "..\e2dmanager.h" | ||||||
| 
 | 
 | ||||||
| e2d::Scene::Scene() | e2d::Scene::Scene() | ||||||
| 	: _outlineVisible(false) | 	: _borderVisible(false) | ||||||
| 	, _colliderVisible(false) | 	, _colliderVisible(false) | ||||||
| { | { | ||||||
| 	_parentScene = this; | 	_parentScene = this; | ||||||
|  | @ -13,12 +13,12 @@ e2d::Scene::~Scene() | ||||||
| { | { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Scene::setOutlineVisible(bool visible) | void e2d::Scene::showBorder(bool visible) | ||||||
| { | { | ||||||
| 	_outlineVisible = visible; | 	_borderVisible = visible; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void e2d::Scene::setColliderVisible(bool visible) | void e2d::Scene::showCollider(bool visible) | ||||||
| { | { | ||||||
| 	_colliderVisible = visible; | 	_colliderVisible = visible; | ||||||
| } | } | ||||||
|  | @ -27,17 +27,16 @@ void e2d::Scene::visit() | ||||||
| { | { | ||||||
| 	Node::visit(); | 	Node::visit(); | ||||||
| 
 | 
 | ||||||
| 	if (_outlineVisible) | 	if (_borderVisible) | ||||||
| 	{ | 	{ | ||||||
| 		auto brush = Renderer::getInstance()->getSolidColorBrush(); | 		Renderer::getInstance()->getRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||||
| 		brush->SetColor(D2D1::ColorF(D2D1::ColorF::Red, 0.6f)); | 		Renderer::getInstance()->getSolidColorBrush()->SetOpacity(1.f); | ||||||
| 		brush->SetOpacity(1.f); | 		this->_drawBorder(); | ||||||
| 		this->drawOutline(); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (_colliderVisible) | 	if (_colliderVisible) | ||||||
| 	{ | 	{ | ||||||
| 		Renderer::getInstance()->getRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); | 		Renderer::getInstance()->getRenderTarget()->SetTransform(D2D1::Matrix3x2F::Identity()); | ||||||
| 		this->drawCollider(); | 		this->_drawCollider(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -334,6 +334,11 @@ public: | ||||||
| 		bool enabled | 		bool enabled | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	// 设置节点边缘颜色
 | ||||||
|  | 	virtual void setBorderColor( | ||||||
|  | 		const Color& color | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| 	// 判断点是否在节点内
 | 	// 判断点是否在节点内
 | ||||||
| 	bool containsPoint( | 	bool containsPoint( | ||||||
| 		const Point& point | 		const Point& point | ||||||
|  | @ -432,15 +437,15 @@ public: | ||||||
| 	// 遍历节点
 | 	// 遍历节点
 | ||||||
| 	virtual void visit(); | 	virtual void visit(); | ||||||
| 
 | 
 | ||||||
| 	// 渲染节点轮廓
 |  | ||||||
| 	virtual void drawOutline(); |  | ||||||
| 
 |  | ||||||
| 	// 渲染碰撞体轮廓
 |  | ||||||
| 	virtual void drawCollider(); |  | ||||||
| 
 |  | ||||||
| protected: | protected: | ||||||
| 	E2D_DISABLE_COPY(Node); | 	E2D_DISABLE_COPY(Node); | ||||||
| 
 | 
 | ||||||
|  | 	// 渲染节点边缘
 | ||||||
|  | 	void _drawBorder(); | ||||||
|  | 
 | ||||||
|  | 	// 渲染碰撞体轮廓
 | ||||||
|  | 	void _drawCollider(); | ||||||
|  | 
 | ||||||
| 	// 设置节点所在场景
 | 	// 设置节点所在场景
 | ||||||
| 	void _setParentScene( | 	void _setParentScene( | ||||||
| 		Scene * scene | 		Scene * scene | ||||||
|  | @ -481,6 +486,8 @@ protected: | ||||||
| 	Scene *		_parentScene; | 	Scene *		_parentScene; | ||||||
| 	Node *		_parent; | 	Node *		_parent; | ||||||
| 	Property	_extrapolate; | 	Property	_extrapolate; | ||||||
|  | 	Color		_borderColor; | ||||||
|  | 	ID2D1Geometry*		_border; | ||||||
| 	std::vector<Node*>	_children; | 	std::vector<Node*>	_children; | ||||||
| 	D2D1::Matrix3x2F	_initialMatri; | 	D2D1::Matrix3x2F	_initialMatri; | ||||||
| 	D2D1::Matrix3x2F	_finalMatri; | 	D2D1::Matrix3x2F	_finalMatri; | ||||||
|  | @ -506,15 +513,15 @@ public: | ||||||
| 	// 说明:返回 false 将阻止窗口关闭
 | 	// 说明:返回 false 将阻止窗口关闭
 | ||||||
| 	virtual bool onCloseWindow() { return true; } | 	virtual bool onCloseWindow() { return true; } | ||||||
| 
 | 
 | ||||||
| 	// 显示或隐藏节点轮廓
 | 	// 显示或隐藏节点边缘
 | ||||||
| 	// 默认:隐藏
 | 	// 默认:隐藏
 | ||||||
| 	void setOutlineVisible( | 	void showBorder( | ||||||
| 		bool visible | 		bool visible | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	// 打开或关闭碰撞体可视化
 | 	// 显示或隐藏碰撞体
 | ||||||
| 	// 默认:关闭
 | 	// 默认:隐藏
 | ||||||
| 	void setColliderVisible( | 	void showCollider( | ||||||
| 		bool visible | 		bool visible | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | @ -525,7 +532,7 @@ protected: | ||||||
| 	E2D_DISABLE_COPY(Scene); | 	E2D_DISABLE_COPY(Scene); | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
| 	bool _outlineVisible; | 	bool _borderVisible; | ||||||
| 	bool _colliderVisible; | 	bool _colliderVisible; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue