basic Player motions and poses
GitOrigin-RevId: 88a4e7a20841e2551a6bdd417521228f87110449
This commit is contained in:
parent
cb2f9687fa
commit
fdd0eb60c4
@ -12,5 +12,6 @@
|
|||||||
<Compile Include="$(MSBuildThisFileDirectory)IDisplay.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)IDisplay.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)KeyboardInput.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)KeyboardInput.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)JumpyGame.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)JumpyGame.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Player.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -8,12 +8,13 @@ namespace Jumpy {
|
|||||||
public class JumpyGame : Game {
|
public class JumpyGame : Game {
|
||||||
GraphicsDeviceManager graphics;
|
GraphicsDeviceManager graphics;
|
||||||
SpriteBatch spriteBatch;
|
SpriteBatch spriteBatch;
|
||||||
Texture2D playerTexture;
|
|
||||||
SpriteFont font;
|
SpriteFont font;
|
||||||
KeyboardInput keyboardInput = new KeyboardInput();
|
KeyboardInput keyboardInput = new KeyboardInput();
|
||||||
bool fullScreen = false;
|
bool fullScreen = false;
|
||||||
IDisplay display;
|
IDisplay display;
|
||||||
|
|
||||||
|
Player player;
|
||||||
|
|
||||||
public JumpyGame() {
|
public JumpyGame() {
|
||||||
graphics = new GraphicsDeviceManager(this);
|
graphics = new GraphicsDeviceManager(this);
|
||||||
IsMouseVisible = true;
|
IsMouseVisible = true;
|
||||||
@ -33,7 +34,8 @@ namespace Jumpy {
|
|||||||
protected override void LoadContent() {
|
protected override void LoadContent() {
|
||||||
spriteBatch = new SpriteBatch(GraphicsDevice);
|
spriteBatch = new SpriteBatch(GraphicsDevice);
|
||||||
font = Content.Load<SpriteFont>("font");
|
font = Content.Load<SpriteFont>("font");
|
||||||
playerTexture = Content.Load<Texture2D>("player");
|
player = new Player(Content.Load<Texture2D>("player"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called once per game. Unloads all game content.
|
// Called once per game. Unloads all game content.
|
||||||
@ -44,6 +46,7 @@ namespace Jumpy {
|
|||||||
// Updates the game world.
|
// Updates the game world.
|
||||||
protected override void Update(GameTime gameTime) {
|
protected override void Update(GameTime gameTime) {
|
||||||
keyboardInput.Update();
|
keyboardInput.Update();
|
||||||
|
GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);
|
||||||
List<Keys> keysDown = keyboardInput.NewKeysDown();
|
List<Keys> keysDown = keyboardInput.NewKeysDown();
|
||||||
|
|
||||||
if (keysDown.Contains(Keys.F12)) {
|
if (keysDown.Contains(Keys.F12)) {
|
||||||
@ -51,11 +54,13 @@ namespace Jumpy {
|
|||||||
display.SetFullScreen(fullScreen);
|
display.SetFullScreen(fullScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||
|
if (gamePadState.Buttons.Start == ButtonState.Pressed ||
|
||||||
keysDown.Contains(Keys.Escape)) {
|
keysDown.Contains(Keys.Escape)) {
|
||||||
Exit();
|
Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
player.Update(gameTime, gamePadState);
|
||||||
|
|
||||||
base.Update(gameTime);
|
base.Update(gameTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,18 +68,8 @@ namespace Jumpy {
|
|||||||
protected override void Draw(GameTime gameTime) {
|
protected override void Draw(GameTime gameTime) {
|
||||||
GraphicsDevice.Clear(Color.CornflowerBlue);
|
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.Begin();
|
||||||
spriteBatch.Draw(playerTexture, position, source, Color.White, 0f, spriteCenter, Vector2.One, SpriteEffects.FlipHorizontally, 0f);
|
player.Draw(gameTime, spriteBatch);
|
||||||
spriteBatch.End();
|
spriteBatch.End();
|
||||||
|
|
||||||
// spriteBatch.DrawString(font, "hello world", new Vector2(100, 100), Color.Black);
|
// spriteBatch.DrawString(font, "hello world", new Vector2(100, 100), Color.Black);
|
||||||
|
73
Jumpy.Shared/Player.cs
Normal file
73
Jumpy.Shared/Player.cs
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user