Update physics::World
This commit is contained in:
parent
e225361151
commit
765e4404b2
|
|
@ -42,20 +42,29 @@ namespace kiwano
|
||||||
|
|
||||||
World::~World()
|
World::~World()
|
||||||
{
|
{
|
||||||
// Make sure destroyed b2World after b2Body
|
// Make sure b2World was destroyed after b2Body
|
||||||
RemoveAllChildren();
|
RemoveAllChildren();
|
||||||
|
RemoveAllBodies();
|
||||||
|
RemoveAllJoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
BodyPtr World::CreateBody(ActorPtr actor)
|
||||||
|
{
|
||||||
|
return CreateBody(actor.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
BodyPtr World::CreateBody(Actor* actor)
|
BodyPtr World::CreateBody(Actor* actor)
|
||||||
{
|
{
|
||||||
BodyPtr body = new Body(this, actor);
|
BodyPtr body = new Body(this, actor);
|
||||||
body->UpdateFromActor();
|
body->UpdateFromActor();
|
||||||
|
bodies_.push_back(body.get());
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
JointPtr World::CreateJoint(b2JointDef* joint_def)
|
JointPtr World::CreateJoint(b2JointDef* joint_def)
|
||||||
{
|
{
|
||||||
JointPtr joint = new Joint(this, joint_def);
|
JointPtr joint = new Joint(this, joint_def);
|
||||||
|
joints_.push_back(joint.get());
|
||||||
return joint;
|
return joint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,17 +76,27 @@ namespace kiwano
|
||||||
if (iter != bodies_.end())
|
if (iter != bodies_.end())
|
||||||
{
|
{
|
||||||
bodies_.erase(iter);
|
bodies_.erase(iter);
|
||||||
}
|
|
||||||
|
|
||||||
if (body->GetB2Body())
|
if (body->GetB2Body())
|
||||||
{
|
{
|
||||||
world_.DestroyBody(body->GetB2Body());
|
world_.DestroyBody(body->GetB2Body());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::RemoveAllBodies()
|
void World::RemoveAllBodies()
|
||||||
{
|
{
|
||||||
|
if (world_.GetBodyCount())
|
||||||
|
{
|
||||||
|
b2Body* body = world_.GetBodyList();
|
||||||
|
while (body)
|
||||||
|
{
|
||||||
|
b2Body* next = body->GetNext();
|
||||||
|
world_.DestroyBody(body);
|
||||||
|
body = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
bodies_.clear();
|
bodies_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,17 +108,27 @@ namespace kiwano
|
||||||
if (iter != joints_.end())
|
if (iter != joints_.end())
|
||||||
{
|
{
|
||||||
joints_.erase(iter);
|
joints_.erase(iter);
|
||||||
}
|
|
||||||
|
|
||||||
if (joint->GetB2Joint())
|
if (joint->GetB2Joint())
|
||||||
{
|
{
|
||||||
world_.DestroyJoint(joint->GetB2Joint());
|
world_.DestroyJoint(joint->GetB2Joint());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::RemoveAllJoints()
|
void World::RemoveAllJoints()
|
||||||
{
|
{
|
||||||
|
if (world_.GetJointCount())
|
||||||
|
{
|
||||||
|
b2Joint* joint = world_.GetJointList();
|
||||||
|
while (joint)
|
||||||
|
{
|
||||||
|
b2Joint* next = joint->GetNext();
|
||||||
|
world_.DestroyJoint(joint);
|
||||||
|
joint = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
joints_.clear();
|
joints_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,9 @@ namespace kiwano
|
||||||
class KGE_API World
|
class KGE_API World
|
||||||
: public Stage
|
: public Stage
|
||||||
{
|
{
|
||||||
|
friend class Body;
|
||||||
|
friend class Joint;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
World();
|
World();
|
||||||
|
|
||||||
|
|
@ -38,23 +41,12 @@ namespace kiwano
|
||||||
virtual ~World();
|
virtual ~World();
|
||||||
|
|
||||||
// 创建刚体
|
// 创建刚体
|
||||||
|
BodyPtr CreateBody(ActorPtr actor);
|
||||||
BodyPtr CreateBody(Actor* actor);
|
BodyPtr CreateBody(Actor* actor);
|
||||||
|
|
||||||
// 创建关节
|
// 创建关节
|
||||||
JointPtr CreateJoint(b2JointDef* joint_def);
|
JointPtr CreateJoint(b2JointDef* joint_def);
|
||||||
|
|
||||||
// 移除刚体
|
|
||||||
void RemoveBody(Body* body);
|
|
||||||
|
|
||||||
// 移除所有刚体
|
|
||||||
void RemoveAllBodies();
|
|
||||||
|
|
||||||
// 移除关节
|
|
||||||
void RemoveJoint(Joint* joint);
|
|
||||||
|
|
||||||
// 移除所有关节
|
|
||||||
void RemoveAllJoints();
|
|
||||||
|
|
||||||
// 获取重力
|
// 获取重力
|
||||||
Vec2 GetGravity() const;
|
Vec2 GetGravity() const;
|
||||||
|
|
||||||
|
|
@ -87,6 +79,19 @@ namespace kiwano
|
||||||
// 获取 Box2D 世界
|
// 获取 Box2D 世界
|
||||||
const b2World* GetB2World() const;
|
const b2World* GetB2World() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// 移除刚体
|
||||||
|
void RemoveBody(Body* body);
|
||||||
|
|
||||||
|
// 移除所有刚体
|
||||||
|
void RemoveAllBodies();
|
||||||
|
|
||||||
|
// 移除关节
|
||||||
|
void RemoveJoint(Joint* joint);
|
||||||
|
|
||||||
|
// 移除所有关节
|
||||||
|
void RemoveAllJoints();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Update(Duration dt) override;
|
void Update(Duration dt) override;
|
||||||
|
|
||||||
|
|
@ -95,8 +100,8 @@ namespace kiwano
|
||||||
int vel_iter_;
|
int vel_iter_;
|
||||||
int pos_iter_;
|
int pos_iter_;
|
||||||
float global_scale_;
|
float global_scale_;
|
||||||
Vector<BodyPtr> bodies_;
|
Vector<Body*> bodies_;
|
||||||
Vector<JointPtr> joints_;
|
Vector<Joint*> joints_;
|
||||||
};
|
};
|
||||||
|
|
||||||
KGE_DECLARE_SMART_PTR(World);
|
KGE_DECLARE_SMART_PTR(World);
|
||||||
|
|
|
||||||
|
|
@ -455,32 +455,43 @@ namespace kiwano
|
||||||
is_fast_transform_ = false;
|
is_fast_transform_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::AddChild(ActorPtr child)
|
void Actor::AddChild(Actor* child, int zorder)
|
||||||
{
|
{
|
||||||
KGE_ASSERT(child && "Actor::AddChild failed, NULL pointer exception");
|
KGE_ASSERT(child && "Actor::AddChild failed, NULL pointer exception");
|
||||||
|
|
||||||
if (child)
|
if (child)
|
||||||
{
|
{
|
||||||
|
KGE_ASSERT(!child->parent_ && "Actor::AddChild failed, the actor to be added already has a parent");
|
||||||
|
|
||||||
#ifdef KGE_DEBUG
|
#ifdef KGE_DEBUG
|
||||||
|
|
||||||
if (child->parent_)
|
|
||||||
KGE_ERROR_LOG(L"The actor to be added already has a parent");
|
|
||||||
|
|
||||||
for (Actor* parent = parent_; parent; parent = parent->parent_)
|
for (Actor* parent = parent_; parent; parent = parent->parent_)
|
||||||
|
{
|
||||||
if (parent == child)
|
if (parent == child)
|
||||||
|
{
|
||||||
KGE_ERROR_LOG(L"A actor cannot be its own parent");
|
KGE_ERROR_LOG(L"A actor cannot be its own parent");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // KGE_DEBUG
|
#endif // KGE_DEBUG
|
||||||
|
|
||||||
children_.push_back(child);
|
children_.push_back(child);
|
||||||
child->parent_ = this;
|
child->parent_ = this;
|
||||||
child->SetStage(this->stage_);
|
child->SetStage(this->stage_);
|
||||||
|
|
||||||
child->dirty_transform_ = true;
|
child->dirty_transform_ = true;
|
||||||
child->UpdateOpacity();
|
child->z_order_ = zorder;
|
||||||
child->Reorder();
|
child->Reorder();
|
||||||
|
child->UpdateOpacity();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Actor::AddChild(ActorPtr child, int zorder)
|
||||||
|
{
|
||||||
|
AddChild(child.get());
|
||||||
|
}
|
||||||
|
|
||||||
void Actor::AddChildren(Vector<ActorPtr> const& children)
|
void Actor::AddChildren(Vector<ActorPtr> const& children)
|
||||||
{
|
{
|
||||||
for (const auto& actor : children)
|
for (const auto& actor : children)
|
||||||
|
|
@ -528,7 +539,7 @@ namespace kiwano
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Actor::Children const & Actor::GetChildren() const
|
Actor::Children const & Actor::GetAllChildren() const
|
||||||
{
|
{
|
||||||
return children_;
|
return children_;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,10 +42,10 @@ namespace kiwano
|
||||||
friend class Transition;
|
friend class Transition;
|
||||||
friend class intrusive_list<ActorPtr>;
|
friend class intrusive_list<ActorPtr>;
|
||||||
|
|
||||||
using Children = intrusive_list<ActorPtr>;
|
|
||||||
using UpdateCallback = Function<void(Duration)>;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
using Children = intrusive_list<ActorPtr>;
|
||||||
|
using UpdateCallback = Function<void(Duration)>;
|
||||||
|
|
||||||
Actor();
|
Actor();
|
||||||
|
|
||||||
// 更新角色
|
// 更新角色
|
||||||
|
|
@ -309,7 +309,14 @@ namespace kiwano
|
||||||
|
|
||||||
// 添加子角色
|
// 添加子角色
|
||||||
void AddChild(
|
void AddChild(
|
||||||
ActorPtr child
|
ActorPtr child,
|
||||||
|
int zorder = 0
|
||||||
|
);
|
||||||
|
|
||||||
|
// 添加子角色
|
||||||
|
void AddChild(
|
||||||
|
Actor* child,
|
||||||
|
int zorder = 0
|
||||||
);
|
);
|
||||||
|
|
||||||
// 添加多个子角色
|
// 添加多个子角色
|
||||||
|
|
@ -317,18 +324,18 @@ namespace kiwano
|
||||||
Vector<ActorPtr> const& children
|
Vector<ActorPtr> const& children
|
||||||
);
|
);
|
||||||
|
|
||||||
// 获取所有名称相同的子角色
|
|
||||||
Vector<ActorPtr> GetChildren(
|
|
||||||
String const& name
|
|
||||||
) const;
|
|
||||||
|
|
||||||
// 获取名称相同的子角色
|
// 获取名称相同的子角色
|
||||||
ActorPtr GetChild(
|
ActorPtr GetChild(
|
||||||
String const& name
|
String const& name
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
// 获取所有名称相同的子角色
|
||||||
|
Vector<ActorPtr> GetChildren(
|
||||||
|
String const& name
|
||||||
|
) const;
|
||||||
|
|
||||||
// 获取全部子角色
|
// 获取全部子角色
|
||||||
Children const& GetChildren() const;
|
Children const& GetAllChildren() const;
|
||||||
|
|
||||||
// 移除子角色
|
// 移除子角色
|
||||||
void RemoveChild(
|
void RemoveChild(
|
||||||
|
|
|
||||||
|
|
@ -268,9 +268,9 @@ private:
|
||||||
inline iterator_impl operator++(int) { iterator_impl old = (*this); ++(*this); return old; }
|
inline iterator_impl operator++(int) { iterator_impl old = (*this); ++(*this); return old; }
|
||||||
inline iterator_impl& operator--() { KGE_ASSERT(base_); if (is_end_) is_end_ = false; else base_ = value_type(base_->prev_item()); return (*this); }
|
inline iterator_impl& operator--() { KGE_ASSERT(base_); if (is_end_) is_end_ = false; else base_ = value_type(base_->prev_item()); return (*this); }
|
||||||
inline iterator_impl operator--(int) { iterator_impl old = (*this); --(*this); return old; }
|
inline iterator_impl operator--(int) { iterator_impl old = (*this); --(*this); return old; }
|
||||||
inline bool operator==(iterator_impl const& other) const { return base_ == other.base_; }
|
inline bool operator==(iterator_impl const& other) const { return base_ == other.base_ && is_end_ == other.is_end_; }
|
||||||
inline bool operator!=(iterator_impl const& other) const { return !(*this == other); }
|
inline bool operator!=(iterator_impl const& other) const { return !(*this == other); }
|
||||||
inline operator bool() const { return base_ != nullptr; }
|
inline operator bool() const { return base_ != nullptr && !is_end_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool is_end_;
|
bool is_end_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue