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