예제 #1
0
 public void UpdatePosition(int x, int y, PositionMonitorEntry entry)
 {
     this.Remove(entry);
     entry.m_x = x;
     entry.m_y = y;
     this.Insert(entry);
 }
예제 #2
0
        public int CountEntries(Extents area, PositionMonitorLayer layer)
        {
            int xIndexFrom = Math.Max(area.x, 0);
            int xIndexTo   = Math.Min(area.x + area.width, Grid.WidthInCells);
            int yIndexFrom = Math.Max(area.y, 0);
            int yIndexTo   = Math.Min(area.y + area.height, Grid.HeightInCells);

            int countEntries = 0;

            for (int iX = xIndexFrom; iX < xIndexTo; ++iX)
            {
                for (int iY = yIndexFrom; iY < yIndexTo; ++iY)
                {
                    int nbrEntries = m_nodes[layer.m_layer, iX, iY].m_entries.Count;
                    for (int index = 0; index < nbrEntries; ++index)
                    {
                        PositionMonitorEntry entry = m_nodes[layer.m_layer, iX, iY].m_entries[index];
                        if (entry != null)
                        {
                            if (entry.m_object == null)
                            {
                                m_nodes[layer.m_layer, iX, iY].m_entries[index] = (PositionMonitorEntry)null;
                                m_nodes[layer.m_layer, iX, iY].isDirty          = true;
                            }
                            else
                            {
                                countEntries++;
                            }
                        }
                    }
                }
            }
            return(countEntries);
        }
예제 #3
0
 public void Insert(PositionMonitorEntry entry)
 {
     if (!m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].isDirty)
     {
         m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].isDirty = true;
         m_dirtyNodes.Add(new DirtyNode()
         {
             m_layer = entry.m_layer.m_layer,
             m_x     = entry.m_x,
             m_y     = entry.m_y
         });
     }
     m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].m_entries.Add(entry);
 }
예제 #4
0
        public PositionMonitorEntry Add(GameObject obj, int x, int y, PositionMonitorLayer layer)
        {
            PositionMonitorEntry entry = new PositionMonitorEntry(x, y, layer, obj, this);

            if (!m_nodes[layer.m_layer, x, y].isDirty)
            {
                m_nodes[layer.m_layer, x, y].isDirty = true;
                m_dirtyNodes.Add(new DirtyNode()
                {
                    m_layer = layer.m_layer,
                    m_x     = x,
                    m_y     = y
                });
            }
            m_nodes[layer.m_layer, x, y].m_entries.Add(entry);
            return(entry);
        }
예제 #5
0
        public void Remove(PositionMonitorEntry entry)
        {
            int count = m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].m_entries.Count;

            for (int index = 0; index < count; ++index)
            {
                if (m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].m_entries[index] == entry)
                {
                    if (!m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].isDirty)
                    {
                        m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].isDirty = true;
                        m_dirtyNodes.Add(new DirtyNode()
                        {
                            m_layer = entry.m_layer.m_layer,
                            m_x     = entry.m_x,
                            m_y     = entry.m_y
                        });
                    }
                    m_nodes[entry.m_layer.m_layer, entry.m_x, entry.m_y].m_entries[index] = (PositionMonitorEntry)null;
                    break;
                }
            }
        }