1
This commit is contained in:
parent
2decdfd641
commit
78a30a1f4e
@ -34,6 +34,7 @@ void Building::RecalcSelfCollider()
|
|||||||
collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0,
|
collider->_max = Vector2D(obj.x() + obj.width()/2.0 - meta->i->tilewidth()/2.0,
|
||||||
obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0);
|
obj.y() + obj.height()/2.0 - meta->i->tileheight()/2.0);
|
||||||
AddCollider(collider);
|
AddCollider(collider);
|
||||||
|
room->map_service.AddCollider(collider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,9 +42,20 @@ void MapService::Init(int width, int height, int cell_width)
|
|||||||
cell_width_ = cell_width;
|
cell_width_ = cell_width;
|
||||||
max_grid_id_ = map_width_ * map_height_;
|
max_grid_id_ = map_width_ * map_height_;
|
||||||
|
|
||||||
|
grid_offset_arr_[0] = - (map_width_ + 1);
|
||||||
|
grid_offset_arr_[1] = - (map_width_ + 0);
|
||||||
|
grid_offset_arr_[2] = - (map_width_ + -1);
|
||||||
|
|
||||||
|
grid_offset_arr_[3] = - 1;
|
||||||
|
grid_offset_arr_[4] = 0;
|
||||||
|
grid_offset_arr_[5] = 1;
|
||||||
|
|
||||||
|
grid_offset_arr_[6] = map_width_ - 1;
|
||||||
|
grid_offset_arr_[7] = map_width_;
|
||||||
|
grid_offset_arr_[8] = map_width_ + 1;
|
||||||
|
|
||||||
map_cells_ = (list_head*)malloc(sizeof(list_head) * width * height);
|
map_cells_ = (list_head*)malloc(sizeof(list_head) * width * height);
|
||||||
memset(map_cells_, sizeof(list_head) * width * height, 0);
|
memset(map_cells_, sizeof(list_head) * width * height, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapService::UnInit()
|
void MapService::UnInit()
|
||||||
@ -54,6 +65,9 @@ void MapService::UnInit()
|
|||||||
|
|
||||||
void MapService::AddCollider(ColliderComponent* collider)
|
void MapService::AddCollider(ColliderComponent* collider)
|
||||||
{
|
{
|
||||||
|
#if MAP_SERVICE
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
CellNode* top_node = nullptr;
|
CellNode* top_node = nullptr;
|
||||||
CellNode* bot_node = nullptr;
|
CellNode* bot_node = nullptr;
|
||||||
switch (collider->type) {
|
switch (collider->type) {
|
||||||
@ -146,17 +160,30 @@ bool MapService::Walkable(float world_x, float world_y)
|
|||||||
list_empty(&node);
|
list_empty(&node);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapService::TouchAroundCell(float world_x, float world_y,
|
void MapService::GetColliders(float world_x, float world_y, std::set<ColliderComponent*>& colliders)
|
||||||
std::function<bool (ColliderComponent*)> callback)
|
|
||||||
{
|
{
|
||||||
|
int center_grid_id = GetGridId(world_x, world_y);
|
||||||
|
if (center_grid_id < 0 || center_grid_id >= max_grid_id_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < a8::ArraySize(grid_offset_arr_); ++i) {
|
||||||
|
int grid_id = center_grid_id + grid_offset_arr_[i];
|
||||||
|
if (grid_id >= 0 && grid_id < max_grid_id_) {
|
||||||
|
list_head* head = &map_cells_[grid_id];
|
||||||
|
if (head->next == nullptr && head->prev == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
struct CellNode *node, *tmp;
|
||||||
|
struct list_head tv_list;
|
||||||
|
list_for_each_entry_safe(node, tmp, &tv_list, entry) {
|
||||||
|
colliders.insert(node->collider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int MapService::GetGridId(float world_x, float world_y)
|
int MapService::GetGridId(float world_x, float world_y)
|
||||||
{
|
{
|
||||||
int x = world_x + cell_width_;
|
int grid_id = world_x/cell_width_ + (world_y/cell_width_) * map_width_;
|
||||||
int y = world_y + cell_width_;
|
|
||||||
assert(x >= 0 && y >= 0);
|
|
||||||
int grid_id = x/cell_width_ + (y/cell_width_) * map_width_;
|
|
||||||
return grid_id;
|
return grid_id;
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,7 @@ class MapService
|
|||||||
void AddCollider(ColliderComponent* collider);
|
void AddCollider(ColliderComponent* collider);
|
||||||
void RemoveCollider(ColliderComponent* collider);
|
void RemoveCollider(ColliderComponent* collider);
|
||||||
bool Walkable(float world_x, float world_y);
|
bool Walkable(float world_x, float world_y);
|
||||||
void TouchAroundCell(float world_x, float world_y,
|
void GetColliders(float world_x, float world_y, std::set<ColliderComponent*>& colliders);
|
||||||
std::function<bool (ColliderComponent*)> callback);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int GetGridId(float world_x, float world_y);
|
int GetGridId(float world_x, float world_y);
|
||||||
|
@ -34,6 +34,24 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
self_collider2_ = new AabbCollider();
|
self_collider2_ = new AabbCollider();
|
||||||
self_collider2_->owner = this;
|
self_collider2_->owner = this;
|
||||||
AddCollider(self_collider2_);
|
AddCollider(self_collider2_);
|
||||||
|
Vector2D old_pos = pos;
|
||||||
|
{
|
||||||
|
pos = Vector2D(building->pos.x + door_state1->x() - building->meta->i->tilewidth() / 2.0,
|
||||||
|
building->pos.y + door_state1->y() - building->meta->i->tileheight() / 2.0);
|
||||||
|
self_collider2_->_min = Vector2D(0.0f - door_state0->width() / 2.0f,
|
||||||
|
0.0f - door_state0->height() / 2.0f);
|
||||||
|
self_collider2_->_max = Vector2D(door_state0->width() / 2.0f, door_state0->height() / 2.0f);
|
||||||
|
room->map_service.AddCollider(self_collider2_);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
pos = Vector2D(building->pos.x + door_state0->x() - building->meta->i->tilewidth() / 2.0,
|
||||||
|
building->pos.y + door_state0->y() - building->meta->i->tileheight() / 2.0);
|
||||||
|
self_collider2_->_min = Vector2D(0.0f - door_state1->width() / 2.0f,
|
||||||
|
0.0f - door_state1->height() / 2.0f);
|
||||||
|
self_collider2_->_max = Vector2D(door_state1->width() / 2.0f, door_state1->height() / 2.0f);
|
||||||
|
room->map_service.AddCollider(self_collider2_);
|
||||||
|
}
|
||||||
|
pos = old_pos;
|
||||||
}
|
}
|
||||||
if (door_state == DoorStateClose) {
|
if (door_state == DoorStateClose) {
|
||||||
self_collider2_->_min = Vector2D(0.0f - door_state0->width() / 2.0f,
|
self_collider2_->_min = Vector2D(0.0f - door_state0->width() / 2.0f,
|
||||||
@ -55,6 +73,7 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
}
|
}
|
||||||
self_collider_->pos = Vector2D();
|
self_collider_->pos = Vector2D();
|
||||||
self_collider_->rad = meta->i->height() / 2.0;
|
self_collider_->rad = meta->i->height() / 2.0;
|
||||||
|
room->map_service.AddCollider(self_collider_);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@ -66,6 +85,7 @@ void Obstacle::RecalcSelfCollider()
|
|||||||
}
|
}
|
||||||
self_collider2_->_min = Vector2D(meta->i->width() / -2.0f, meta->i->height() / -2.0f);
|
self_collider2_->_min = Vector2D(meta->i->width() / -2.0f, meta->i->height() / -2.0f);
|
||||||
self_collider2_->_max = Vector2D(meta->i->width() / 2.0f, meta->i->height() / 2.0f);
|
self_collider2_->_max = Vector2D(meta->i->width() / 2.0f, meta->i->height() / 2.0f);
|
||||||
|
room->map_service.AddCollider(self_collider2_);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user