Пример #1
0
        /// <summary> Constructor. </summary>
        /// <param name="position"> The position of the given chunk. </param>
        public Chunk(ChunkCoordinate position)
        {
            Position = position;
            _items   = new GridItem[NumberOfGridItemsWide * NumberOfGridItemsHigh];

            // TODO do this elsewhere

            for (int y = 0; y < NumberOfGridItemsHigh; y++)
            {
                for (int x = 0; x < NumberOfGridItemsWide; x++)
                {
                    var gridPosition = new GridCoordinate(position, new InnerChunkGridCoordinate(x, y));
                    var gridItem     = GetGridItemAt(gridPosition);

                    this[gridPosition.InnerChunkGridCoordinate] = gridItem;
                }
            }
        }
Пример #2
0
        /// <summary> Loads the chunk from the world for the given coordinate, if it needs to be updated. </summary>
        /// <param name="chunkCoordinate"> The coordinate of the chunk to load, if it is different. </param>
        private void UpdateChunkAt(ChunkCoordinate chunkCoordinate)
        {
            Chunk newChunk;

            if (chunkCoordinate.X < 0 || chunkCoordinate.Y < 0)
            {
                newChunk = null;
            }
            else if (chunkCoordinate.X >= WorldGrid.NumberOfChunksWide ||
                     chunkCoordinate.Y >= WorldGrid.NumberOfChunksHigh)
            {
                newChunk = null;
            }
            else
            {
                newChunk = _world[chunkCoordinate];
            }

            var viewableXOffset = MathUtils.PositiveRemainder(chunkCoordinate.X, NumberOfChunksWide);
            var viewableYOffset = MathUtils.PositiveRemainder(chunkCoordinate.Y, NumberOfChunksHigh);
            var oldChunk        = VisibleChunks[viewableXOffset, viewableYOffset];

            // they're the same so we don't have to do anything
            if (oldChunk == newChunk)
            {
                return;
            }

            VisibleChunks[viewableXOffset, viewableYOffset] = newChunk;

            // we've detected a change, so unsubscribe + subscribe from all of the stuff
            if (oldChunk != null)
            {
                oldChunk.GridItemChanged -= OnGridItemChanged;
            }

            if (newChunk != null)
            {
                newChunk.GridItemChanged += OnGridItemChanged;
            }

            OnViewableChunkChanged(oldChunk, newChunk);
        }
Пример #3
0
 public GridCoordinate(ChunkCoordinate chunkCoordinate, InnerChunkGridCoordinate innerCoordinate)
 {
     X = (chunkCoordinate.X << Chunk.XGridCoordinateToChunkCoordinateBitShift) + innerCoordinate.X;
     Y = (chunkCoordinate.Y << Chunk.YGridCoordinateToChunkCoordinateBitShift) + innerCoordinate.Y;
 }
Пример #4
0
 /// <summary>
 ///  Returns true if the given coordinate is a valid coordinate that can be used in this grid.
 /// </summary>
 public bool IsValid(ChunkCoordinate chunkCoordinate)
 {
     return(chunkCoordinate.X >= 0 && chunkCoordinate.X < NumberOfChunksWide &&
            chunkCoordinate.Y >= 0 && chunkCoordinate.Y < NumberOfChunksWide);
 }
Пример #5
0
 /// <summary>
 ///  Gets the chunk at the specified coordinate.
 /// </summary>
 public Chunk this[ChunkCoordinate coordinate]
 {
     get { return(_chunks[CalculateIndex(coordinate.X, coordinate.Y)]); }
     set { _chunks[CalculateIndex(coordinate.X, coordinate.Y)] = value; }
 }