summaryrefslogtreecommitdiff
path: root/TankBattleCore/Objects
diff options
context:
space:
mode:
authorBoredGuy <osome3717@gmail.com>2026-03-27 16:29:32 -0700
committerBoredGuy <osome3717@gmail.com>2026-03-27 16:29:32 -0700
commit25fdc90968a14ffd44dae65d6fdb3d50e6df9082 (patch)
tree3e11812a480ff173a7c65fd9d53e0efc69f5be27 /TankBattleCore/Objects
Initial Commit
Diffstat (limited to 'TankBattleCore/Objects')
-rw-r--r--TankBattleCore/Objects/Bullet.cs47
-rw-r--r--TankBattleCore/Objects/Game.cs106
-rw-r--r--TankBattleCore/Objects/Scene.cs9
-rw-r--r--TankBattleCore/Objects/Tank.cs79
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