Ga naar inhoud

Spritesheets

Gazelle Sheet Gazelle Gif Player Sheet

Doelstelling

De speler en enemies moeten een animatie hebben voor het lopen.

Toegepaste oplossing

Ik geef hiermee aan hoeveel plaatjes er in de hoogte en breedte zijn.

sheetLayout = new Point(4, 2);

Dit heb ik nodig om allemaal berekeningen te maken over welke van de frames nu afgespeeld moet worden. Hoe bloederig het character moet zijn, wordt hier ook al in berekent. Dit wordt gedaan gebaseerd op percentages vergeleken met max heath. Als je geen maxHealth meegeeft betekent dit dat je health niet mee wilt berekenen.

if (maxHealth != 0)
{
    var healthRatio = (float)health / maxHealth;
    offset += (int)(MathF.Floor((1.0f - healthRatio) * sheetLayout.Y) * sheetLayout.X);
}

Bij de speler zorg ik ervoor dat als de speler stil staat dat de animatie vast staat op frame 1.

var aSpeed = 120;
if (MathExtras.RoughlyEquals(Velocity.LengthSquared(), 0))
{
    aSpeed = 0;
}

DrawSpriteSheet(spriteBatch, gameTime, Texture, Position, Size, Velocity, new Point(4, 2), Health, MaxHealth, animationSpeed: aSpeed);

Als je dan net zoals bij de speler de animationSpeed meegeeft betekent dit dat de animatie stil staat.

if (animationSpeed != 0)
{
    var animationDuration = TimeSpan.FromMilliseconds(animationSpeed);
    timedAnimationFrame = (int)(gameTime.TotalGameTime / animationDuration) % sheetLayout.X;
}

Ik teken met betterDrawSheet de frames. Elke keer dat er een bepaalde tijd voorbij gaat zorgt het ervoor dat je naar de volgende frame van de animatie gaat. Ook mirror ik de sprite als de velocity positief is. Dit zorgt ervoor dat de animatie de kant op gaat waar je naar kijkt.

spriteBatch.BetterDrawSheet(
    Texture,
    sheetLayout,
    (int)animationframe,
    Position,
    Size,
    effects: Velocity.X > 0 ? SpriteEffects.FlipHorizontally : SpriteEffects.None
);

Bronnen


Laatst geüpdatet: May 31, 2024
Gecreëerd: May 30, 2024