This commit is contained in:
aozhiwei 2021-08-06 09:39:23 +00:00
parent cfefed6fcc
commit 88667d4015
6 changed files with 35 additions and 3 deletions

View File

@ -100,7 +100,9 @@ void Bullet::ProcBomb()
}
c4_target = c->AsCar();
}
if (TestCollision(room, c)) {
AabbCollider aabb_box;
c->GetHitAabbBox(aabb_box);
if (TestCollision(room, &aabb_box)) {
objects.insert(c);
}
}

View File

@ -32,6 +32,7 @@ void Car::Initialize()
if (!hero_meta_) {
abort();
}
RecalcSelfCollider();
MetaData::Equip* weapon_meta = MetaMgr::Instance()->GetEquip(hero_meta_->i->default_weapon());
if (weapon_meta) {
weapons[GUN_SLOT1].weapon_idx = GUN_SLOT1;
@ -374,6 +375,17 @@ void Car::GetAabbBox(AabbCollider& aabb_box)
aabb_box._max.y = hero_meta_->i->radius();
}
void Car::GetHitAabbBox(AabbCollider& aabb_box)
{
aabb_box.active = true;
aabb_box.owner = this;
aabb_box._min.x = -hero_meta_->i->hit_radius();
aabb_box._min.y = -hero_meta_->i->hit_radius();
aabb_box._max.x = hero_meta_->i->hit_radius();
aabb_box._max.y = hero_meta_->i->hit_radius();
aabb_box.MoveCenter(hero_meta_->i->hit_offset_x(), hero_meta_->i->hit_offset_y());
}
void Car::SendDebugMsg(const std::string& debug_msg)
{
#if 1
@ -419,3 +431,14 @@ void Car::DropItems(Obstacle* obstacle)
room->ScatterDrop(obstacle->GetPos(), obstacle->meta->i->drop());
}
}
void Car::RecalcSelfCollider()
{
if (!self_collider_) {
self_collider_ = new CircleCollider();
self_collider_->owner = this;
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2(hero_meta_->i->move_offset_x(), hero_meta_->i->move_offset_y());
self_collider_->rad = hero_meta_->i->radius();
}

View File

@ -12,6 +12,7 @@ namespace MetaData
class Human;
class Room;
class CircleCollider;
class Car : public Creature
{
public:
@ -26,6 +27,7 @@ class Car : public Creature
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override;
virtual void OnBulletHit(Bullet* bullet) override;
virtual void GetAabbBox(AabbCollider& aabb_box) override;
virtual void GetHitAabbBox(AabbCollider& aabb_box) override;
bool IsDriver(Human* hum) { return driver_ == hum && driver_; }
Human* GetPassengerBySeat(int seat);
@ -50,6 +52,8 @@ class Car : public Creature
int AllocSeat();
void BeKill(int killer_id, const std::string& killer_name, int weapon_id);
bool IsPassenger(Human* hum);
void RecalcSelfCollider();
private:
long long born_frameno_ = 0;
bool later_removed_ = false;
@ -58,4 +62,5 @@ class Car : public Creature
int cur_buff_id_ = 0;
int cur_buff_idx_ = -1;
float cur_oil_ = 0;
CircleCollider* self_collider_ = nullptr;
};

View File

@ -175,7 +175,7 @@ void Hero::RecalcSelfCollider()
self_collider_->owner = this;
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2();
self_collider_->pos = a8::Vec2(meta->i->move_offset_x(), meta->i->move_offset_y());
self_collider_->rad = meta->i->radius();
}
@ -215,6 +215,7 @@ void Hero::GetHitAabbBox(AabbCollider& aabb_box)
aabb_box._min.y = -GetHitRadius();
aabb_box._max.x = GetHitRadius();
aabb_box._max.y = GetHitRadius();
aabb_box.MoveCenter(meta->i->hit_offset_x(), meta->i->hit_offset_y());
}
void Hero::DetachFromMaster()

View File

@ -491,7 +491,7 @@ void Human::RecalcSelfCollider()
self_collider_->owner = this;
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2();
self_collider_->pos = a8::Vec2(meta->i->move_offset_x(), meta->i->move_offset_y());
self_collider_->rad = meta->i->radius();
Buff* buff = GetBuffByEffectId(kBET_Car);
if (buff) {

View File

@ -877,6 +877,7 @@ bool Obstacle::ProcSpecEvent(Creature* c, ColliderComponent* collider)
switch (meta->i->thing_type()) {
case kObstacleSpring:
{
return false;
if (c->IsHuman()) {
if (!c->AsHuman()->GetCar()) {
AddObstacleBuff(c);