protected override void Update(GameTime gameTime) { // Get the keyboard and mouse states k = Keyboard.GetState(); m = Mouse.GetState(); // Update displacements displacementX = (graphics.PreferredBackBufferWidth / 2) / scale; displacementY = (graphics.PreferredBackBufferHeight / 2) / scale; // Make sure the game is active if (this.IsActive) { if (focusState.Equals(FocusState.Unfocused)) { focusState = FocusState.Focused; focusSound.Play(); } } else { focusState = FocusState.Unfocused; } switch (focusState) { case FocusState.Focused: switch (gameState) { case GameState.Quitting: #region Quitting Update Logic // Everything needed to be done before quitting is done here this.Exit(); #endregion break; case GameState.Menu: #region Menu Update Logic // Allow the user to enter the game if (k.IsKeyDown(Keys.Enter)) { gameState = GameState.Generating; // Generate the level level = new Level(1024, 128, 0.18F); level.generateLevel(); // Load the player onto the level player = new Player(new Vector2(Tile.tileWidth * 128, Tile.tileHeight * 64), playerSize, Vector2.Zero); level.player = player; // Move the camera cameraTarget.X = level.player.position.X; cameraTarget.Y = level.player.position.Y; cameraPosition.X = cameraTarget.X; cameraPosition.Y = cameraTarget.Y; } // Allow the user to quit the game if (k.IsKeyDown(Keys.Q)) { gameState = GameState.Quitting; } #endregion break; case GameState.Exploring: #region Exploring Update Logic // Update the level level.update(level, gameState, k, kOld, m, mOld); // TEMPORARY //for(int i = 0; i < level.entities.Count; i++) //{ // //inventory.Add(level.entities[i].dropResource); // if(inventory[random.Next(0, inventoryWidth), random.Next(0, inventoryHeight)].addItem(level.entities[i].dropResource)) // level.entities.RemoveAt(i); //} // Allow the player to exit to the menu if (k.IsKeyDown(Keys.Escape)) { gameState = GameState.Menu; pauseSound.Play(); } // Allow the user to open their inventory if (k.IsKeyDown(Keys.Tab) && kOld.IsKeyUp(Keys.Tab)) { gameState = GameState.Inventory; openSound.Play(); } // Tick? if (tickCounter >= 3) { level.tick(level, cameraPosition, displacementX, displacementY); tickCounter = 0; } // Move the focus focusPosition.X += ((focusTargetTileX * Tile.tileWidth) - focusPosition.X) / 3.0F; focusPosition.Y += ((focusTargetTileY * Tile.tileHeight) - focusPosition.Y) / 3.0F; focusTargetTileX = (((m.X / scale) - displacementX) + (int)cameraPosition.X) / Tile.tileWidth; focusTargetTileY = (((m.Y / scale) - displacementY) + (int)cameraPosition.Y) / Tile.tileHeight; // Placing Blocks if (m.RightButton.Equals(ButtonState.Pressed) && !m.RightButton.Equals(mOld.RightButton)) { if (level.getTile( focusTargetTileX, focusTargetTileY).ID <= 0) { level.setTile( focusTargetTileX, focusTargetTileY, new WoodPlankTile(0, random)); placeSound.Play(); } } // Destroying Blocks if (m.LeftButton.Equals(ButtonState.Pressed) && !m.LeftButton.Equals(mOld.LeftButton)) { if (level.getTile( focusTargetTileX, focusTargetTileY).ID > 0) { level.removeTile(level, focusTargetTileX, focusTargetTileY); breakSound.Play(); } } // Move the camera cameraPosition.X += (cameraTarget.X - cameraPosition.X) / 10; cameraPosition.Y += (cameraTarget.Y - cameraPosition.Y) / 10; cameraTarget.X = level.player.position.X; cameraTarget.Y = level.player.position.Y; // Increment the tick counter tickCounter++; #endregion break; case GameState.Inventory: #region Inventory Update Logic // Allow the player to exit to the main menu if (k.IsKeyDown(Keys.Escape)) { gameState = GameState.Menu; pauseSound.Play(); } // Allow the player to exit the inventory if (k.IsKeyDown(Keys.Tab) && kOld.IsKeyUp(Keys.Tab)) { // If the player is holding an item in their hand, throw the items out before continuing. if (handStack.items.Count > 0) { } gameState = GameState.Exploring; closeSound.Play(); } // Find out what item stack the user is pointing at if (m.X / scale >= inventoryX && m.X / scale < inventoryX + (inventoryWidth * Tile.tileWidth) && m.Y / scale >= inventoryY && m.Y / scale < inventoryY + (inventoryHeight * Tile.tileHeight)) { inventorySelectionX = ((m.X / scale) - inventoryX) / Tile.tileWidth; inventorySelectionY = ((m.Y / scale) - inventoryY) / Tile.tileHeight; } else { inventorySelectionX = -1; inventorySelectionY = -1; } // The player has clicked! if ((m.LeftButton.Equals(ButtonState.Pressed) && mOld.LeftButton.Equals(ButtonState.Released)) || m.RightButton.Equals(ButtonState.Pressed) && mOld.RightButton.Equals(ButtonState.Released)) { // First, make sure a slot in the inventory is selected. int iX = inventorySelectionX; int iY = inventorySelectionY; if (iX >= 0 && iY >= 0) { if (m.LeftButton.Equals(ButtonState.Pressed) && m.RightButton.Equals(ButtonState.Released)) { if (handStack.items.Count > 0 && inventory[iX, iY].items.Count <= 0) { // Player drops items into an empty inventory slot if (inventory[iX, iY].addStack(handStack)) { handStack.items.Clear(); } } else if (handStack.items.Count > 0 && inventory[iX, iY].items.Count > 0 && handStack.items[handStack.items.Count - 1].ID .Equals(inventory[iX, iY].items[inventory[iX, iY].items.Count - 1].ID)) { // Player adds items to an existing pile in the inventory if (inventory[iX, iY].addStack(handStack)) { handStack.items.Clear(); } } else if (handStack.items.Count <= 0 && inventory[iX, iY].items.Count > 0) { // Player picks up a pile of items from the inventory if (handStack.addStack(inventory[iX, iY])) { inventory[iX, iY].items.Clear(); } } } } else { // Allow the player to throw items if (handStack.items.Count > 0) { if (m.LeftButton.Equals(ButtonState.Pressed) && m.RightButton.Equals(ButtonState.Released)) { foreach (Resource r in handStack.items) { level.addEntity(new DropEntity(cameraPosition, Vector2.Zero, r)); } handStack.items.Clear(); } else if (m.LeftButton.Equals(ButtonState.Released) && m.RightButton.Equals(ButtonState.Pressed)) { level.addEntity(new DropEntity(cameraPosition, Vector2.Zero, handStack.getOne())); } } } } #endregion break; case GameState.Generating: #region Generating Update Logic if (level.genDone) { gameState = GameState.Exploring; spawnSound.Play(); } #endregion break; } break; case FocusState.Unfocused: #region Unfocused Update Logic #endregion break; } // Turn on/off the debug information if (k.IsKeyDown(Keys.F3) && kOld.IsKeyUp(Keys.F3)) { showDebug = !showDebug; } // Update the old keyboard and mouse variables kOld = k; mOld = m; updates++; base.Update(gameTime); }