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