From 0f5f7b84f7533a2518f51b661dcc06225767ed5b Mon Sep 17 00:00:00 2001 From: Colin McMillen Date: Mon, 30 Nov 2020 15:11:52 -0500 Subject: [PATCH] ShmupWorld: add Player.Update() as separate function --- Shared/ShmupWorld.cs | 46 ++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/Shared/ShmupWorld.cs b/Shared/ShmupWorld.cs index 61d719c..8045f94 100644 --- a/Shared/ShmupWorld.cs +++ b/Shared/ShmupWorld.cs @@ -10,8 +10,32 @@ namespace SemiColinGames { // Center of player sprite. public Vector2 Position = new Vector2(48, 1080 / 8); public Vector2 HalfSize = new Vector2(16, 10); - public float Speed = 150f; - public float ShotCooldown = 0f; + + private float speed = 150f; + private float shotCooldown = 0f; + private ProfilingList shots = new ProfilingList(10, "playerShots"); + + public ProfilingList Update( + float modelTime, History input, Rectangle worldBounds) { + // Movement update. + Vector2 motion = Vector2.Multiply(input[0].Motion, modelTime * speed); + Position = Vector2.Add(Position, motion); + Position.X = Math.Max(Position.X, HalfSize.X); + Position.X = Math.Min(Position.X, worldBounds.Size.X - HalfSize.X); + Position.Y = Math.Max(Position.Y, HalfSize.Y); + Position.Y = Math.Min(Position.Y, worldBounds.Size.Y - HalfSize.Y); + + // Check whether we need to add new shots. + shotCooldown -= modelTime; + shots.Clear(); + if (input[0].Attack && shotCooldown <= 0) { + shotCooldown = 0.2f; + Vector2 shotOffset = new Vector2(12, 2); + Vector2 shotPosition = Vector2.Add(Position, shotOffset); + shots.Add(new Shot(shotPosition, new Vector2(300, 0))); + } + return shots; + } } public class Shot { @@ -65,26 +89,14 @@ namespace SemiColinGames { } public void Update(float modelTime, History input) { - Vector2 motion = Vector2.Multiply(input[0].Motion, modelTime * Player.Speed); - Player.Position = Vector2.Add(Player.Position, motion); - Player.Position.X = Math.Max(Player.Position.X, Player.HalfSize.X); - Player.Position.X = Math.Min(Player.Position.X, Bounds.Size.X - Player.HalfSize.X); - Player.Position.Y = Math.Max(Player.Position.Y, Player.HalfSize.Y); - Player.Position.Y = Math.Min(Player.Position.Y, Bounds.Size.Y - Player.HalfSize.Y); - Player.ShotCooldown -= modelTime; + ProfilingList newPlayerShots = Player.Update(modelTime, input, Bounds); foreach (Shot shot in Shots) { shot.Update(modelTime); } - // TODO: move this all into Player.Update(). - if (input[0].Attack && Player.ShotCooldown <= 0) { - Player.ShotCooldown = 0.2f; - Vector2 shotOffset = new Vector2(12, 2); - Vector2 shotPosition = Vector2.Add(Player.Position, shotOffset); - Shots.Add(new Shot(shotPosition, new Vector2(300, 0))); - } - + Shots.AddRange(newPlayerShots); + // TODO: inflate bounds rectangle Shots.RemoveAll(shot => !Bounds.Intersects(shot.Bounds)); Debug.AddToast("shots: " + Shots.Count);