碰撞体 重构
This commit is contained in:
parent
529ca37af4
commit
d9b4ce5554
@ -33,7 +33,7 @@ void Building::RecalcSelfCollider()
|
|||||||
obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0);
|
obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0);
|
||||||
collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0,
|
collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0,
|
||||||
obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0);
|
obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0);
|
||||||
colliders.push_back(collider);
|
AddCollider(collider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ void Bullet::RecalcSelfCollider()
|
|||||||
if (!self_collider_) {
|
if (!self_collider_) {
|
||||||
self_collider_ = new CircleCollider();
|
self_collider_ = new CircleCollider();
|
||||||
self_collider_->owner = this;
|
self_collider_->owner = this;
|
||||||
colliders.push_back(self_collider_);
|
AddCollider(self_collider_);
|
||||||
}
|
}
|
||||||
self_collider_->pos = Vector2D();
|
self_collider_->pos = Vector2D();
|
||||||
self_collider_->rad = gun_meta->i->bullet_rad();
|
self_collider_->rad = gun_meta->i->bullet_rad();
|
||||||
@ -148,7 +148,6 @@ void Bullet::OnHit(std::set<Entity*>& objects)
|
|||||||
obstacle->meta->i->damage() > 0.01f) {
|
obstacle->meta->i->damage() > 0.01f) {
|
||||||
obstacle->Explosion(this);
|
obstacle->Explosion(this);
|
||||||
}
|
}
|
||||||
obstacle->ClearColliders();
|
|
||||||
room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop());
|
room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop());
|
||||||
}
|
}
|
||||||
obstacle->BroadcastFullState();
|
obstacle->BroadcastFullState();
|
||||||
|
@ -31,6 +31,9 @@ ColliderComponent* Entity::GetBoxBound()
|
|||||||
|
|
||||||
bool Entity::TestCollision(Entity* b)
|
bool Entity::TestCollision(Entity* b)
|
||||||
{
|
{
|
||||||
|
if (b->dead) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
for (auto& a_collider : colliders) {
|
for (auto& a_collider : colliders) {
|
||||||
for (auto& b_collider : b->colliders) {
|
for (auto& b_collider : b->colliders) {
|
||||||
if (a_collider->Intersect(b_collider)) {
|
if (a_collider->Intersect(b_collider)) {
|
||||||
@ -141,3 +144,8 @@ void Entity::BroadcastDeleteState()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Entity::AddCollider(ColliderComponent* collider)
|
||||||
|
{
|
||||||
|
colliders.push_back(collider);
|
||||||
|
}
|
||||||
|
@ -48,9 +48,10 @@ class Entity
|
|||||||
Room* room = nullptr;
|
Room* room = nullptr;
|
||||||
Vector2D pos;
|
Vector2D pos;
|
||||||
int updated_times = 0;
|
int updated_times = 0;
|
||||||
std::list<ColliderComponent*> colliders;
|
|
||||||
bool deleted = false;
|
bool deleted = false;
|
||||||
a8::XTimerAttacher xtimer_attacher;
|
a8::XTimerAttacher xtimer_attacher;
|
||||||
|
bool dead = false;
|
||||||
|
long long dead_frameno = 0;
|
||||||
|
|
||||||
int grid_id = 0;
|
int grid_id = 0;
|
||||||
std::set<GridCell*> grid_list;
|
std::set<GridCell*> grid_list;
|
||||||
@ -65,9 +66,13 @@ class Entity
|
|||||||
virtual float GetSpeed() { return 1.0f;};
|
virtual float GetSpeed() { return 1.0f;};
|
||||||
virtual ColliderComponent* GetBoxBound();
|
virtual ColliderComponent* GetBoxBound();
|
||||||
bool TestCollision(Entity* b);
|
bool TestCollision(Entity* b);
|
||||||
void ClearColliders();
|
|
||||||
void FindLocationWithTarget(Entity* target);
|
void FindLocationWithTarget(Entity* target);
|
||||||
void BroadcastFullState();
|
void BroadcastFullState();
|
||||||
void BroadcastDeleteState();
|
void BroadcastDeleteState();
|
||||||
|
void AddCollider(ColliderComponent* collider);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::list<ColliderComponent*> colliders;
|
||||||
|
|
||||||
|
void ClearColliders();
|
||||||
};
|
};
|
||||||
|
@ -25,7 +25,7 @@ void Hero::RecalcSelfCollider()
|
|||||||
if (!self_collider_) {
|
if (!self_collider_) {
|
||||||
self_collider_ = new CircleCollider();
|
self_collider_ = new CircleCollider();
|
||||||
self_collider_->owner = this;
|
self_collider_->owner = this;
|
||||||
colliders.push_back(self_collider_);
|
AddCollider(self_collider_);
|
||||||
}
|
}
|
||||||
self_collider_->pos = Vector2D();
|
self_collider_->pos = Vector2D();
|
||||||
self_collider_->rad = master->GetRadius();
|
self_collider_->rad = master->GetRadius();
|
||||||
|
@ -274,7 +274,7 @@ void Human::RecalcSelfCollider()
|
|||||||
if (!self_collider_) {
|
if (!self_collider_) {
|
||||||
self_collider_ = new CircleCollider();
|
self_collider_ = new CircleCollider();
|
||||||
self_collider_->owner = this;
|
self_collider_->owner = this;
|
||||||
colliders.push_back(self_collider_);
|
AddCollider(self_collider_);
|
||||||
}
|
}
|
||||||
self_collider_->pos = Vector2D();
|
self_collider_->pos = Vector2D();
|
||||||
self_collider_->rad = meta->i->radius();
|
self_collider_->rad = meta->i->radius();
|
||||||
|
@ -33,7 +33,7 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
if (!self_collider2_) {
|
if (!self_collider2_) {
|
||||||
self_collider2_ = new AabbCollider();
|
self_collider2_ = new AabbCollider();
|
||||||
self_collider2_->owner = this;
|
self_collider2_->owner = this;
|
||||||
colliders.push_back(self_collider2_);
|
AddCollider(self_collider2_);
|
||||||
}
|
}
|
||||||
if (door_state == DoorStateClose) {
|
if (door_state == DoorStateClose) {
|
||||||
self_collider2_->_min = Vector2D(0.0f - door_state0->width() / 2.0f,
|
self_collider2_->_min = Vector2D(0.0f - door_state0->width() / 2.0f,
|
||||||
@ -51,7 +51,7 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
if (!self_collider_) {
|
if (!self_collider_) {
|
||||||
self_collider_ = new CircleCollider();
|
self_collider_ = new CircleCollider();
|
||||||
self_collider_->owner = this;
|
self_collider_->owner = this;
|
||||||
colliders.push_back(self_collider_);
|
AddCollider(self_collider_);
|
||||||
}
|
}
|
||||||
self_collider_->pos = Vector2D();
|
self_collider_->pos = Vector2D();
|
||||||
self_collider_->rad = meta->i->height() / 2.0;
|
self_collider_->rad = meta->i->height() / 2.0;
|
||||||
@ -62,7 +62,7 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
if (!self_collider2_) {
|
if (!self_collider2_) {
|
||||||
self_collider2_ = new AabbCollider();
|
self_collider2_ = new AabbCollider();
|
||||||
self_collider2_->owner = this;
|
self_collider2_->owner = this;
|
||||||
colliders.push_back(self_collider2_);
|
AddCollider(self_collider2_);
|
||||||
}
|
}
|
||||||
self_collider2_->_min = Vector2D(meta->i->width() / -2.0f, meta->i->height() / -2.0f);
|
self_collider2_->_min = Vector2D(meta->i->width() / -2.0f, meta->i->height() / -2.0f);
|
||||||
self_collider2_->_max = Vector2D(meta->i->width() / 2.0f, meta->i->height() / 2.0f);
|
self_collider2_->_max = Vector2D(meta->i->width() / 2.0f, meta->i->height() / 2.0f);
|
||||||
@ -192,7 +192,6 @@ void Obstacle::Explosion(Bullet* bullet)
|
|||||||
obstacle->dead = obstacle->health <= 0.01f;
|
obstacle->dead = obstacle->health <= 0.01f;
|
||||||
obstacle->dead_frameno = room->frame_no;
|
obstacle->dead_frameno = room->frame_no;
|
||||||
if (obstacle->dead) {
|
if (obstacle->dead) {
|
||||||
obstacle->ClearColliders();
|
|
||||||
room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop());
|
room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop());
|
||||||
}
|
}
|
||||||
obstacle->BroadcastFullState();
|
obstacle->BroadcastFullState();
|
||||||
|
@ -25,8 +25,6 @@ class Obstacle : public Entity
|
|||||||
public:
|
public:
|
||||||
MetaData::MapThing* meta = nullptr;
|
MetaData::MapThing* meta = nullptr;
|
||||||
float health = 0.0f;
|
float health = 0.0f;
|
||||||
bool dead = false;
|
|
||||||
long long dead_frameno = 0;
|
|
||||||
|
|
||||||
bool is_door = false;
|
bool is_door = false;
|
||||||
int door_id = 0;
|
int door_id = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user