修复跳伞碰撞问题
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());
|
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();
|
void RecalcSelfCollider();
|
||||||
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
||||||
virtual void FillMFObjectFull(cs::MFObjectFull* full_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();
|
ColliderComponent* a_collider = GetBoxBound();
|
||||||
Vector2D old_pos = pos;
|
Vector2D old_pos = pos;
|
||||||
Vector2D new_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();
|
ColliderComponent* target_collider = target->GetBoxBound();
|
||||||
{
|
{
|
||||||
bool ret = a_collider->CalcSafePoint(target_collider, new_pos);
|
bool ret = a_collider->CalcSafePoint(target_collider, new_pos);
|
||||||
|
@ -12,11 +12,11 @@ enum EntityType_e
|
|||||||
ET_Player = 1,
|
ET_Player = 1,
|
||||||
ET_Obstacle = 2,
|
ET_Obstacle = 2,
|
||||||
ET_Building = 3,
|
ET_Building = 3,
|
||||||
ET_LootSpawner = 4,
|
//ET_LootSpawner = 4,
|
||||||
ET_Loot = 5,
|
ET_Loot = 5,
|
||||||
ET_DeadBody = 6,
|
//ET_DeadBody = 6,
|
||||||
ET_Decal = 7,
|
//ET_Decal = 7,
|
||||||
ET_Projectile = 8,
|
//ET_Projectile = 8,
|
||||||
ET_Smoke = 9,
|
ET_Smoke = 9,
|
||||||
|
|
||||||
ET_Bullet = 20,
|
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)
|
void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb)
|
||||||
{
|
{
|
||||||
stats_pb->set_player_id(entity_uniid);
|
stats_pb->set_player_id(entity_uniid);
|
||||||
|
@ -91,6 +91,7 @@ class Human : public Entity
|
|||||||
virtual float GetSpeed() override;
|
virtual float GetSpeed() override;
|
||||||
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
||||||
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
|
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
|
||||||
|
virtual ColliderComponent* GetBoxBound() override;
|
||||||
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
|
virtual void FillMFPlayerStats(cs::MFPlayerStats* stats);
|
||||||
void FillMFTeamData(cs::MFTeamData* team_data);
|
void FillMFTeamData(cs::MFTeamData* team_data);
|
||||||
void Shot(Vector2D& target_dir);
|
void Shot(Vector2D& target_dir);
|
||||||
|
@ -24,5 +24,4 @@ class Loot : public Entity
|
|||||||
void RecalcSelfCollider();
|
void RecalcSelfCollider();
|
||||||
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
||||||
virtual void FillMFObjectFull(cs::MFObjectFull* full_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();
|
void RecalcSelfCollider();
|
||||||
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
|
||||||
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
|
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;
|
||||||
|
virtual ColliderComponent* GetBoxBound() override;
|
||||||
private:
|
private:
|
||||||
CircleCollider* self_collider_ = nullptr;
|
CircleCollider* self_collider_ = nullptr;
|
||||||
AabbCollider* self_collider2_ = 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);
|
assert(uniid_hash_.size() < 1000);
|
||||||
for (auto& pair : uniid_hash_) {
|
for (auto& pair : uniid_hash_) {
|
||||||
|
if (sender == pair.second) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (a8::HasBitFlag(detection_flags, ET_Player) && pair.second->entity_type == ET_Player) {
|
if (a8::HasBitFlag(detection_flags, ET_Player) && pair.second->entity_type == ET_Player) {
|
||||||
if (sender->entity_type == ET_Bullet) {
|
if (sender->entity_type == ET_Bullet) {
|
||||||
Bullet* bullet = (Bullet*)sender;
|
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_) {
|
for (auto& pair : uniid_hash_) {
|
||||||
if (pair.second->entity_type == ET_Building) {
|
if (pair.second->entity_type == ET_Building) {
|
||||||
Building* building = (Building*)pair.second;
|
ColliderComponent* target_collider = pair.second->GetBoxBound();
|
||||||
Vector2D a_min = Vector2D(
|
if (a_collider->Intersect(target_collider)) {
|
||||||
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()
|
|
||||||
)) {
|
|
||||||
objects.push_back(pair.second);
|
objects.push_back(pair.second);
|
||||||
}
|
}
|
||||||
|
DestoryCollider(target_collider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DestoryCollider(a_collider);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete)
|
void Room::AddDeletedObject(unsigned short obj_uniid, bool soft_delete)
|
||||||
|
@ -53,7 +53,7 @@ public:
|
|||||||
Human* FindEnemy(Human* hum);
|
Human* FindEnemy(Human* hum);
|
||||||
|
|
||||||
void CollisionDetection(Entity* sender, int detection_flags, std::vector<Entity*>& objects);
|
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 AddDeletedObject(unsigned short obj_uniid, bool soft_delete);
|
||||||
void BeAddedObject(Entity* entity);
|
void BeAddedObject(Entity* entity);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user