完成mapservice改造
This commit is contained in:
parent
1102b43384
commit
afc71aa09d
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -112,7 +112,7 @@ void Entity::BroadcastDeleteState(Room* room)
|
||||
}
|
||||
}
|
||||
|
||||
void Entity::AddCollider(ColliderComponent* collider)
|
||||
void Entity::AddEntityCollider(ColliderComponent* collider)
|
||||
{
|
||||
colliders.push_back(collider);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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_;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user