From 3c08579ed91acde567ac3c0b3b6f13b5101ba3f3 Mon Sep 17 00:00:00 2001 From: Colin McMillen Date: Thu, 19 Nov 2020 17:26:50 -0500 Subject: [PATCH] add some shots (pew pew pew) --- Shared/ShmupScene.cs | 13 +++++++++++-- Shared/ShmupWorld.cs | 32 +++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Shared/ShmupScene.cs b/Shared/ShmupScene.cs index 30735b8..927bdcb 100644 --- a/Shared/ShmupScene.cs +++ b/Shared/ShmupScene.cs @@ -8,7 +8,7 @@ namespace SemiColinGames { const float DESIRED_ASPECT_RATIO = 1920.0f / 1080.0f; - private readonly Color backgroundColor = Color.Black; + private readonly Color backgroundColor = Color.DarkBlue; private readonly GraphicsDevice graphics; private readonly RenderTarget2D sceneTarget; @@ -36,7 +36,7 @@ namespace SemiColinGames { public void Draw(bool isRunningSlowly, IWorld iworld, bool paused) { ShmupWorld world = (ShmupWorld) iworld; graphics.SetRenderTarget(null); - graphics.Clear(backgroundColor); + graphics.Clear(Color.Black); // Draw scene to sceneTarget. graphics.SetRenderTarget(sceneTarget); @@ -51,6 +51,15 @@ namespace SemiColinGames { Vector2 spriteCenter = new Vector2(playerTexture.Width / 2, playerTexture.Height / 2); Vector2 drawPos = Vector2.Floor(Vector2.Subtract(world.Player.Position, spriteCenter)); spriteBatch.Draw(playerTexture, drawPos, Color.White); + + // Draw shots. + foreach (ShmupWorld.Shot s in world.Shots) { + Texture2D texture = s.Texture.Get; + Vector2 center = new Vector2(texture.Width / 2, texture.Height / 2); + spriteBatch.Draw(texture, Vector2.Floor(Vector2.Subtract(s.Position, center)), Color.White); + } + + // Finish drawing sprites. spriteBatch.End(); // Get ready to draw sceneTarget to screen. diff --git a/Shared/ShmupWorld.cs b/Shared/ShmupWorld.cs index 106b99c..ab54732 100644 --- a/Shared/ShmupWorld.cs +++ b/Shared/ShmupWorld.cs @@ -8,16 +8,34 @@ namespace SemiColinGames { public class ShmupPlayer { public TextureRef Texture = Textures.Yellow2; // Center of player sprite. - public Vector2 Position = new Vector2(32, 1080 / 8); + public Vector2 Position = new Vector2(48, 1080 / 8); public Vector2 HalfSize = new Vector2(16, 10); + public float Speed = 150f; + } + + public class Shot { + public TextureRef Texture = Textures.Projectile1; + public Vector2 Position; + public Vector2 HalfSize = new Vector2(11, 8); + public Vector2 Velocity; + public Shot(Vector2 position, Vector2 velocity) { + Position = position; + Velocity = velocity; + } } public readonly Point Size; public readonly ShmupPlayer Player; + public readonly ProfilingList Shots; public ShmupWorld() { Size = new Point(1920 / 4, 1080 / 4); Player = new ShmupPlayer(); + Shots = new ProfilingList(100, "shots"); + Vector2 velocity = new Vector2(100, 0); + Shots.Add(new Shot(new Vector2(96, 1080 / 8), velocity)); + Shots.Add(new Shot(new Vector2(96 * 2, 1080 / 8), velocity)); + Shots.Add(new Shot(new Vector2(96 * 4, 1080 / 8), velocity)); } ~ShmupWorld() { @@ -29,14 +47,22 @@ namespace SemiColinGames { } public void Update(float modelTime, History input) { - float speed = 150f; - Vector2 motion = Vector2.Multiply(input[0].Motion, modelTime * speed); + 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, Size.X - Player.HalfSize.X); Player.Position.Y = Math.Max(Player.Position.Y, Player.HalfSize.Y); Player.Position.Y = Math.Min(Player.Position.Y, Size.Y - Player.HalfSize.Y); + foreach (Shot shot in Shots) { + shot.Position = Vector2.Add(shot.Position, Vector2.Multiply(shot.Velocity, modelTime)); + shot.Position.X = Math.Max(shot.Position.X, shot.HalfSize.X); + shot.Position.X = Math.Min(shot.Position.X, Size.X - shot.HalfSize.X); + shot.Position.X = Math.Max(shot.Position.X, shot.HalfSize.X); + shot.Position.X = Math.Min(shot.Position.X, Size.X - shot.HalfSize.X); + } + + // Shots.RemoveAll(shot => shot.Position.X > Size.X); } } }