Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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);
        }
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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);
    }