Пример #1
0
        public void Update(IQuadTreeMonitor <T> monitor, Bound previousRegion, Bound currentRegion)
        {
            // update the stored monitor
            for (int i = 0; i < _monitors.Length; ++i)
            {
                if (ReferenceEquals(_monitors[i].Monitor, monitor))
                {
                    _monitors[i].Region = currentRegion;
                    break;
                }
            }

            // update the monitor
            for (int i = 0; i < _items.Length; ++i)
            {
                StoredItem item = _items[i];

                bool containedPrevious = previousRegion.Contains(item.Position);
                bool containedCurrent  = currentRegion.Contains(item.Position);

                // the monitor was previously interested but no longer is
                if (containedPrevious && containedCurrent == false)
                {
                    monitor.OnExit(item.Item);
                }

                // the monitor was not previous interested but now is
                else if (containedPrevious == false && containedCurrent)
                {
                    monitor.OnEnter(item.Item);
                }
            }
        }
Пример #2
0
        public void Remove(IQuadTreeMonitor <T> monitor, Bound monitoredRegion)
        {
            // remove the stored monitor
            for (int i = 0; i < _monitors.Length; ++i)
            {
                if (ReferenceEquals(_monitors[i].Monitor, monitor))
                {
                    _monitors.Remove(i);
                    break;
                }
            }

            // remove all stored items from the monitor
            for (int i = 0; i < _items.Length; ++i)
            {
                StoredItem item = _items[i];

                if (monitoredRegion.Contains(item.Position))
                {
                    monitor.OnExit(item.Item);
                }
            }
        }