コード例 #1
0
ファイル: Game.cs プロジェクト: Boddypen/Pixia
        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);
        }