#pragma once class Human; class Entity; class Room; class Creature; class GridCell; class Bullet; class GridService { public: GridService(); ~GridService(); void Init(int width, int height, int cell_width); void UnInit(); bool BroderOverFlow(int x, int y); void GetAllCells(Room* room, int grid_id, std::set& grid_list); void GetAllCellsByXy(Room* room, int x, int y, std::set& grid_list); bool CanAdd(float x, float y); void ClearRoomData(Room* room); void AddCreature(Creature* c); void RemoveCreature(Creature* c); void MoveCreature(Creature* c); void MoveBullet(Bullet* bullet); void AddRoomEntity(Room* room, Entity* entity); void DelRoomEntity(Room* room, Entity* entity); void AddPermanentEntity(Entity* entity); bool CreatureInGridList(Creature* c, std::set& grid_list); bool EntityInGridList(Room* room, Entity* entity, std::set& grid_list); bool InView(int a_grid, int b_grid); bool InView(int grid_id, float x, float y); void TraverseLayer0EntityList(std::set& grid_list, std::function func); void TraverseLayer1EntityList(int room_idx, std::set& grid_list, std::function func); void TraverseAllLayerEntityList(int room_idx, std::set& grid_list, std::function func); void TraverseAllLayerHumanList(int room_idx, std::set& grid_list, std::function func); void TraverseCreatures(int room_idx, std::set& grid_list, std::function func); void DeatchHuman(Human* hum); private: inline void GetGridList(int grid_id, int offset, std::set& grid_list); void ComputeDiff(Room* room, int old_grid_id, int new_grid_id, std::set& grid_list, std::set& inc_grid_list, std::set& dec_grid_list); private: GridCell* cells_ = nullptr; int max_grid_id_ = 0; int map_width_ = 0; int map_height_ = 0; int cell_width_ = 0; int cell_count_per_row_ = 0; int cell_count_per_col_ = 0; int min_x_ = 0; int min_y_ = 0; int max_x_ = 0; int max_y_ = 0; int grid_offset_arr_[9] = {0}; };