From ccf03f18ed414f201ad4e6665f17853caaa06215 Mon Sep 17 00:00:00 2001 From: Dylan Wilson Date: Tue, 31 Jul 2018 21:52:13 +1000 Subject: [PATCH] little explosions and fixed more bugs in the ecs --- .../Content/0x72_16x16DungeonTileset.v4.png | Bin 11933 -> 22495 bytes Source/Demos/JamGame/EntityFactory.cs | 22 +++++++++++++++--- Source/Demos/JamGame/GameMain.cs | 14 +++++++---- .../Systems/CollisionResponseSystem.cs | 14 +++++++++-- .../JamGame/Systems/PlayerControlSystem.cs | 11 +++++---- .../JamGame/Systems/SpriteRenderingSystem.cs | 10 ++++++-- .../SpriteSheetAnimationFactory.cs | 4 +--- Source/MonoGame.Extended/Collections/Bag.cs | 2 +- 8 files changed, 58 insertions(+), 19 deletions(-) diff --git a/Source/Demos/JamGame/Content/0x72_16x16DungeonTileset.v4.png b/Source/Demos/JamGame/Content/0x72_16x16DungeonTileset.v4.png index ea123ef5fa0ffdf48fa42df0f6096e23c05362d6..ad97407b56e8d22ad8c9638ba259d6e39bec6315 100644 GIT binary patch literal 22495 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 fb&_ERIbSHX-c*cV5_eGR&E}r! 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 diff --git a/Source/Demos/JamGame/EntityFactory.cs b/Source/Demos/JamGame/EntityFactory.cs index d31b6261..fb17553a 100644 --- a/Source/Demos/JamGame/EntityFactory.cs +++ b/Source/Demos/JamGame/EntityFactory.cs @@ -1,6 +1,9 @@ -using JamGame.Components; +using System.Linq; +using JamGame.Components; using Microsoft.Xna.Framework; using MonoGame.Extended; +using MonoGame.Extended.Animations; +using MonoGame.Extended.Animations.SpriteSheets; using MonoGame.Extended.Entities; using MonoGame.Extended.Sprites; @@ -31,7 +34,7 @@ namespace JamGame var entity = World.CreateEntity(); entity.Attach(new Sprite(_tileset.GetTile(145))); entity.Attach(new Transform2(x, y)); - entity.Attach(new Body { Size = new Size2(16, 16) }); + entity.Attach(new Body { Size = new Size2(16, 16), Velocity = new Vector2(-8, 0) }); entity.Attach(new Enemy()); } @@ -49,7 +52,7 @@ namespace JamGame var entity = World.CreateEntity(); entity.Attach(new Sprite(_tileset.GetTile(213))); entity.Attach(new Transform2(x, y)); - entity.Attach(new Body { Size = new Size2(16, 16) }); + entity.Attach(new Body { Size = new Size2(16, 16), Velocity = new Vector2(-2, 0) }); entity.Attach(new Enemy()); } @@ -62,5 +65,18 @@ namespace JamGame entity.Attach(new Projectile()); return entity; } + + public void SpawnExplosion(Vector2 position, Vector2 velocity) + { + var frames = new[] {256, 257, 258, 259, 260, 261, 262, 263, 264}; + var animationFactory = new SpriteSheetAnimationFactory(frames.Select(f => _tileset.GetTile(f))); + animationFactory.Add("explode", new SpriteSheetAnimationData(new []{0,1,2,3,4,5,6,7,8}, isLooping: false, frameDuration: 1f / 32f)); + var entity = World.CreateEntity(); + var animatedSprite = new AnimatedSprite(animationFactory); + entity.Attach(animatedSprite); + entity.Attach(new Transform2(position)); + entity.Attach(new Body {Velocity = velocity}); + animatedSprite.Play("explode", () => entity.Destroy()); + } } } \ No newline at end of file diff --git a/Source/Demos/JamGame/GameMain.cs b/Source/Demos/JamGame/GameMain.cs index aac501ec..566ca580 100644 --- a/Source/Demos/JamGame/GameMain.cs +++ b/Source/Demos/JamGame/GameMain.cs @@ -2,6 +2,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; +using MonoGame.Extended; using MonoGame.Extended.BitmapFonts; using MonoGame.Extended.Entities; @@ -44,15 +45,20 @@ namespace JamGame .AddSystem(new PlayerControlSystem(this, entityFactory)) .AddSystem(new BodyMovementSystem()) .AddSystem(new CollisionSystem()) - .AddSystem(new CollisionResponseSystem()) + .AddSystem(new CollisionResponseSystem(entityFactory)) .Build(); entityFactory.World = _world; entityFactory.SpawnPlayer(100, 100); - entityFactory.SpawnZombie(200, 80); - entityFactory.SpawnSkeleton(200, 100); - entityFactory.SpawnPurpleThing(200, 120); + var random = new FastRandom(); + + for (var i = 0; i < 20; i++) + { + entityFactory.SpawnZombie(random.Next(150, 800), random.Next(0, 480)); + //entityFactory.SpawnSkeleton(random.Next(150, 250), random.Next(110, 250)); + //entityFactory.SpawnPurpleThing(random.Next(150, 250), random.Next(110, 250)); + } } protected override void UnloadContent() diff --git a/Source/Demos/JamGame/Systems/CollisionResponseSystem.cs b/Source/Demos/JamGame/Systems/CollisionResponseSystem.cs index ffdf5f04..37abcab8 100644 --- a/Source/Demos/JamGame/Systems/CollisionResponseSystem.cs +++ b/Source/Demos/JamGame/Systems/CollisionResponseSystem.cs @@ -1,5 +1,6 @@ using JamGame.Components; using Microsoft.Xna.Framework; +using MonoGame.Extended; using MonoGame.Extended.Entities; using MonoGame.Extended.Entities.Systems; @@ -7,11 +8,13 @@ namespace JamGame.Systems { public class CollisionResponseSystem : EntityProcessingSystem { + private readonly EntityFactory _entityFactory; private ComponentMapper _bodyMapper; - public CollisionResponseSystem() - : base(Aspect.All(typeof(Body))) + public CollisionResponseSystem(EntityFactory entityFactory) + : base(Aspect.All(typeof(Body), typeof(Transform2))) { + _entityFactory = entityFactory; } public override void Initialize(IComponentMapperService mapperService) @@ -28,10 +31,17 @@ namespace JamGame.Systems var entity = GetEntity(entityId); if (entity.Has()) + { + _entityFactory.SpawnExplosion(entity.Get().Position, body.Velocity / 2f); entity.Destroy(); + } + if (entity.Has()) + { + _entityFactory.SpawnExplosion(entity.Get().Position, body.Velocity / 2f); entity.Destroy(); + } } } } diff --git a/Source/Demos/JamGame/Systems/PlayerControlSystem.cs b/Source/Demos/JamGame/Systems/PlayerControlSystem.cs index fb3ba8e9..7d6b8f71 100644 --- a/Source/Demos/JamGame/Systems/PlayerControlSystem.cs +++ b/Source/Demos/JamGame/Systems/PlayerControlSystem.cs @@ -63,14 +63,17 @@ namespace JamGame.Systems if (_previousKeyboardState.IsKeyUp(Keys.Space) && _mainGame.KeyboardState.IsKeyDown(Keys.Space)) _spawningFireball = _entityFactory.SpawnFireball(transform.Position.X + 16, transform.Position.Y); - if (_spawningFireball != null && _previousKeyboardState.IsKeyDown(Keys.Space) && _mainGame.KeyboardState.IsKeyUp(Keys.Space)) + // Kinda hacky but it works for now. + var spawningFireballBody = _spawningFireball?.Get(); + if (spawningFireballBody != null && _previousKeyboardState.IsKeyDown(Keys.Space) && _mainGame.KeyboardState.IsKeyUp(Keys.Space)) { - _spawningFireball.Get().Velocity = new Vector2(200, 0); + spawningFireballBody.Velocity = new Vector2(200, 0); _spawningFireball = null; } - if(_spawningFireball != null) - _spawningFireball.Get().Position = new Vector2(transform.Position.X + 16, transform.Position.Y); + var spawningFireballTransform = _spawningFireball?.Get(); + if(spawningFireballTransform != null) + spawningFireballTransform.Position = new Vector2(transform.Position.X + 16, transform.Position.Y); } _previousKeyboardState = _mainGame.KeyboardState; diff --git a/Source/Demos/JamGame/Systems/SpriteRenderingSystem.cs b/Source/Demos/JamGame/Systems/SpriteRenderingSystem.cs index 121090cf..9c30c706 100644 --- a/Source/Demos/JamGame/Systems/SpriteRenderingSystem.cs +++ b/Source/Demos/JamGame/Systems/SpriteRenderingSystem.cs @@ -1,6 +1,7 @@ using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using MonoGame.Extended; +using MonoGame.Extended.Animations; using MonoGame.Extended.Entities; using MonoGame.Extended.Entities.Systems; using MonoGame.Extended.Sprites; @@ -13,9 +14,10 @@ namespace JamGame.Systems private ComponentMapper _transformMapper; private ComponentMapper _spriteMapper; + private ComponentMapper _animatedSpriteMapper; public SpriteRenderingSystem(GraphicsDevice graphicsDevice, Texture2D texture) - : base(Aspect.All(typeof(Transform2), typeof(Sprite))) + : base(Aspect.All(typeof(Transform2)).One(typeof(Sprite), typeof(AnimatedSprite))) { _spriteBatch = new SpriteBatch(graphicsDevice); } @@ -24,6 +26,7 @@ namespace JamGame.Systems { _transformMapper = mapperService.GetMapper(); _spriteMapper = mapperService.GetMapper(); + _animatedSpriteMapper = mapperService.GetMapper(); } public override void Draw(GameTime gameTime) @@ -33,9 +36,12 @@ namespace JamGame.Systems foreach (var entity in ActiveEntities) { var transform = _transformMapper.Get(entity); + var animatedSprite = _animatedSpriteMapper.Get(entity); var sprite = _spriteMapper.Get(entity); - _spriteBatch.Draw(sprite, transform); + animatedSprite?.Update(gameTime); + + _spriteBatch.Draw(sprite ?? animatedSprite, transform); } _spriteBatch.End(); diff --git a/Source/MonoGame.Extended.Animations/SpriteSheets/SpriteSheetAnimationFactory.cs b/Source/MonoGame.Extended.Animations/SpriteSheets/SpriteSheetAnimationFactory.cs index 9615f4df..8c28223c 100644 --- a/Source/MonoGame.Extended.Animations/SpriteSheets/SpriteSheetAnimationFactory.cs +++ b/Source/MonoGame.Extended.Animations/SpriteSheets/SpriteSheetAnimationFactory.cs @@ -34,9 +34,7 @@ namespace MonoGame.Extended.Animations.SpriteSheets public SpriteSheetAnimation Create(string name) { - SpriteSheetAnimationData data; - - if (_animationDataDictionary.TryGetValue(name, out data)) + if (_animationDataDictionary.TryGetValue(name, out var data)) { var keyFrames = data.FrameIndicies .Select(i => Frames[i]) diff --git a/Source/MonoGame.Extended/Collections/Bag.cs b/Source/MonoGame.Extended/Collections/Bag.cs index e2884486..cfa59689 100644 --- a/Source/MonoGame.Extended/Collections/Bag.cs +++ b/Source/MonoGame.Extended/Collections/Bag.cs @@ -57,7 +57,7 @@ namespace MonoGame.Extended.Collections public T this[int index] { - get => _items[index]; + get => index >= _items.Length ? default(T) : _items[index]; set { EnsureCapacity(index + 1);