public void Enter(int entity_id, float pos_x, float pos_y, float eye_size) { if (this.entity_map.ContainsKey(entity_id)) { return; } if (this.max_eye_size < eye_size) { this.max_eye_size = eye_size; } AOIEntity entity = new AOIEntity(entity_id, pos_x, pos_y, eye_size); AOIEntity next_entity = this.head_entity; bool is_insert = false; while (next_entity != null) { //找到合适位置 if (entity.PosX < next_entity.PosX && !is_insert) { entity.PerEntity = next_entity.PerEntity; next_entity.PerEntity.NextEntity = entity; entity.NextEntity = next_entity; next_entity.PerEntity = entity; is_insert = true; } //可能触发的视野事件 if (Math.Abs(entity.PosX - next_entity.PosX) <= this.max_eye_size) { if (entity.CanSee(next_entity)) { this.MakeEvent(entity.EntityId, next_entity.EntityId, AOIEventType.Enter); } if (next_entity.CanSee(entity)) { this.MakeEvent(next_entity.EntityId, entity.EntityId, AOIEventType.Enter); } } //遍历到最大视野所及的范围 if (next_entity.PosX > entity.PosX + this.max_eye_size) { break; } next_entity = next_entity.NextEntity; } this.entity_map.Add(entity_id, entity); }
private void CheckMoveEvent(AOIEntity entity, AOIEntity target) { //之前看不见现在看得见 if (!entity.CanSee(target) && entity.NewCanSee(target)) { this.MakeEvent(entity.EntityId, target.EntityId, AOIEventType.MoveEnter); } if (!target.CanSee(entity) && target.NewCanSee(entity)) { this.MakeEvent(target.EntityId, entity.EntityId, AOIEventType.MoveEnter); } //之前看得见现在看不见 if (entity.CanSee(target) && !entity.NewCanSee(target)) { this.MakeEvent(entity.EntityId, target.EntityId, AOIEventType.MoveLeave); } if (target.CanSee(entity) && !target.NewCanSee(entity)) { this.MakeEvent(target.EntityId, entity.EntityId, AOIEventType.MoveLeave); } }
public List <int> GetRangeEntityId(int entity_id) { List <int> entity_id_list = new List <int>(); if (this.entity_map.ContainsKey(entity_id)) { AOIEntity entity = this.entity_map[entity_id]; AOIEntity per_entity = entity.PerEntity; AOIEntity next_entity = entity.NextEntity; while (per_entity != null) { if (Math.Abs(entity.PosX - per_entity.PosX) <= this.max_eye_size) { if (per_entity.CanSee(entity)) { entity_id_list.Add(per_entity.EntityId); } } else { break; } per_entity = per_entity.PerEntity; } while (next_entity != null) { if (Math.Abs(entity.PosX - next_entity.PosX) <= this.max_eye_size) { if (next_entity.CanSee(entity)) { entity_id_list.Add(next_entity.EntityId); } } else { break; } next_entity = next_entity.NextEntity; } } return(entity_id_list); }
public void Leave(int entity_id) { if (!this.entity_map.ContainsKey(entity_id)) { return; } AOIEntity entity = this.entity_map[entity_id]; AOIEntity per_entity = entity.PerEntity; AOIEntity next_entity = entity.NextEntity; while (per_entity != null) { //可能触发的视野事件 if (Math.Abs(entity.PosX - per_entity.PosX) <= this.max_eye_size) { if (entity.CanSee(per_entity)) { this.MakeEvent(entity.EntityId, per_entity.EntityId, AOIEventType.Leave); } if (per_entity.CanSee(entity)) { this.MakeEvent(per_entity.EntityId, entity.EntityId, AOIEventType.Leave); } } else { break; } per_entity = per_entity.PerEntity; } while (next_entity != null) { //可能触发的视野事件 if (Math.Abs(entity.PosX - next_entity.PosX) <= this.max_eye_size) { if (entity.CanSee(next_entity)) { this.MakeEvent(entity.EntityId, next_entity.EntityId, AOIEventType.Leave); } if (next_entity.CanSee(entity)) { this.MakeEvent(next_entity.EntityId, entity.EntityId, AOIEventType.Leave); } } else { break; } next_entity = next_entity.NextEntity; } entity.PerEntity.NextEntity = entity.NextEntity; entity.NextEntity.PerEntity = entity.PerEntity; this.entity_map.Remove(entity.EntityId); }