From 511a56d00a02c6ebd5e84881cbe936a5ffa51e25 Mon Sep 17 00:00:00 2001 From: Dylan Wilson Date: Sat, 2 Jun 2018 22:30:40 +1000 Subject: [PATCH] tweaks and bug fixes --- Source/Demos/Platformer/Components/Player.cs | 5 ++- Source/Demos/Platformer/Content/hero.png | Bin 2362 -> 2360 bytes Source/Demos/Platformer/EntityFactory.cs | 5 ++- Source/Demos/Platformer/GameMain.cs | 14 ++++++- .../Demos/Platformer/Systems/PlayerSystem.cs | 37 +++++++++--------- .../Demos/Platformer/Systems/RenderSystem.cs | 6 ++- .../MonoGame.Extended/OrthographicCamera.cs | 6 +-- 7 files changed, 44 insertions(+), 29 deletions(-) diff --git a/Source/Demos/Platformer/Components/Player.cs b/Source/Demos/Platformer/Components/Player.cs index f89bfc1b..90582b9e 100644 --- a/Source/Demos/Platformer/Components/Player.cs +++ b/Source/Demos/Platformer/Components/Player.cs @@ -10,7 +10,8 @@ namespace Platformer.Components public enum State { Idle, - Attacking, + Kicking, + Punching, Jumping, Falling, Walking, @@ -22,5 +23,7 @@ namespace Platformer.Components { public Facing Facing { get; set; } = Facing.Right; public State State { get; set; } + public bool IsAttacking => State == State.Kicking || State == State.Punching; + public bool CanJump => State == State.Idle || State == State.Walking; } } \ No newline at end of file diff --git a/Source/Demos/Platformer/Content/hero.png b/Source/Demos/Platformer/Content/hero.png index 118b06105c05b2a89542a12068d2fbcac0647ac3..d38154492fd4af3fe6a661d6e91fc7faaeaa15e6 100644 GIT binary patch delta 2288 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 M07*qoM6N<$g23dVi2wiq diff --git a/Source/Demos/Platformer/EntityFactory.cs b/Source/Demos/Platformer/EntityFactory.cs index 961eea8f..24ccd2fe 100644 --- a/Source/Demos/Platformer/EntityFactory.cs +++ b/Source/Demos/Platformer/EntityFactory.cs @@ -34,8 +34,9 @@ namespace Platformer animationFactory.Add("jump", new SpriteSheetAnimationData(new[] { 10, 12 }, frameDuration: 1.0f, isLooping: false)); animationFactory.Add("fall", new SpriteSheetAnimationData(new[] { 13, 14 }, frameDuration: 1.0f, isLooping: false)); animationFactory.Add("swim", new SpriteSheetAnimationData(new[] { 18, 19, 20, 21, 22, 23 })); - animationFactory.Add("kick", new SpriteSheetAnimationData(new[] { 15 }, frameDuration: 0.5f, isLooping: false)); - animationFactory.Add("cool", new SpriteSheetAnimationData(new[] { 17 }, frameDuration: 0.5f, isLooping: false)); + animationFactory.Add("kick", new SpriteSheetAnimationData(new[] { 15 }, frameDuration: 0.3f, isLooping: false)); + animationFactory.Add("punch", new SpriteSheetAnimationData(new[] { 26 }, frameDuration: 0.3f, isLooping: false)); + animationFactory.Add("cool", new SpriteSheetAnimationData(new[] { 17 }, frameDuration: 0.3f, isLooping: false)); entity.Attach(new AnimatedSprite(animationFactory, "idle")); entity.Attach(new Transform2(position, 0, Vector2.One * 4)); entity.Attach(new Body { Position = position, Size = new Vector2(32, 64), BodyType = BodyType.Dynamic }); diff --git a/Source/Demos/Platformer/GameMain.cs b/Source/Demos/Platformer/GameMain.cs index 3d412b42..72576415 100644 --- a/Source/Demos/Platformer/GameMain.cs +++ b/Source/Demos/Platformer/GameMain.cs @@ -1,6 +1,8 @@ using Autofac; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using MonoGame.Extended; +using MonoGame.Extended.Entities; using MonoGame.Extended.Tiled; using MonoGame.Extended.Tiled.Renderers; using Platformer.Systems; @@ -12,6 +14,8 @@ namespace Platformer private TiledMap _map; private TiledMapRenderer _renderer; private EntityFactory _entityFactory; + private OrthographicCamera _camera; + private Entity _playerEntity; public GameMain() { @@ -19,7 +23,10 @@ namespace Platformer protected override void RegisterDependencies(ContainerBuilder builder) { + _camera = new OrthographicCamera(GraphicsDevice); + builder.RegisterInstance(new SpriteBatch(GraphicsDevice)); + builder.RegisterInstance(_camera); builder.RegisterType(); builder.RegisterType(); builder.RegisterType(); @@ -28,7 +35,7 @@ namespace Platformer protected override void LoadContent() { _entityFactory = new EntityFactory(EntityComponentSystem.EntityManager, Content); - _entityFactory.CreatePlayer(new Vector2(100, 240)); + _playerEntity = _entityFactory.CreatePlayer(new Vector2(100, 240)); // TOOD: Load maps and collision data more nicely :) _map = Content.Load("test-map"); @@ -63,13 +70,16 @@ namespace Platformer // Exit(); _renderer.Update(gameTime); + //_camera.LookAt(_playerEntity.Get().Position); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { - _renderer.Draw(); + GraphicsDevice.Clear(Color.Black); + + _renderer.Draw(_camera.GetViewMatrix()); base.Draw(gameTime); } diff --git a/Source/Demos/Platformer/Systems/PlayerSystem.cs b/Source/Demos/Platformer/Systems/PlayerSystem.cs index 4cb27365..ee7f3783 100644 --- a/Source/Demos/Platformer/Systems/PlayerSystem.cs +++ b/Source/Demos/Platformer/Systems/PlayerSystem.cs @@ -23,20 +23,16 @@ namespace Platformer.Systems var body = entity.Get(); var keyboardState = KeyboardExtended.GetState(); - if (keyboardState.WasKeyJustUp(Keys.Up)) + if (player.CanJump) { - if (player.State != State.Jumping && player.State != State.Falling && player.State != State.Attacking) + if(keyboardState.WasKeyJustUp(Keys.Up)) body.Velocity.Y -= 550 + Math.Abs(body.Velocity.X) * 0.4f; - player.State = State.Jumping; - } - - if (keyboardState.WasKeyJustUp(Keys.Z)) - { - if(player.State == State.Idle) + if (keyboardState.WasKeyJustUp(Keys.Z)) + { body.Velocity.Y -= 550 + Math.Abs(body.Velocity.X) * 0.4f; - - player.State = State.Attacking; + player.State = player.State == State.Idle ? State.Punching : State.Kicking; + } } if (keyboardState.IsKeyDown(Keys.Right)) @@ -51,18 +47,18 @@ namespace Platformer.Systems player.Facing = Facing.Left; } - if (body.Velocity.Y < 0) - player.State = State.Jumping; - - if (body.Velocity.Y > 0) - player.State = State.Falling; - - if (player.State != State.Attacking) + if (!player.IsAttacking) { if (body.Velocity.X > 0 || body.Velocity.X < 0) player.State = State.Walking; + + if (body.Velocity.Y < 0) + player.State = State.Jumping; + + if (body.Velocity.Y > 0) + player.State = State.Falling; - if (body.Velocity.EqualsWithTolerence(Vector2.Zero, 5f)) + if (body.Velocity.EqualsWithTolerence(Vector2.Zero, 5)) player.State = State.Idle; } @@ -84,9 +80,12 @@ namespace Platformer.Systems case State.Idle: sprite.Play("idle"); break; - case State.Attacking: + case State.Kicking: sprite.Play("kick", () => player.State = State.Idle); break; + case State.Punching: + sprite.Play("punch", () => player.State = State.Idle); + break; case State.Cool: sprite.Play("cool"); break; diff --git a/Source/Demos/Platformer/Systems/RenderSystem.cs b/Source/Demos/Platformer/Systems/RenderSystem.cs index dc5f1eda..25683bb9 100644 --- a/Source/Demos/Platformer/Systems/RenderSystem.cs +++ b/Source/Demos/Platformer/Systems/RenderSystem.cs @@ -12,15 +12,17 @@ namespace Platformer.Systems public class RenderSystem : EntityProcessingSystem { private readonly SpriteBatch _spriteBatch; + private readonly OrthographicCamera _camera; - public RenderSystem(SpriteBatch spriteBatch) + public RenderSystem(SpriteBatch spriteBatch, OrthographicCamera camera) { _spriteBatch = spriteBatch; + _camera = camera; } protected override void Begin(GameTime gameTime) { - _spriteBatch.Begin(samplerState: SamplerState.PointClamp); + _spriteBatch.Begin(samplerState: SamplerState.PointClamp, transformMatrix: _camera.GetViewMatrix()); } protected override void Process(GameTime gameTime, Entity entity) diff --git a/Source/MonoGame.Extended/OrthographicCamera.cs b/Source/MonoGame.Extended/OrthographicCamera.cs index 9105fab1..2cb2ee71 100644 --- a/Source/MonoGame.Extended/OrthographicCamera.cs +++ b/Source/MonoGame.Extended/OrthographicCamera.cs @@ -35,7 +35,7 @@ namespace MonoGame.Extended public float Zoom { - get { return _zoom; } + get => _zoom; set { if ((value < MinimumZoom) || (value > MaximumZoom)) @@ -47,7 +47,7 @@ namespace MonoGame.Extended public float MinimumZoom { - get { return _minimumZoom; } + get => _minimumZoom; set { if (value < 0) @@ -62,7 +62,7 @@ namespace MonoGame.Extended public float MaximumZoom { - get { return _maximumZoom; } + get => _maximumZoom; set { if (value < 0)