修复跳伞碰撞问题
This commit is contained in:
parent
c53d69926b
commit
7559a242ea
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user