192 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "..\e2dcommon.h"
 | |
| #include "..\e2dmanager.h"
 | |
| #include "..\e2dnode.h"
 | |
| 
 | |
| e2d::Collider::Collider(Node * parent)
 | |
| 	: _visible(true)
 | |
| 	, _color(Color::Blue, 0.7)
 | |
| 	, _parentNode(parent)
 | |
| 	, _geometry(nullptr)
 | |
| 	, _enabled(true)
 | |
| 	, _shape(Collider::Shape::None)
 | |
| 	, _notify(true)
 | |
| {
 | |
| 	_shape = Game::getInstance()->getConfig()->getDefaultColliderShape();
 | |
| 	CollisionManager::getInstance()->__addCollider(this);
 | |
| }
 | |
| 
 | |
| e2d::Collider::~Collider()
 | |
| {
 | |
| 	SafeRelease(_geometry);
 | |
| 	CollisionManager::getInstance()->__removeCollider(this);
 | |
| }
 | |
| 
 | |
| e2d::Color e2d::Collider::getColor() const
 | |
| {
 | |
| 	return _color;
 | |
| }
 | |
| 
 | |
| e2d::Collider::Shape e2d::Collider::getShape() const
 | |
| {
 | |
| 	return _shape;
 | |
| }
 | |
| 
 | |
| e2d::Node * e2d::Collider::getNode() const
 | |
| {
 | |
| 	return _parentNode;
 | |
| }
 | |
| 
 | |
| ID2D1Geometry * e2d::Collider::getGeometry() const
 | |
| {
 | |
| 	return _geometry;
 | |
| }
 | |
| 
 | |
| void e2d::Collider::setShape(Shape shape)
 | |
| {
 | |
| 	_shape = shape;
 | |
| 	this->recreate();
 | |
| }
 | |
| 
 | |
| void e2d::Collider::setCollisionNotify(bool notify)
 | |
| {
 | |
| 	_notify = notify;
 | |
| }
 | |
| 
 | |
| void e2d::Collider::setEnabled(bool enabled)
 | |
| {
 | |
| 	_enabled = enabled;
 | |
| }
 | |
| 
 | |
| void e2d::Collider::setVisible(bool visible)
 | |
| {
 | |
| 	_visible = visible;
 | |
| }
 | |
| 
 | |
| void e2d::Collider::setColor(Color color)
 | |
| {
 | |
| 	_color = color;
 | |
| }
 | |
| 
 | |
| void e2d::Collider::render()
 | |
| {
 | |
| 	if (_geometry && _enabled && _visible)
 | |
| 	{
 | |
| 		auto renderer = Renderer::getInstance();
 | |
| 		// 获取纯色画刷
 | |
| 		ID2D1SolidColorBrush * brush = renderer->getSolidColorBrush();
 | |
| 		// 设置画刷颜色和透明度
 | |
| 		brush->SetColor(_color.toD2DColorF());
 | |
| 		brush->SetOpacity(1.f);
 | |
| 		// 绘制几何碰撞体
 | |
| 		renderer->getRenderTarget()->DrawGeometry(_geometry, brush);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| e2d::Collider::Relation e2d::Collider::getRelationWith(Collider * collider) const
 | |
| {
 | |
| 	if (_geometry && collider->_geometry)
 | |
| 	{
 | |
| 		if (_enabled && collider->_enabled)
 | |
| 		{
 | |
| 			D2D1_GEOMETRY_RELATION relation;
 | |
| 			_geometry->CompareWithGeometry(
 | |
| 				collider->_geometry,
 | |
| 				D2D1::Matrix3x2F::Identity(),
 | |
| 				&relation
 | |
| 			);
 | |
| 
 | |
| 			return Relation(relation);
 | |
| 		}
 | |
| 	}
 | |
| 	return Relation::Unknown;
 | |
| }
 | |
| 
 | |
| bool e2d::Collider::isEnabled() const
 | |
| {
 | |
| 	return _enabled;
 | |
| }
 | |
| 
 | |
| bool e2d::Collider::isVisible() const
 | |
| {
 | |
| 	return _visible;
 | |
| }
 | |
| 
 | |
| bool e2d::Collider::isCollisionNotify() const
 | |
| {
 | |
| 	return _notify;
 | |
| }
 | |
| 
 | |
| void e2d::Collider::recreate()
 | |
| {
 | |
| 	SafeRelease(_geometry);
 | |
| 
 | |
| 	if (!_enabled || _shape == Shape::None)
 | |
| 		return;
 | |
| 
 | |
| 	switch (_shape)
 | |
| 	{
 | |
| 	case Shape::Rect:
 | |
| 	{
 | |
| 		ID2D1RectangleGeometry* rectangle = nullptr;
 | |
| 		Renderer::getFactory()->CreateRectangleGeometry(
 | |
| 			D2D1::RectF(
 | |
| 				0,
 | |
| 				0,
 | |
| 				float(_parentNode->getRealWidth()),
 | |
| 				float(_parentNode->getRealHeight())),
 | |
| 			&rectangle
 | |
| 		);
 | |
| 		_geometry = rectangle;
 | |
| 	}
 | |
| 	break;
 | |
| 
 | |
| 	case Shape::Circle:
 | |
| 	{
 | |
| 		double minSide = std::min(_parentNode->getRealWidth(), _parentNode->getRealHeight());
 | |
| 
 | |
| 		ID2D1EllipseGeometry* circle = nullptr;
 | |
| 		Renderer::getFactory()->CreateEllipseGeometry(
 | |
| 			D2D1::Ellipse(
 | |
| 				D2D1::Point2F(
 | |
| 					float(_parentNode->getRealWidth() / 2),
 | |
| 					float(_parentNode->getRealHeight() / 2)
 | |
| 				),
 | |
| 				float(minSide / 2),
 | |
| 				float(minSide / 2)
 | |
| 			),
 | |
| 			&circle
 | |
| 		);
 | |
| 		_geometry = circle;
 | |
| 	}
 | |
| 	break;
 | |
| 
 | |
| 	case Shape::Ellipse:
 | |
| 	{
 | |
| 		float halfWidth = float(_parentNode->getWidth() / 2),
 | |
| 			halfHeight = float(_parentNode->getHeight() / 2);
 | |
| 
 | |
| 		ID2D1EllipseGeometry* ellipse = nullptr;
 | |
| 		Renderer::getFactory()->CreateEllipseGeometry(
 | |
| 			D2D1::Ellipse(
 | |
| 				D2D1::Point2F(
 | |
| 					halfWidth,
 | |
| 					halfHeight),
 | |
| 				halfWidth,
 | |
| 				halfHeight),
 | |
| 			&ellipse
 | |
| 		);
 | |
| 		_geometry = ellipse;
 | |
| 	}
 | |
| 	break;
 | |
| 	}
 | |
| 
 | |
| 	ID2D1TransformedGeometry * _transformed;
 | |
| 	Renderer::getFactory()->CreateTransformedGeometry(
 | |
| 		_geometry,
 | |
| 		_parentNode->_finalMatri,
 | |
| 		&_transformed
 | |
| 	);
 | |
| 	SafeRelease(_geometry);
 | |
| 	_geometry = _transformed;
 | |
| }
 |