SteelGolem icon

game1.cs

SteelGolem | PRO | 07/11/19 02:18:38 AM UTC | 0 ⭐ | 507 👁️ | Never ⏰ | []
C# |

12.08 KB

|

None

|

0 👍

/

0 👎

 
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
 
namespace WindowsGame1
{
    public class Game1 : Game
    {
        static void Main(string[] args)
        {
            using (Game1 game = new Game1())
            {
                game.Run();
            }
        }
 
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
 
        KeyboardState keyboard, lastKeyboard;
        MouseState mouse, lastMouse;
        GamePadState gamepad, lastGamepad;
 
        int gameWidth = 160;
        int gameHeight = 144;
        int gameScale = 4;
 
        Texture2D spriteSheet;
        Texture2D background;
        Texture2D fontSheet;
 
        Dictionary<string, Rectangle> srcRectLookup;
 
        //string dataFolder = @"E:\coding\ano sekai\data\";
 
        string gameState;
 
        int invw, invh;
        string[,] inventory;
        int invx, invy;
        string itemB, itemA;
 
        int playerx, playery;
        string playerSrcRect;
 
        bool usingGamepad;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferWidth = gameWidth * gameScale;
            graphics.PreferredBackBufferHeight = gameHeight * gameScale;
            Content.RootDirectory = "Content";
            IsMouseVisible = true;
        }
 
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            spriteSheet = Content.Load<Texture2D>("sprite_sheet");
            background = Content.Load<Texture2D>("background");
            fontSheet = Content.Load<Texture2D>("zla_font");
            {
                Color black = new Color(0x00, 0x00, 0x00);
                Color[] colorData = new Color[fontSheet.Width * fontSheet.Height];
                fontSheet.GetData<Color>(colorData);
                for (int c = 0; c < fontSheet.Width * fontSheet.Height; c++)
                    if (colorData[c] == black) colorData[c] = Color.Transparent;
                fontSheet.SetData<Color>(colorData);
            }
 
            srcRectLookup = new Dictionary<string, Rectangle>();
            srcRectLookup.Add("link_u", new Rectangle(0, 0, 16, 16));
            srcRectLookup.Add("link_d", new Rectangle(0, 17, 16, 16));
            srcRectLookup.Add("link_l", new Rectangle(0, 34, 16, 16));
            srcRectLookup.Add("link_r", new Rectangle(0, 51, 16, 16));
            srcRectLookup.Add("inv_cursor", new Rectangle(128, 0, 40, 16));
            srcRectLookup.Add("item_grass", new Rectangle(128, 17, 24, 16));
            srcRectLookup.Add("item_flowers", new Rectangle(153, 17, 24, 16));
            srcRectLookup.Add("item_dirt_path", new Rectangle(178, 17, 24, 16));
            srcRectLookup.Add("item_tall_grass", new Rectangle(203, 17, 24, 16));
            srcRectLookup.Add("item_fence", new Rectangle(128, 34, 24, 16));
 
            invw = 4;
            invh = 5;
            inventory = new string[invw, invh];
            inventory[0, 0] = "item_grass";
            inventory[0, 1] = "item_flowers";
            inventory[0, 2] = "item_dirt_path";
            inventory[1, 0] = "item_tall_grass";
            inventory[1, 1] = "item_fence";
            invx = 0;
            invy = 0;
 
            playerx = 120;
            playery = 36;
            playerSrcRect = "link_d";
 
            gameState = "main";
 
            usingGamepad = false;
        }
 
        protected override void Update(GameTime gameTime)
        {
            keyboard = Keyboard.GetState();
            mouse = Mouse.GetState();
            gamepad = GamePad.GetState(PlayerIndex.One);
 
            if (keyboard.IsKeyDown(Keys.Escape)) this.Exit();
 
            if (gameState == "main")
            {
                if (!IsActive) goto DONE_PLAYER;
 
                if ((keyboard.IsKeyDown(Keys.Enter) && !lastKeyboard.IsKeyDown(Keys.Enter)) ||
                    (gamepad.IsButtonDown(Buttons.Start) && !lastGamepad.IsButtonDown(Buttons.Start)))
                {
                    gameState = "inventory";
                    goto DONE_PLAYER;
                }
 
                int dx = 0;
                int dy = 0;
                if (keyboard.IsKeyDown(Keys.Up) || gamepad.IsButtonDown(Buttons.DPadUp))
                {
                    dy--;
                }
                if (keyboard.IsKeyDown(Keys.Down) || gamepad.IsButtonDown(Buttons.DPadDown))
                {
                    dy++;
                }
                if (keyboard.IsKeyDown(Keys.Left) || gamepad.IsButtonDown(Buttons.DPadLeft))
                {
                    dx--;
                }
                if (keyboard.IsKeyDown(Keys.Right) || gamepad.IsButtonDown(Buttons.DPadRight))
                {
                    dx++;
                }
                if (dx != 0 || dy != 0)
                {
                    playerx += dx;
                    playery += dy;
                    if (dx == 0 && dy < 0) playerSrcRect = "link_u";
                    if (dx == 0 && dy > 0) playerSrcRect = "link_d";
                    if (dx < 0 && dy == 0) playerSrcRect = "link_l";
                    if (dx > 0 && dy == 0) playerSrcRect = "link_r";
                }
            }
            else if (gameState == "inventory")
            {
                if (!IsActive) goto DONE_PLAYER;
 
                if ((keyboard.IsKeyDown(Keys.Enter) && !lastKeyboard.IsKeyDown(Keys.Enter)) ||
                    (gamepad.IsButtonDown(Buttons.Start) && !lastGamepad.IsButtonDown(Buttons.Start)))
                {
                    gameState = "main";
                    goto DONE_PLAYER;
                }
 
                if ((keyboard.IsKeyDown(Keys.Up) && !lastKeyboard.IsKeyDown(Keys.Up)) ||
                    (gamepad.IsButtonDown(Buttons.DPadUp) && !lastGamepad.IsButtonDown(Buttons.DPadUp)))
                {
                    invy = Math.Max(0, invy - 1);
                }
                if ((keyboard.IsKeyDown(Keys.Down) && !lastKeyboard.IsKeyDown(Keys.Down)) ||
                    (gamepad.IsButtonDown(Buttons.DPadDown) && !lastGamepad.IsButtonDown(Buttons.DPadDown)))
                {
                    invy = Math.Min(invh - 1, invy + 1);
                }
                if ((keyboard.IsKeyDown(Keys.Left) && !lastKeyboard.IsKeyDown(Keys.Left)) ||
                    (gamepad.IsButtonDown(Buttons.DPadLeft) && !lastGamepad.IsButtonDown(Buttons.DPadLeft)))
                {
                    invx = Math.Max(0, invx - 1);
                }
                if ((keyboard.IsKeyDown(Keys.Right) && !lastKeyboard.IsKeyDown(Keys.Right)) ||
                    (gamepad.IsButtonDown(Buttons.DPadRight) && !lastGamepad.IsButtonDown(Buttons.DPadRight)))
                {
                    invx = Math.Min(invw - 1, invx + 1);
                }
                if ((keyboard.IsKeyDown(Keys.Z) && !lastKeyboard.IsKeyDown(Keys.Z)) ||
                    (gamepad.IsButtonDown(Buttons.X) && !lastGamepad.IsButtonDown(Buttons.X)))
                {
                    string temp = itemB;
                    itemB = inventory[invx, invy];
                    inventory[invx, invy] = temp;
                }
                if ((keyboard.IsKeyDown(Keys.X) && !lastKeyboard.IsKeyDown(Keys.X)) ||
                    (gamepad.IsButtonDown(Buttons.A) && !lastGamepad.IsButtonDown(Buttons.A)))
                {
                    string temp = itemA;
                    itemA = inventory[invx, invy];
                    inventory[invx, invy] = temp;
                }
            }
            DONE_PLAYER:
 
            if (gamepad.IsButtonDown(Buttons.DPadUp) ||
                gamepad.IsButtonDown(Buttons.DPadDown) ||
                gamepad.IsButtonDown(Buttons.DPadLeft) ||
                gamepad.IsButtonDown(Buttons.DPadRight) ||
                gamepad.IsButtonDown(Buttons.X) ||
                gamepad.IsButtonDown(Buttons.A) ||
                gamepad.IsButtonDown(Buttons.Start))
            {
                usingGamepad = true;
            }
            if (keyboard.IsKeyDown(Keys.Up) ||
                keyboard.IsKeyDown(Keys.Down) ||
                keyboard.IsKeyDown(Keys.Left) ||
                keyboard.IsKeyDown(Keys.Right) ||
                keyboard.IsKeyDown(Keys.Z) ||
                keyboard.IsKeyDown(Keys.X) ||
                keyboard.IsKeyDown(Keys.Enter))
            {
                usingGamepad = false;
            }
 
 
            lastKeyboard = keyboard;
            lastMouse = mouse;
            lastGamepad = gamepad;
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            //GraphicsDevice.Clear(new Color(0xF8, 0xF8, 0xF8));
 
            Matrix scaleMatrix = Matrix.CreateScale(gameScale, gameScale, 1);
            Matrix transMatrix = Matrix.CreateTranslation(0, 0, 0);
            if (gameState == "inventory") transMatrix = Matrix.CreateTranslation(0, -128, 0);
            spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp, null, null, null, transMatrix * scaleMatrix);
            {
                spriteBatch.Draw(background, Vector2.Zero, new Color(0x80, 0x80, 0xFF));
 
                {
                    if (usingGamepad)
                    {
                        DrawText(spriteBatch, "\xF3", new Vector2(0, 128), Color.Black, Color.White);
                        DrawText(spriteBatch, "\xF1", new Vector2(40, 128), Color.Black, Color.White);
                    }
                    else
                    {
                        DrawText(spriteBatch, "\xF2", new Vector2(0, 128), Color.Black, Color.White);
                        DrawText(spriteBatch, "\xF3", new Vector2(40, 128), Color.Black, Color.White);
                    }
 
                    if (itemB != null)
                        spriteBatch.Draw(spriteSheet, new Vector2(8, 128), srcRectLookup[itemB], Color.White);
                    if (itemA != null)
                        spriteBatch.Draw(spriteSheet, new Vector2(48, 128), srcRectLookup[itemA], Color.White);
 
                    for (int y = 0; y < invh; y++)
                    {
                        for (int x = 0; x < invw; x++)
                        {
                            if (inventory[x, y] != null)
                                spriteBatch.Draw(spriteSheet, new Vector2(8 + x * 40, 152 + y * 24), srcRectLookup[inventory[x, y]], Color.White);
                        }
                    }
                    spriteBatch.Draw(spriteSheet, new Vector2(invx * 40, 152 + invy * 24), srcRectLookup["inv_cursor"], Color.White);
 
                    if (inventory[invx, invy] != null)
                        DrawText(spriteBatch, inventory[invx, invy], new Vector2(0, background.Height - 8), Color.White, Color.Black);
                }
 
                spriteBatch.Draw(spriteSheet, new Vector2(playerx, playery), srcRectLookup[playerSrcRect], Color.White);
            }
            spriteBatch.End();
 
            base.Draw(gameTime);
        }
 
        void DrawText(SpriteBatch spriteBatch, string text, Vector2 topLeft, Color fg, Color bg)
        {
            Vector2 pos = topLeft;
            Rectangle srcRect = new Rectangle(0, 0, 8, 8);
            Rectangle bgRect = new Rectangle(279, 63, 8, 8);
            for (int t = 0; t < text.Length; t++)
            {
                int c = text[t];
 
                if (c == '\n')
                {
                    pos.X = topLeft.X;
                    pos.Y += 8;
                    continue;
                }
 
                spriteBatch.Draw(fontSheet, pos, bgRect, bg);
 
                srcRect.X = (c % 16) * 9;
                srcRect.Y = (c / 16) * 9;
                spriteBatch.Draw(fontSheet, pos, srcRect, fg);
                pos.X += 8;
            }
        }
    }
}

Comments