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 }; } }