完成mapservice改造

This commit is contained in:
aozhiwei 2020-05-20 17:28:05 +08:00
parent 1102b43384
commit afc71aa09d
13 changed files with 75 additions and 26 deletions

View File

@ -38,7 +38,7 @@ void Building::RecalcSelfCollider()
obj.y() - obj.height()/2.0 - meta->i->tileheight()/2.0);
collider->_max = a8::Vec2(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0,
obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0);
AddCollider(collider);
AddEntityCollider(collider);
collider_list.push_back(collider);
permanent_map_service->AddCollider(collider);
}

View File

@ -35,7 +35,7 @@ void Bullet::RecalcSelfCollider()
if (!self_collider_) {
self_collider_ = new CircleCollider();
self_collider_->owner = this;
AddCollider(self_collider_);
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2();
self_collider_->rad = gun_meta->i->bullet_rad();
@ -228,7 +228,7 @@ void Bullet::MapServiceUpdate()
#if 1
{
std::set<ColliderComponent*> colliders;
room->map_service.GetColliders(GetX(), GetY(), colliders);
room->map_service->GetColliders(room, GetX(), GetY(), colliders);
for (ColliderComponent* collider : colliders) {
if (TestCollision(room, collider)) {
objects.insert(collider->owner);

View File

@ -229,6 +229,8 @@ enum EntitySubType_e
EST_None = 0,
EST_Player = 1,
EST_Android = 2,
EST_PermanentObstacle = 3,
EST_RoomObstacle = 4
};
enum PropertyType_e
@ -298,3 +300,5 @@ const int DEFAULT_BORN_POINT_Y = 3000;
const int ADPLAY_BUFFID = 1006;
const int FIXED_OBJECT_MAXID = 2048;
const int MAX_ROOM_IDX = 2048;

View File

@ -112,7 +112,7 @@ void Entity::BroadcastDeleteState(Room* room)
}
}
void Entity::AddCollider(ColliderComponent* collider)
void Entity::AddEntityCollider(ColliderComponent* collider)
{
colliders.push_back(collider);
}

View File

@ -44,7 +44,7 @@ class Entity
bool TestCollisionEx(Room* room, const a8::Vec2& aabb_pos, AabbCollider& aabb_box);
void BroadcastFullState(Room* room);
void BroadcastDeleteState(Room* room);
void AddCollider(ColliderComponent* collider);
void AddEntityCollider(ColliderComponent* collider);
a8::Vec2 GetPos() { return pos_; };
bool IsPermanent();
void SetPos(a8::Vec2 pos)

View File

@ -422,7 +422,7 @@ void Human::RecalcSelfCollider()
if (!self_collider_) {
self_collider_ = new CircleCollider();
self_collider_->owner = this;
AddCollider(self_collider_);
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2();
if (skin_tank_meta) {
@ -440,7 +440,7 @@ bool Human::IsCollisionInMapService()
}
std::set<ColliderComponent*> colliders;
room->map_service.GetColliders(GetX(), GetY(), colliders);
room->map_service->GetColliders(room, GetX(), GetY(), colliders);
AabbCollider aabb_box;
GetAabbBox(aabb_box);
@ -1322,7 +1322,6 @@ bool Human::CanSee(const Human* hum) const
return room->grid_service.InView(grid_id, hum->grid_id);
}
void Human::RecalcVolume()
{
MetaData::Equip* backpack_meta = MetaMgr::Instance()->GetEquip(backpack);
@ -2381,7 +2380,7 @@ void Human::FindLocationWithTarget(Entity* target)
if (!building) {
bool is_collision = false;
std::set<ColliderComponent*> colliders;
room->map_service.GetColliders(GetX(), GetY(), colliders);
room->map_service->GetColliders(room, GetX(), GetY(), colliders);
for (ColliderComponent* collider : colliders) {
if (TestCollision(room, collider)) {
is_collision = true;

View File

@ -6,6 +6,7 @@
#include "mapservice.h"
#include "collider.h"
#include "entity.h"
#include "roomobstacle.h"
MapService::MapService()
{
@ -65,6 +66,10 @@ void MapService::UnInit()
void MapService::AddCollider(ColliderComponent* collider)
{
if (!(collider->owner->entity_type == ET_Obstacle ||
collider->owner->entity_type == ET_Building)) {
abort();
}
CellNode* top_node = nullptr;
CellNode* bot_node = nullptr;
switch (collider->type) {
@ -161,7 +166,10 @@ void MapService::RemoveCollider(ColliderComponent* collider)
}
}
void MapService::GetColliders(float world_x, float world_y, std::set<ColliderComponent*>& colliders)
void MapService::GetColliders(Room* room,
float world_x,
float world_y,
std::set<ColliderComponent*>& colliders)
{
int center_grid_id = GetGridId(world_x, world_y);
if (center_grid_id < 0 || center_grid_id >= max_grid_id_) {
@ -176,7 +184,42 @@ void MapService::GetColliders(float world_x, float world_y, std::set<ColliderCom
}
struct CellNode *node, *tmp;
list_for_each_entry_safe(node, tmp, head, entry) {
colliders.insert(node->collider);
switch (node->collider->owner->entity_type) {
case ET_Obstacle:
{
switch (node->collider->owner->entity_subtype) {
case EST_PermanentObstacle:
{
colliders.insert(node->collider);
}
break;
case EST_RoomObstacle:
{
RoomObstacle* obstacle = (RoomObstacle*)node->collider->owner;
if (obstacle->room == room) {
colliders.insert(node->collider);
}
}
break;
default:
{
abort();
}
break;
}
}
break;
case ET_Building:
{
colliders.insert(node->collider);
}
break;
default:
{
abort();
}
break;
}
}
}
}

View File

@ -9,6 +9,7 @@ struct CellNode
CellNode* next = nullptr;
};
class Room;
class MapService
{
public:
@ -20,7 +21,10 @@ class MapService
void AddCollider(ColliderComponent* collider);
void RemoveCollider(ColliderComponent* collider);
void GetColliders(float world_x, float world_y, std::set<ColliderComponent*>& colliders);
void GetColliders(Room* room,
float world_x,
float world_y,
std::set<ColliderComponent*>& colliders);
private:
int GetGridId(float world_x, float world_y);

View File

@ -18,6 +18,7 @@ enum ObstacleDataFlags_e
Obstacle::Obstacle():Entity()
{
entity_type = ET_Obstacle;
entity_subtype = EST_PermanentObstacle;
++App::Instance()->perf.entity_num[ET_Obstacle];
}
@ -40,7 +41,7 @@ void Obstacle::RecalcSelfCollider()
if (!self_collider2_) {
self_collider2_ = new AabbCollider();
self_collider2_->owner = this;
AddCollider(self_collider2_);
AddEntityCollider(self_collider2_);
a8::Vec2 old_pos = GetPos();
{
SetPos(a8::Vec2(building_->GetX() + door_state1_->x() - building_->meta->i->tilewidth() / 2.0,
@ -69,7 +70,7 @@ void Obstacle::RecalcSelfCollider()
if (!self_collider_) {
self_collider_ = new CircleCollider();
self_collider_->owner = this;
AddCollider(self_collider_);
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2();
self_collider_->rad = meta->i->height() / 2.0;
@ -81,7 +82,7 @@ void Obstacle::RecalcSelfCollider()
if (!self_collider2_) {
self_collider2_ = new AabbCollider();
self_collider2_->owner = this;
AddCollider(self_collider2_);
AddEntityCollider(self_collider2_);
}
self_collider2_->_min = a8::Vec2(meta->i->width() / -2.0f, meta->i->height() / -2.0f);
self_collider2_->_max = a8::Vec2(meta->i->width() / 2.0f, meta->i->height() / 2.0f);

View File

@ -80,7 +80,6 @@ void Room::UnInit()
}
removed_robot_hash_.clear();
grid_service.UnInit();
map_service.UnInit();
}
void Room::Update(int delta_time)
@ -668,7 +667,7 @@ void Room::FindLocationWithAabb(Entity* target, const a8::Vec2& aabb_pos, AabbCo
bool is_collision = false;
std::set<ColliderComponent*> colliders;
map_service.GetColliders(pos.x, pos.y, colliders);
map_service->GetColliders(this, pos.x, pos.y, colliders);
for (ColliderComponent* collider : colliders) {
if (collider->IntersectEx(pos, aabb_box)) {
is_collision = true;

View File

@ -38,6 +38,7 @@ class AabbCollider;
class Room
{
public:
int room_idx = 0;
long long room_uuid = 0;
MetaData::Map* map_meta = nullptr;
std::string map_tpl_name;
@ -51,7 +52,7 @@ public:
timer_list* game_over_timer = nullptr;
a8::XTimer xtimer;
GridService grid_service;
MapService map_service;
MapService* map_service = nullptr;
long long battle_start_frameno_ = 0;
long long pending_request = 0;
long long last_debugout_tick = 0;

View File

@ -134,6 +134,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg)
if (!room) {
room = new Room();
room->room_type = self_room_type;
room->map_service = map_service_;
room->room_uuid = App::Instance()->NewUuid();
room->spawn_points = &spawn_points_;
room->loots = &loots_;
@ -474,9 +475,6 @@ Obstacle* RoomMgr::InternalCreateObstacle(int id, float x, float y,
MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id);
if (thing) {
Obstacle* entity = new Obstacle();
#if 0
entity->room = this;
#endif
entity->meta = thing;
entity->is_permanent = true;
entity->permanent_map_service = map_service_;

View File

@ -13,7 +13,7 @@
RoomObstacle::RoomObstacle():Obstacle()
{
entity_subtype = EST_RoomObstacle;
}
RoomObstacle::~RoomObstacle()
@ -36,11 +36,11 @@ void RoomObstacle::RecalcSelfCollider()
if (!self_collider_) {
self_collider_ = new CircleCollider();
self_collider_->owner = this;
AddCollider(self_collider_);
AddEntityCollider(self_collider_);
}
self_collider_->pos = a8::Vec2();
self_collider_->rad = meta->i->height() / 2.0;
permanent_map_service->AddCollider(self_collider_);
room->map_service->AddCollider(self_collider_);
}
break;
case 2:
@ -48,11 +48,11 @@ void RoomObstacle::RecalcSelfCollider()
if (!self_collider2_) {
self_collider2_ = new AabbCollider();
self_collider2_->owner = this;
AddCollider(self_collider2_);
AddEntityCollider(self_collider2_);
}
self_collider2_->_min = a8::Vec2(meta->i->width() / -2.0f, meta->i->height() / -2.0f);
self_collider2_->_max = a8::Vec2(meta->i->width() / 2.0f, meta->i->height() / 2.0f);
permanent_map_service->AddCollider(self_collider2_);
room->map_service->AddCollider(self_collider2_);
}
break;
}