diff --git a/Source/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapImporter.cs b/Source/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapImporter.cs
index efb93e0f..dcb66131 100644
--- a/Source/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapImporter.cs
+++ b/Source/MonoGame.Extended.Content.Pipeline/Tiled/TiledMapImporter.cs
@@ -1,4 +1,6 @@
-using System.IO;
+using System;
+using System.Diagnostics;
+using System.IO;
using System.Xml.Serialization;
using Microsoft.Xna.Framework.Content.Pipeline;
@@ -9,22 +11,30 @@ namespace MonoGame.Extended.Content.Pipeline.Tiled
{
public override TmxMap Import(string filename, ContentImporterContext context)
{
+ if (filename == null) throw new ArgumentNullException("filename");
+
using (var reader = new StreamReader(filename))
{
var serializer = new XmlSerializer(typeof(TmxMap));
var map = (TmxMap)serializer.Deserialize(reader);
+ var xmlSerializer = new XmlSerializer(typeof(TmxTileset));
- XmlSerializer xml = new XmlSerializer(typeof(TmxTileset));
- for (int i = 0; i < map.Tilesets.Count; i++)
+ for (var i = 0; i < map.Tilesets.Count; i++)
{
var tileset = map.Tilesets[i];
+
if (!string.IsNullOrWhiteSpace(tileset.Source))
{
- string dir = Path.GetDirectoryName(filename);
- string tilesetLocation = tileset.Source.Replace('/', Path.DirectorySeparatorChar);
- string filePath = Path.Combine(dir, tilesetLocation);
- using (FileStream file = new FileStream(filePath, FileMode.Open))
- map.Tilesets[i] = (TmxTileset)xml.Deserialize(file);
+ var directoryName = Path.GetDirectoryName(filename);
+ var tilesetLocation = tileset.Source.Replace('/', Path.DirectorySeparatorChar);
+
+ Debug.Assert(directoryName != null, "directoryName != null");
+ var filePath = Path.Combine(directoryName, tilesetLocation);
+
+ using (var file = new FileStream(filePath, FileMode.Open))
+ {
+ map.Tilesets[i] = (TmxTileset) xmlSerializer.Deserialize(file);
+ }
}
}
diff --git a/Source/MonoGame.Extended/MonoGame.Extended.csproj b/Source/MonoGame.Extended/MonoGame.Extended.csproj
index 0ceafdf5..9c376740 100644
--- a/Source/MonoGame.Extended/MonoGame.Extended.csproj
+++ b/Source/MonoGame.Extended/MonoGame.Extended.csproj
@@ -59,6 +59,7 @@
+
diff --git a/Source/Sandbox/SpriteSheetAnimator.cs b/Source/MonoGame.Extended/Sprites/SpriteSheetAnimator.cs
similarity index 73%
rename from Source/Sandbox/SpriteSheetAnimator.cs
rename to Source/MonoGame.Extended/Sprites/SpriteSheetAnimator.cs
index e07a02d8..f43014d4 100644
--- a/Source/Sandbox/SpriteSheetAnimator.cs
+++ b/Source/MonoGame.Extended/Sprites/SpriteSheetAnimator.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using MonoGame.Extended.Sprites;
@@ -24,6 +25,7 @@ namespace Sandbox
private SpriteSheetAnimation _currentAnimation;
private float _nextFrameDelay;
private int _frameIndex;
+ private Action _onCompleteAction;
public bool IsPlaying { get; private set; }
public bool IsLooping { get; set; }
@@ -49,10 +51,14 @@ namespace Sandbox
_animations.Remove(name);
}
- public void PlayAnimation(string name)
+ public void PlayAnimation(string name, Action onCompleteAction = null)
{
+ if(_currentAnimation != null && _currentAnimation.Name == name)
+ return;
+
_currentAnimation = _animations[name];
_frameIndex = 0;
+ _onCompleteAction = onCompleteAction;
}
public void Update(GameTime gameTime)
@@ -73,6 +79,11 @@ namespace Sandbox
_frameIndex = 0;
else
IsPlaying = false;
+
+ var onCompleteAction = _onCompleteAction;
+
+ if (onCompleteAction != null)
+ onCompleteAction();
}
var atlasIndex = _currentAnimation.FrameIndicies[_frameIndex];
@@ -81,5 +92,19 @@ namespace Sandbox
_nextFrameDelay -= deltaSeconds;
}
+
+ private class SpriteSheetAnimation
+ {
+ public SpriteSheetAnimation(string name, int framesPerSecond, int[] frameIndicies)
+ {
+ Name = name;
+ FramesPerSecond = framesPerSecond;
+ FrameIndicies = frameIndicies;
+ }
+
+ public string Name { get; private set; }
+ public int FramesPerSecond { get; private set; }
+ public int[] FrameIndicies { get; private set; }
+ }
}
}
\ No newline at end of file
diff --git a/Source/Sandbox/Sandbox.csproj b/Source/Sandbox/Sandbox.csproj
index 8ee70877..0952cd7d 100644
--- a/Source/Sandbox/Sandbox.csproj
+++ b/Source/Sandbox/Sandbox.csproj
@@ -39,8 +39,6 @@
-
-
diff --git a/Source/Sandbox/SandboxGame.cs b/Source/Sandbox/SandboxGame.cs
index 9bc78b74..5564b11c 100644
--- a/Source/Sandbox/SandboxGame.cs
+++ b/Source/Sandbox/SandboxGame.cs
@@ -25,10 +25,7 @@ namespace Sandbox
private BitmapFont _bitmapFont;
private TiledMap _tiledMap;
private FramesPerSecondCounter _fpsCounter;
- private InputListenerManager _inputManager;
private SpriteAnimator _spriteAnimator;
- private Vector2 _cameraDirection = Vector2.Zero;
- private float _cameraRotation;
private Zombie _zombie;
public SandboxGame()
@@ -56,8 +53,6 @@ namespace Sandbox
Window.AllowUserResizing = true;
Window.ClientSizeChanged += (s, e) => _viewportAdapter.OnClientSizeChanged();
- SetUpInput();
-
base.Initialize();
}
@@ -91,17 +86,26 @@ namespace Sandbox
protected override void Update(GameTime gameTime)
{
var deltaSeconds = (float)gameTime.ElapsedGameTime.TotalSeconds;
+ var keyboardState = Keyboard.GetState();
- if (Keyboard.GetState().IsKeyDown(Keys.R))
+ if (keyboardState.IsKeyDown(Keys.R))
_camera.ZoomIn(deltaSeconds);
- if (Keyboard.GetState().IsKeyDown(Keys.F))
+ if (keyboardState.IsKeyDown(Keys.F))
_camera.ZoomOut(deltaSeconds);
- _inputManager.Update(gameTime);
+ if (keyboardState.IsKeyDown(Keys.Left))
+ _zombie.Walk(-1.0f);
+
+ if (keyboardState.IsKeyDown(Keys.Right))
+ _zombie.Walk(1.0f);
+
+ if (keyboardState.IsKeyDown(Keys.Space))
+ _zombie.Attack();
+
+ if (keyboardState.IsKeyDown(Keys.Enter))
+ _zombie.Die();
- _camera.Move(_cameraDirection * deltaSeconds);
- _camera.Rotation += _cameraRotation * deltaSeconds;
_sprite.Position += new Vector2(-500, 0) * deltaSeconds;
_spriteAnimator.Update(gameTime);
@@ -133,100 +137,5 @@ namespace Sandbox
base.Draw(gameTime);
}
-
- private void SetUpInput()
- {
- _inputManager = new InputListenerManager();
-
- var up = new Vector2(0, -250);
- var right = new Vector2(250, 0);
-
- //camera movement
- var keyboardListener = _inputManager.AddListener();
- var mouseListener = _inputManager.AddListener();
-
- keyboardListener.KeyPressed += (sender, args) =>
- {
- switch (args.Key)
- {
- case Keys.Escape:
- Exit();
- break;
-
- case Keys.Q:
- _cameraRotation += 1;
- break;
- case Keys.W:
- _cameraRotation -= 1;
- break;
-
- case Keys.Up:
- _cameraDirection += up;
- break;
- case Keys.Down:
- _cameraDirection += -up;
- break;
- case Keys.Left:
- _cameraDirection += -right;
- break;
- case Keys.Right:
- _cameraDirection += right;
- break;
- }
- };
-
- keyboardListener.KeyReleased += (sender, args) =>
- {
- switch (args.Key)
- {
- case Keys.Escape:
- Exit();
- break;
-
- case Keys.Q:
- _cameraRotation -= 1;
- break;
- case Keys.W:
- _cameraRotation += 1;
- break;
-
- case Keys.Up:
- _cameraDirection -= up;
- break;
- case Keys.Down:
- _cameraDirection -= -up;
- break;
- case Keys.Left:
- _cameraDirection -= -right;
- break;
- case Keys.Right:
- _cameraDirection -= right;
- break;
- }
- };
-
- // zoom
- mouseListener.MouseWheelMoved += (sender, args) =>
- {
- _camera.ZoomIn(args.ScrollWheelDelta * 0.001f);
- };
-
- //// look at
- //mouseListener.MouseUp += (sender, args) =>
- //{
- // if (args.Button == MouseButton.Left)
- // {
- // var p = _viewportAdapter.PointToScreen(args.Position);
- // Trace.WriteLine(string.Format("{0} => {1}", args.Position, p));
- // }
- //};
-
- mouseListener.MouseDown += (sender, args) => Trace.WriteLine("MouseDown");
- mouseListener.MouseUp += (sender, args) => Trace.WriteLine("MouseUp");
- mouseListener.MouseClicked += (sender, args) => Trace.WriteLine("MouseClicked");
- mouseListener.MouseDoubleClicked += (sender, args) => Trace.WriteLine("MouseDoubleClicked");
- mouseListener.MouseWheelMoved += (sender, args) => Trace.WriteLine(string.Format("MouseWheelMoved {0}", args.ScrollWheelValue));
- mouseListener.MouseDragged += (sender, args) => Trace.WriteLine("MouseDragged");
- }
}
}
diff --git a/Source/Sandbox/SpriteSheetAnimation.cs b/Source/Sandbox/SpriteSheetAnimation.cs
deleted file mode 100644
index 0c0d1b20..00000000
--- a/Source/Sandbox/SpriteSheetAnimation.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-namespace Sandbox
-{
- public class SpriteSheetAnimation
- {
- public SpriteSheetAnimation(string name, int framesPerSecond, int[] frameIndicies)
- {
- Name = name;
- FramesPerSecond = framesPerSecond;
- FrameIndicies = frameIndicies;
- }
-
- public string Name { get; private set; }
- public int FramesPerSecond { get; private set; }
- public int[] FrameIndicies { get; private set; }
- }
-}
\ No newline at end of file
diff --git a/Source/Sandbox/Zombie.cs b/Source/Sandbox/Zombie.cs
index 49440b28..c5dc85cd 100644
--- a/Source/Sandbox/Zombie.cs
+++ b/Source/Sandbox/Zombie.cs
@@ -1,3 +1,4 @@
+using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MonoGame.Extended.Sprites;
@@ -13,14 +14,30 @@ namespace Sandbox
{
OriginNormalized = new Vector2(0.5f, 1.0f)
};
+
_animator = new SpriteSheetAnimator(_sprite, textureAtlas);
+ _animator.AddAnimation("appear", framesPerSecond: 8, firstFrameIndex: 0, lastFrameIndex: 10);
_animator.AddAnimation("idle", framesPerSecond: 8, firstFrameIndex: 36, lastFrameIndex: 41);
- _animator.PlayAnimation("idle");
+ _animator.AddAnimation("walk", framesPerSecond: 8, firstFrameIndex: 19, lastFrameIndex: 28);
+ _animator.AddAnimation("attack", framesPerSecond: 8, firstFrameIndex: 29, lastFrameIndex: 35);
+ _animator.AddAnimation("die", framesPerSecond: 8, firstFrameIndex: 11, lastFrameIndex: 18);
+
+ _animator.PlayAnimation("appear", ResumeIdle);
+ }
+
+ private float _direction = -1.0f;
+
+ private void ResumeIdle()
+ {
+ IsWalking = false;
+ _animator.PlayAnimation("idle");
}
private readonly Sprite _sprite;
private readonly SpriteSheetAnimator _animator;
+ public bool IsWalking { get; private set; }
+
public Vector2 Position
{
get { return _sprite.Position; }
@@ -30,11 +47,34 @@ namespace Sandbox
public void Update(GameTime gameTime)
{
_animator.Update(gameTime);
+
+ if(IsWalking)
+ Position += new Vector2(50f * _direction, 0) * (float)gameTime.ElapsedGameTime.TotalSeconds;
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(_sprite);
}
+
+ public void Walk(float direction)
+ {
+ _sprite.Effect = _direction > 0 ? SpriteEffects.FlipHorizontally : SpriteEffects.None;
+ _direction = direction;
+ IsWalking = true;
+ _animator.PlayAnimation("walk", ResumeIdle);
+ }
+
+ public void Attack()
+ {
+ IsWalking = false;
+ _animator.PlayAnimation("attack", ResumeIdle);
+ }
+
+ public void Die()
+ {
+ IsWalking = false;
+ _animator.PlayAnimation("die", () => _animator.PlayAnimation("appear", ResumeIdle));
+ }
}
}
\ No newline at end of file