diff options
Diffstat (limited to 'TankBattleCore/Objects')
| -rw-r--r-- | TankBattleCore/Objects/Bullet.cs | 47 | ||||
| -rw-r--r-- | TankBattleCore/Objects/Game.cs | 106 | ||||
| -rw-r--r-- | TankBattleCore/Objects/Scene.cs | 9 | ||||
| -rw-r--r-- | TankBattleCore/Objects/Tank.cs | 79 |
4 files changed, 241 insertions, 0 deletions
diff --git a/TankBattleCore/Objects/Bullet.cs b/TankBattleCore/Objects/Bullet.cs new file mode 100644 index 0000000..0775d22 --- /dev/null +++ b/TankBattleCore/Objects/Bullet.cs @@ -0,0 +1,47 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace TankBattleCore.Objects; + +struct BulletData +{ + public Vector2 Position; + public float Angle; + public float Speed; +} + +class Bullet +{ + public const float SlowSpeed = 250f; + public const float FastSpeed = 400f; + + private Vector2 _position; + private Texture2D _bulletTexture; + float _speed; + float _angle; + + public Vector2 Position { get => _position; } + + public Bullet(Vector2 position, Texture2D bulletTexture, float speed, float angle) + { + _position = position; + _bulletTexture = bulletTexture; + _speed = speed; + _angle = angle; + } + + public void Update(float dt) + { + _position += new Vector2(MathF.Cos(_angle), MathF.Sin(_angle)) * _speed * dt; + } + + public void Draw(SpriteBatch spriteBatch) + { + spriteBatch.Draw( + _bulletTexture, + _position, + Color.White + ); + } +}
\ No newline at end of file diff --git a/TankBattleCore/Objects/Game.cs b/TankBattleCore/Objects/Game.cs new file mode 100644 index 0000000..75f25e5 --- /dev/null +++ b/TankBattleCore/Objects/Game.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using TankBattleCore; +using TankBattleCore.Objects; + +internal class GameScene : IScene +{ + private const int PlayAreaOffset = 100; + private static readonly Rectangle PlayArea = new Rectangle( + -PlayAreaOffset, + -PlayAreaOffset, + Game1.Instance.WindowWidth + PlayAreaOffset, + Game1.Instance.WindowHeight + PlayAreaOffset + ); + + private List<Tank> tanks = []; + private List<Bullet> bullets = []; + private bool paused = false; + + public GameScene() + { + Clear(); + + AddTank( + new Tank( + Vector2.Zero, + Game1.Instance.TankBodyTextures[TankColor.Black] + ) + ); + } + + internal void Clear() + { + tanks.Clear(); + } + + public void Update(float dt) + { + if (paused) + { + return; + } + + var keyboardState = Keyboard.GetState(); + + foreach (Tank t in tanks) + { + t.Update(dt); + + if (keyboardState.IsKeyDown(Keys.Enter)) + { + ShootBullet(t.GetNextShot()); + } + } + + foreach (Bullet b in bullets) + { + b.Update(dt); + } + + bullets.RemoveAll(b => !PlayArea.Contains(b.Position)); + } + + public void Draw(SpriteBatch spriteBatch) + { + spriteBatch.Begin(); + + foreach (Tank t in tanks) + { + t.Draw(spriteBatch); + } + + foreach (Bullet b in bullets) + { + b.Draw(spriteBatch); + } + + spriteBatch.End(); + } + + private void AddTank(Tank tank) + { + tanks.Add(tank); + } + + private void AddBullet(Bullet bullet) + { + bullets.Add(bullet); + } + + public void ShootBullet(BulletData bulletData) + { + AddBullet( + new Bullet( + bulletData.Position, + Game1.Instance.TankBodyTextures[TankColor.Black], + bulletData.Speed, + bulletData.Angle + ) + ); + } +}
\ No newline at end of file diff --git a/TankBattleCore/Objects/Scene.cs b/TankBattleCore/Objects/Scene.cs new file mode 100644 index 0000000..9fa5619 --- /dev/null +++ b/TankBattleCore/Objects/Scene.cs @@ -0,0 +1,9 @@ +using Microsoft.Xna.Framework.Graphics; + +namespace TankBattleCore.Objects; + +internal interface IScene +{ + internal void Update(float dt); + internal void Draw(SpriteBatch spriteBatch); +}
\ No newline at end of file diff --git a/TankBattleCore/Objects/Tank.cs b/TankBattleCore/Objects/Tank.cs new file mode 100644 index 0000000..927d053 --- /dev/null +++ b/TankBattleCore/Objects/Tank.cs @@ -0,0 +1,79 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; + +namespace TankBattleCore.Objects; + +internal class Tank +{ + private const float Speed = 200; + private const float TurnSpeed = 2; //In Rad/Sec + private const float Scale = 0.6f; + private const int PoweredUpShotInterval = 4; + + private Vector2 _position; + private float _angle = 0; + private Texture2D _bodyTexture; + private int _numShots = 0; + private float ShotSpeed + { + get + { + if (_numShots % PoweredUpShotInterval == PoweredUpShotInterval - 1) + { + return Bullet.FastSpeed; + } else + { + return Bullet.SlowSpeed; + } + } + } + + public Tank(Vector2 postion, Texture2D bodyTexture) + { + _position = postion; + _bodyTexture = bodyTexture; + } + + public void Update(float dt) + { + _position += new Vector2(MathF.Cos(_angle), MathF.Sin(_angle)) * Speed * dt; + + var keyboardState = Keyboard.GetState(); + if (keyboardState.IsKeyDown(Keys.A)) + { + _angle -= TurnSpeed * dt; + } else if (keyboardState.IsKeyDown(Keys.D)) { + _angle += TurnSpeed * dt; + } + } + + public void Draw(SpriteBatch _spriteBatch) + { + _spriteBatch.Draw( + _bodyTexture, + _position, + null, + Color.White, + _angle - MathF.PI / 2, //Texture is rotated 90 degrees downwards + 0.5f * new Vector2(_bodyTexture.Width, _bodyTexture.Height), + Scale, + SpriteEffects.None, + 1.0f + ); + } + + public BulletData GetNextShot() + { + var shotSpeed = ShotSpeed; + _numShots++; + + return new BulletData + { + Position = _position, + Angle = _angle, + Speed = shotSpeed + }; + } +}
\ No newline at end of file |
