Player Class¶
Doelstelling¶
Het doel was het maken van een player class die overerft van de entity class. De player moet kunnen bewegen en een melee attack kunnen doen.
Toegepaste oplossing¶
Overerving van entity¶
Eerst heb ik een speler class gemaakt die overerft van de entity class, hierdoor hebben we de basis variable kunnen gebruiken die de entity class heeft, zoals health, position en texture.
public class Player : Entity
{
public Player(int maxHealth, Vector2 position, Texture2D texture, int level, int speed)
: base(maxHealth, position, texture, size: new Vector2(75f, 75f))
{
Level = level;
Speed = speed;
}
}
Extra variable en¶
Daarna heb ik extra variable toegevoegd die de player nodig heeft, zoals level, speed en attack time en duration. Ook heb ik een attack bounds rectangle gemaakt die de bounds van de attack aangeeft. deze variable moeten we doorgeven aan de constructor van de entity class.
public int Level { get; set; }
public int Speed { get; set; }
public double lastAttackTime = -1;
private double attackDuration = 1;
public bool IsAttacking { get; set; } = false;
public Rectangle AttackBounds { get; set; }
public Player(int maxHealth, Vector2 position, Texture2D texture, int level, int speed)
: base(maxHealth, position, texture, size: new Vector2(75f, 75f))
{
Level = level;
Speed = speed;
}
Melee functie¶
Wij hebben er voor gekozen om een apparte melee functie te maken om ervoor te zorgen dat melee en ranged attacks onderscheiden kunnen worden, in deze functie wordt de attack bounds rectangle aangemaakt en wordt de attack uitgevoerd, waarna de collsion in een andere class wordt afgehandeld.
public void Melee(GameTime gameTime)
{
var mouseState = Mouse.GetState();
if (gameTime.TotalGameTime.TotalSeconds - lastAttackTime >= attackDuration)
{
var mousePosition = new Vector2(mouseState.X, mouseState.Y);
var direction = mousePosition - Position;
direction.Normalize();
var attackRange = 50;
var attackPosition = Position + direction * attackRange;
AttackBounds = new Rectangle((int)attackPosition.X , (int)attackPosition.Y, 100, 100);
IsAttacking = true;
lastAttackTime = gameTime.TotalGameTime.TotalSeconds;
}
}
movement functie¶
Om de player te kunnen bewegen hebben we een movement functie gemaakt die de velocity van de player aanpast aan de hand van de input van de speler. Wij hebben ervoor gekozen om WASD en de pijltjes toetsen te gebruiken als input om de speler te laten bewegen. door de variable state te gebruiken kunnen we de input van de speler uitlezen en de velocity van de player aanpassen. de velocity wordt aangepast aan de hand van de speed van de player en de input van de speler of te wel de direction. aan het einde normalizeren wij de direction zodat de player altijd even snel beweegt, ongeacht de richting. mocht de speler geen input geven dan wordt de velocity op 0 gezet. dit zorgt ervoor dat de player stopt met bewegen als de speler geen input geeft en niet alsof de speler over het scherm blijft glijden.
public void Move(GameTime gameTime)
{
var state = Keyboard.GetState();
var direction = Vector2.Zero;
if (state.IsKeyDown(Keys.W) || state.IsKeyDown(Keys.Up))
{
direction.Y -= 1;
}
if (state.IsKeyDown(Keys.S) || state.IsKeyDown(Keys.Down))
{
direction.Y += 1;
}
if (state.IsKeyDown(Keys.A) || state.IsKeyDown(Keys.Left))
{
direction.X -= 1;
}
if (state.IsKeyDown(Keys.D) || state.IsKeyDown(Keys.Right))
{
direction.X += 1;
}
if (direction != Vector2.Zero)
{
direction.Normalize();
Velocity = Speed * direction;
}
else
{
Velocity = Vector2.Zero;
}
}
Velocity normalizer
Wij gebruiken Normalize() om de velocity te normaliseren, dit zorgt ervoor dat de player altijd even snel beweegt, ongeacht de richting. dit komt omdat de velocity altijd 1 is, ongeacht de richting. als de player bijvoorbeeld naar rechts beweegt is de velocity (1, 0) en als de player naar rechtsboven beweegt is de velocity (1, -1). dit zorgt ervoor dat de player altijd even snel beweegt, ongeacht de richting.
update en draw functie¶
In de draw functie hebben we de betterdraw functie gebruikt om de player te tekenen, in de update functie hebben we de movement en melee functie aangeroepen en de attack duration geupdate. dit zorgt ervoor dat en de player kan bewegen en dat de melee attack iets doet. De attack duration zorgt ervoor dat de player niet oneindig aan het aanvallen is.
public override void Draw(GameTime gameTime,SpriteBatch spriteBatch)
{
spriteBatch.BetterDraw(Texture, Position, Size);
}
public override void Update(GameTime gameTime)
{
base.Update(gameTime);
Move(gameTime);
var mouseState = Mouse.GetState();
if (mouseState.LeftButton == ButtonState.Pressed)
{
Melee(gameTime);
}
if (gameTime.TotalGameTime.TotalSeconds - lastAttackTime >= 0.0001)
{
IsAttacking = false;
}
}
Toekomstige aanpassingen¶
Voor de melee attack worden nu nog variable gebruikt die in de weapon class komen te staan, dit komt doordat deze class nog niet nodig was voor het eerste prototype, maar in de toekomst zullen deze variable verplaatst worden naar de weapon class. ook zullen er in de toekomst nog meer functies worden toegevoegd die de player nodig heeft, zoals een ranged attack en een dash functie.
Klassendiagram¶
Bronnen¶
-
C# documentation. (z.d.) learn.microsoft.com.
Laatst geraadpleegd op 20 april 2024, van https://learn.microsoft.com/en-uk/dotnet/csharp/ -
Monogame documentation. (z.d.) monogame.net.
Laatst geraadpleegd op 20 april 2024, van https://monogame.net/articles
Gecreëerd: June 4, 2024