/// <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; } } }
/// <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); }
public GridCoordinate(ChunkCoordinate chunkCoordinate, InnerChunkGridCoordinate innerCoordinate) { X = (chunkCoordinate.X << Chunk.XGridCoordinateToChunkCoordinateBitShift) + innerCoordinate.X; Y = (chunkCoordinate.Y << Chunk.YGridCoordinateToChunkCoordinateBitShift) + innerCoordinate.Y; }
/// <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); }
/// <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; } }