public override void Update(GameTime gameTime) { fpsCounter.Update(gameTime); state = GetLitteralState(); PlayerCoordinates = Nocubeless.CubeWorld.GetCoordinatesFromGraphics(Nocubeless.Camera.ScreenPosition); ChunkCoordinates = CubeChunkHelper.FindBaseCoordinates(PlayerCoordinates); int margin = 2; coordinatesDrawPosition = new Vector2(margin, margin); fpsDrawPosition = new Vector2(GraphicsDevice.Viewport.Width / 2, margin); base.Update(gameTime); string GetLitteralState() { switch (Nocubeless.CurrentState) { case NocubelessState.Playing: return("Playing"); case NocubelessState.Editing: return("Editing world"); case NocubelessState.ColorPicking: return("Picking a color..."); default: return("Unknown"); } } }
public CubeColor GetCubeColorAt(CubeCoordinates coordinates) // TODO: Redundance fix { var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(coordinates); var tookChunk = TakeChunkAt(chunkCoordinates); int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(coordinates); return(tookChunk[cubePositionInChunk]); }
public void BreakCube(CubeCoordinates coordinates) { var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(coordinates); var tookChunk = TakeChunkAt(chunkCoordinates); int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(coordinates); tookChunk[cubePositionInChunk] = null; }
public void LayCube(Cube cube) { var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(cube.Coordinates); var tookChunk = TakeChunkAt(chunkCoordinates); int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(cube.Coordinates); tookChunk[cubePositionInChunk] = cube.Color; }
void UnloadFarChunks(CubeCoordinates playerCoordinates) // TODO: no need this argument now { int viewingCubes = CubeChunk.Size * Nocubeless.Settings.Graphics.ChunkViewDistance; int min = -(viewingCubes / 2); int max = viewingCubes / 2; for (int i = 0; i < Nocubeless.CubeWorld.LoadedChunks.Count; i++) { var playerMinCoordinates = CubeChunkHelper.FindBaseCoordinates(new CubeCoordinates(playerCoordinates.X + min, playerCoordinates.Y + min, playerCoordinates.Z + min)); var playerMaxCoordinates = CubeChunkHelper.FindBaseCoordinates(new CubeCoordinates(playerCoordinates.X + max, playerCoordinates.Y + max, playerCoordinates.Z + max)); if (Nocubeless.CubeWorld.LoadedChunks[i].Coordinates <playerMinCoordinates || Nocubeless.CubeWorld.LoadedChunks[i].Coordinates> playerMaxCoordinates) { var gotChunk = Nocubeless.CubeWorld.TakeChunkAt(Nocubeless.CubeWorld.LoadedChunks[i].Coordinates); Nocubeless.CubeWorld.UnloadChunk(gotChunk); } } }
public bool IsFreeSpace(CubeCoordinates coordinates) // TO-OPTIMIZE { var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(coordinates); var gotChunk = (from chunk in LoadedChunks where chunk.Coordinates == chunkCoordinates select chunk).FirstOrDefault(); if (gotChunk == null) // don't try to check in a not loaded chunk, or it will crash { return(false); } int cubePositionInChunk = CubeChunkHelper.GetIndexFromCoordinates(coordinates); if (!(gotChunk[cubePositionInChunk] == null)) { return(false); } return(true); }
private void LoadChunks(CubeCoordinates playerCoordinates) // it's the big cube algorithm { int viewingCubes = CubeChunk.Size * Nocubeless.Settings.Graphics.ChunkViewDistance; int min = -(viewingCubes / 2); int max = viewingCubes / 2; for (int x = min; x < max; x += CubeChunk.Size) { for (int y = min; y < max; y += CubeChunk.Size) { for (int z = min; z < max; z += CubeChunk.Size) { // explore chunks to load var chunkCoordinates = CubeChunkHelper.FindBaseCoordinates(new CubeCoordinates(playerCoordinates.X + x, playerCoordinates.Y + y, playerCoordinates.Z + z)); var tookChunk = Nocubeless.CubeWorld.TakeChunkAt(chunkCoordinates); if (tookChunk == null) { Nocubeless.CubeWorld.LoadChunk(chunkCoordinates); } } } } }