修复跳伞碰撞问题

This commit is contained in:
aozhiwei 2019-04-22 10:48:20 +08:00
parent c53d69926b
commit 7559a242ea
11 changed files with 57 additions and 49 deletions

View File

@ -66,3 +66,19 @@ void Building::FillMFObjectFull(cs::MFObjectFull* full_data)
p->set_building_id(meta->i->_building_id());
}
ColliderComponent* Building::GetBoxBound()
{
AabbCollider* collider = new AabbCollider();
collider->active = true;
collider->owner = this;
collider->_min = Vector2D(
pos.x - meta->i->tilewidth()/2.0,
pos.y - meta->i->tileheight()/2.0
);
collider->_max = Vector2D(
pos.x + meta->i->tilewidth()/2.0,
pos.y + meta->i->tileheight()/2.0
);
return collider;
}

View File

@ -24,5 +24,5 @@ class Building : public Entity
void RecalcSelfCollider();
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
virtual ColliderComponent* GetBoxBound() override;
};

View File

@ -54,31 +54,6 @@ void Entity::FindLocationWithTarget(Entity* target)
ColliderComponent* a_collider = GetBoxBound();
Vector2D old_pos = pos;
Vector2D new_pos = pos;
#if 0
{
std::vector<Entity*> objects;
room->BuildingBoxBoundCollisionDetection(this, objects);
if (objects.size() > 1) {
abort();
}
if (!objects.empty()) {
Building* building = (Building*)objects[0];
ColliderComponent* building_collider = building->GetBoxBound();
bool ret = a_collider->CalcSafePoint(building_collider, new_pos);
if (!ret) {
abort();
}
if (ret) {
pos = new_pos;
DestoryCollider(a_collider);
DestoryCollider(building_collider);
return;
} else {
DestoryCollider(building_collider);
}
}
}
#endif
ColliderComponent* target_collider = target->GetBoxBound();
{
bool ret = a_collider->CalcSafePoint(target_collider, new_pos);

View File

@ -12,11 +12,11 @@ enum EntityType_e
ET_Player = 1,
ET_Obstacle = 2,
ET_Building = 3,
ET_LootSpawner = 4,
//ET_LootSpawner = 4,
ET_Loot = 5,
ET_DeadBody = 6,
ET_Decal = 7,
ET_Projectile = 8,
//ET_DeadBody = 6,
//ET_Decal = 7,
//ET_Projectile = 8,
ET_Smoke = 9,
ET_Bullet = 20,

View File

@ -110,6 +110,15 @@ void Human::FillMFObjectFull(cs::MFObjectFull* full_data)
}
}
ColliderComponent* Human::GetBoxBound()
{
CircleCollider* collider = new CircleCollider();
collider->owner = this;
collider->pos = pos;
collider->rad = GetRadius();
return collider;
}
void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb)
{
stats_pb->set_player_id(entity_uniid);

View File

@ -91,6 +91,7 @@ class Human : public Entity
virtual float GetSpeed() override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
virtual ColliderComponent* GetBoxBound() override;
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
void FillMFTeamData(cs::MFTeamData* team_data);
void Shot(Vector2D& target_dir);

View File

@ -24,5 +24,4 @@ class Loot : public Entity
void RecalcSelfCollider();
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
};

View File

@ -106,3 +106,18 @@ void Obstacle::FillMFObjectFull(cs::MFObjectFull* full_data)
}
}
}
ColliderComponent* Obstacle::GetBoxBound()
{
if (self_collider_) {
CircleCollider* collider = new CircleCollider();
*collider = *self_collider_;
return collider;
}
if (self_collider2_) {
AabbCollider* collider = new AabbCollider();
*collider = *self_collider2_;
return collider;
}
return nullptr;
}

View File

@ -41,7 +41,7 @@ class Obstacle : public Entity
void RecalcSelfCollider();
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
virtual ColliderComponent* GetBoxBound() override;
private:
CircleCollider* self_collider_ = nullptr;
AabbCollider* self_collider2_ = nullptr;

View File

@ -365,6 +365,9 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector<E
{
assert(uniid_hash_.size() < 1000);
for (auto& pair : uniid_hash_) {
if (sender == pair.second) {
continue;
}
if (a8::HasBitFlag(detection_flags, ET_Player) && pair.second->entity_type == ET_Player) {
if (sender->entity_type == ET_Bullet) {
Bullet* bullet = (Bullet*)sender;
@ -400,29 +403,19 @@ void Room::CollisionDetection(Entity* sender, int detection_flags, std::vector<E
}
}
void Room::BuildingBoxBoundCollisionDetection(Human* hum, std::vector<Entity*>& objects)
void Room::BuildingBoxBoundCollisionDetection(Entity* sender, std::vector<Entity*>& objects)
{
ColliderComponent* a_collider = sender->GetBoxBound();
for (auto& pair : uniid_hash_) {
if (pair.second->entity_type == ET_Building) {
Building* building = (Building*)pair.second;
Vector2D a_min = Vector2D(
building->pos.x - building->meta->i->tilewidth()/2.0,
building->pos.y - building->meta->i->tileheight()/2.0
);
Vector2D a_max = Vector2D(
building->pos.x + building->meta->i->tilewidth()/2.0,
building->pos.y + building->meta->i->tileheight()/2.0
);
if (IntersectAabbCircle(
a_min,
a_max,
hum->pos,
hum->GetRadius()
)) {
ColliderComponent* target_collider = pair.second->GetBoxBound();
if (a_collider->Intersect(target_collider)) {
objects.push_back(pair.second);
}
DestoryCollider(target_collider);
}
}
DestoryCollider(a_collider);
}
void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete)

View File

@ -53,7 +53,7 @@ public:
Human* FindEnemy(Human* hum);
void CollisionDetection(Entity* sender, int detection_flags, std::vector<Entity*>& objects);
void BuildingBoxBoundCollisionDetection(Human* hum, std::vector<Entity*>& objects);
void BuildingBoxBoundCollisionDetection(Entity* sender, std::vector<Entity*>& objects);
void AddDeletedObject(unsigned short obj_uniid, bool soft_delete);
void BeAddedObject(Entity* entity);