Magic_Game/core/Common/Collider.cpp

200 lines
3.5 KiB
C++
Raw Normal View History

2018-09-05 13:33:39 +08:00
#include "..\e2dutil.h"
2018-09-05 13:17:07 +08:00
#include "..\e2dimpl.h"
#include "..\e2dmodule.h"
2018-04-21 21:24:46 +08:00
#include "..\e2dmanager.h"
2018-09-05 13:33:39 +08:00
#include "..\e2dnode.h"
e2d::Collider::Collider(Node * parent)
2018-09-04 22:42:34 +08:00
: visible_(true)
, border_color_(Color::Blue, 0.6f)
, parent_node_(parent)
, geometry_(nullptr)
, enabled_(true)
, shape_(Collider::Shape::None)
, notify_(true)
{
}
e2d::Collider::~Collider()
{
2018-09-04 22:42:34 +08:00
SafeRelease(geometry_);
}
2018-09-04 22:42:34 +08:00
const e2d::Color& e2d::Collider::GetBorderColor() const
{
2018-09-04 22:42:34 +08:00
return border_color_;
}
2018-09-04 22:42:34 +08:00
e2d::Collider::Shape e2d::Collider::GetShape() const
{
2018-09-04 22:42:34 +08:00
return shape_;
}
2018-09-04 22:42:34 +08:00
e2d::Node * e2d::Collider::GetNode() const
2018-07-13 00:45:39 +08:00
{
2018-09-04 22:42:34 +08:00
return parent_node_;
2018-07-13 00:45:39 +08:00
}
2018-09-04 22:42:34 +08:00
ID2D1Geometry * e2d::Collider::GetGeometry() const
{
2018-09-04 22:42:34 +08:00
return geometry_;
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::SetShape(Shape shape)
{
2018-09-04 22:42:34 +08:00
if (shape_ == shape)
return;
2018-09-04 22:42:34 +08:00
shape_ = shape;
if (shape == Shape::None)
{
2018-09-04 22:42:34 +08:00
SafeRelease(geometry_);
CollisionManager::GetInstance()->RemoveCollider(this);
}
else
{
2018-09-04 22:42:34 +08:00
this->Recreate();
CollisionManager::GetInstance()->AddCollider(this);
}
2018-07-13 00:45:39 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::SetCollisionNotify(bool notify)
2018-07-13 00:45:39 +08:00
{
2018-09-04 22:42:34 +08:00
notify_ = notify;
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::SetEnabled(bool enabled)
{
2018-09-04 22:42:34 +08:00
enabled_ = enabled;
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::SetVisible(bool visible)
{
2018-09-04 22:42:34 +08:00
visible_ = visible;
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::SetBorderColor(const Color& color)
{
2018-09-04 22:42:34 +08:00
border_color_ = color;
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::Draw()
{
2018-09-04 22:42:34 +08:00
if (geometry_ && enabled_ && visible_)
{
2018-09-04 22:42:34 +08:00
auto renderer = Renderer::GetInstance();
2018-04-03 11:12:30 +08:00
// <20><>ȡ<EFBFBD><C8A1>ɫ<EFBFBD><C9AB>ˢ
2018-09-04 22:42:34 +08:00
ID2D1SolidColorBrush * brush = renderer->GetSolidBrush();
2018-04-03 11:12:30 +08:00
// <20><><EFBFBD>û<EFBFBD>ˢ<EFBFBD><CBA2>ɫ<EFBFBD><C9AB>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
brush->SetColor((D2D1_COLOR_F)border_color_);
2018-07-05 22:09:21 +08:00
brush->SetOpacity(1.f);
// <20><><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>
2018-09-04 22:42:34 +08:00
renderer->GetRenderTarget()->DrawGeometry(geometry_, brush, 1.5f);
}
}
2018-09-04 22:42:34 +08:00
e2d::Collider::Relation e2d::Collider::GetRelationWith(Collider * collider) const
{
2018-09-04 22:42:34 +08:00
if (geometry_ && collider->geometry_)
{
2018-09-04 22:42:34 +08:00
if (enabled_ && collider->enabled_)
{
D2D1_GEOMETRY_RELATION relation;
2018-09-04 22:42:34 +08:00
geometry_->CompareWithGeometry(
collider->geometry_,
D2D1::Matrix3x2F::Identity(),
&relation
);
return Relation(relation);
}
}
2018-05-24 20:37:34 +08:00
return Relation::Unknown;
}
2018-09-04 22:42:34 +08:00
bool e2d::Collider::IsEnabled() const
2018-07-13 00:45:39 +08:00
{
2018-09-04 22:42:34 +08:00
return enabled_;
2018-07-13 00:45:39 +08:00
}
2018-09-04 22:42:34 +08:00
bool e2d::Collider::IsVisible() const
2018-07-13 00:45:39 +08:00
{
2018-09-04 22:42:34 +08:00
return visible_;
2018-07-13 00:45:39 +08:00
}
2018-09-04 22:42:34 +08:00
bool e2d::Collider::IsCollisionNotify() const
2018-07-13 00:45:39 +08:00
{
2018-09-04 22:42:34 +08:00
return notify_;
2018-07-13 00:45:39 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::Collider::Recreate()
{
2018-09-04 22:42:34 +08:00
if (!enabled_ || shape_ == Shape::None)
2018-07-07 18:04:18 +08:00
return;
2018-09-04 22:42:34 +08:00
SafeRelease(geometry_);
auto factory = Renderer::GetFactory();
2018-09-04 22:42:34 +08:00
switch (shape_)
{
case Shape::Rect:
{
ID2D1RectangleGeometry* rectangle = nullptr;
2018-08-15 00:06:03 +08:00
factory->CreateRectangleGeometry(
2018-09-04 22:42:34 +08:00
D2D1::RectF(0, 0, parent_node_->GetRealWidth(), parent_node_->GetRealHeight()),
&rectangle
);
2018-09-04 22:42:34 +08:00
geometry_ = rectangle;
}
break;
case Shape::Circle:
{
2018-09-04 22:42:34 +08:00
float minSide = std::min(parent_node_->GetRealWidth(), parent_node_->GetRealHeight());
ID2D1EllipseGeometry* circle = nullptr;
2018-08-15 00:06:03 +08:00
factory->CreateEllipseGeometry(
D2D1::Ellipse(
D2D1::Point2F(
2018-09-04 22:42:34 +08:00
parent_node_->GetRealWidth() / 2,
parent_node_->GetRealHeight() / 2
),
2018-07-28 20:06:27 +08:00
minSide / 2,
minSide / 2
),
&circle
);
2018-09-04 22:42:34 +08:00
geometry_ = circle;
}
break;
case Shape::Ellipse:
{
2018-09-04 22:42:34 +08:00
float halfWidth = parent_node_->GetWidth() / 2,
halfHeight = parent_node_->GetHeight() / 2;
ID2D1EllipseGeometry* ellipse = nullptr;
2018-08-15 00:06:03 +08:00
factory->CreateEllipseGeometry(
D2D1::Ellipse(
D2D1::Point2F(
halfWidth,
halfHeight),
halfWidth,
halfHeight),
&ellipse
);
2018-09-04 22:42:34 +08:00
geometry_ = ellipse;
}
break;
}
2018-09-01 23:00:08 +08:00
ID2D1TransformedGeometry * transformed;
2018-08-15 00:06:03 +08:00
factory->CreateTransformedGeometry(
2018-09-04 22:42:34 +08:00
geometry_,
parent_node_->final_matrix_,
2018-09-01 23:00:08 +08:00
&transformed
2018-07-07 18:04:18 +08:00
);
2018-09-04 22:42:34 +08:00
SafeRelease(geometry_);
geometry_ = transformed;
}