diff --git a/Jumpy.Shared/Jumpy.Shared.projitems b/Jumpy.Shared/Jumpy.Shared.projitems index 601821d..6d43ed9 100644 --- a/Jumpy.Shared/Jumpy.Shared.projitems +++ b/Jumpy.Shared/Jumpy.Shared.projitems @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/Jumpy.Shared/JumpyGame.cs b/Jumpy.Shared/JumpyGame.cs index da74fde..7c53af4 100644 --- a/Jumpy.Shared/JumpyGame.cs +++ b/Jumpy.Shared/JumpyGame.cs @@ -8,12 +8,13 @@ namespace Jumpy { public class JumpyGame : Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; - Texture2D playerTexture; SpriteFont font; KeyboardInput keyboardInput = new KeyboardInput(); bool fullScreen = false; IDisplay display; + Player player; + public JumpyGame() { graphics = new GraphicsDeviceManager(this); IsMouseVisible = true; @@ -33,7 +34,8 @@ namespace Jumpy { protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); font = Content.Load("font"); - playerTexture = Content.Load("player"); + player = new Player(Content.Load("player")); + } // Called once per game. Unloads all game content. @@ -44,6 +46,7 @@ namespace Jumpy { // Updates the game world. protected override void Update(GameTime gameTime) { keyboardInput.Update(); + GamePadState gamePadState = GamePad.GetState(PlayerIndex.One); List keysDown = keyboardInput.NewKeysDown(); if (keysDown.Contains(Keys.F12)) { @@ -51,11 +54,13 @@ namespace Jumpy { display.SetFullScreen(fullScreen); } - if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || + if (gamePadState.Buttons.Start == ButtonState.Pressed || keysDown.Contains(Keys.Escape)) { Exit(); } + player.Update(gameTime, gamePadState); + base.Update(gameTime); } @@ -63,18 +68,8 @@ namespace Jumpy { protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); - const int spriteSize = 144; - int frameNum = gameTime.TotalGameTime.Milliseconds / 250; - if (frameNum == 3) { - frameNum = 1; - } - int sourceX = spriteSize * frameNum + spriteSize * 3; - int sourceY = spriteSize * 0; - Rectangle source = new Rectangle(sourceX, sourceY, spriteSize, spriteSize); - Vector2 position = new Vector2(100, 100); - Vector2 spriteCenter = new Vector2(spriteSize / 2, spriteSize / 2); spriteBatch.Begin(); - spriteBatch.Draw(playerTexture, position, source, Color.White, 0f, spriteCenter, Vector2.One, SpriteEffects.FlipHorizontally, 0f); + player.Draw(gameTime, spriteBatch); spriteBatch.End(); // spriteBatch.DrawString(font, "hello world", new Vector2(100, 100), Color.Black); diff --git a/Jumpy.Shared/Player.cs b/Jumpy.Shared/Player.cs new file mode 100644 index 0000000..27b7a0f --- /dev/null +++ b/Jumpy.Shared/Player.cs @@ -0,0 +1,73 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using System; + +namespace Jumpy { + class Player { + enum Facing { Left, Right }; + enum Pose { Walking, Standing, Crouching, Stretching }; + + private const int spriteSize = 144; + private const int spriteWidth = 20; + private const int moveSpeed = 600; + + // TODO: stop assuming 1920x1080. + private Vector2 position = new Vector2(200, 1080 - spriteSize / 2); + private Facing facing = Facing.Right; + private Pose pose = Pose.Standing; + private Texture2D texture; + + public Player(Texture2D texture) { + this.texture = texture; + } + + public void Update(GameTime gameTime, GamePadState gamePadState) { + Vector2 leftStick = gamePadState.ThumbSticks.Left; + if (leftStick.X < -0.5) { + facing = Facing.Left; + pose = Pose.Walking; + position.X -= moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; + } else if (leftStick.X > 0.5) { + facing = Facing.Right; + pose = Pose.Walking; + position.X += moveSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds; + } else if (leftStick.Y < -0.5) { + pose = Pose.Crouching; + } else if (leftStick.Y > 0.5) { + pose = Pose.Stretching; + } else { + pose = Pose.Standing; + } + position.X = Math.Min(Math.Max(position.X, 0 + spriteWidth), 1920 - spriteWidth); + } + + private Point spritePosition(Pose pose, GameTime time) { + switch (pose) { + case Pose.Walking: + int frameNum = (time.TotalGameTime.Milliseconds / 125) % 4; + if (frameNum == 3) { + frameNum = 1; + } + return new Point(spriteSize * frameNum + spriteSize * 6, 0); + case Pose.Crouching: + return new Point(spriteSize * 7, spriteSize * 2); + case Pose.Stretching: + return new Point(spriteSize * 1, spriteSize * 2); + case Pose.Standing: + default: + return new Point(spriteSize * 7, 0); + } + } + + public void Draw(GameTime time, SpriteBatch spriteBatch) { + Point source = spritePosition(pose, time); + Rectangle textureSource = new Rectangle(source.X, source.Y, spriteSize, spriteSize); + Vector2 spriteCenter = new Vector2(spriteSize / 2, spriteSize / 2); + SpriteEffects effect = facing == Facing.Right ? + SpriteEffects.FlipHorizontally : SpriteEffects.None; + spriteBatch.Draw(texture, position, textureSource, Color.White, 0f, spriteCenter, + Vector2.One, effect, 0f); + } + } +}