Ga naar inhoud

Boss

Doelstelling

Ik moest een boss enemy maken om de speler een lastigere uitdaging te geven.

Toegepaste oplossing

Mijn oplossing om op basis van de enemy een BossEnemy te maken. Ik heb er een dash aan toegevoegd, en ik hem hem groter en sterker gemaakt. In update checken we alle condities voor de dash en dashaway, en voor de rest werkt het bijna hetzelfde als bij de dash van player. De dash gebeurt als er geen cooldown is en de speler ver weg genoeg is, en hij dashed ook weg wanneer de speler aanvalt en de hij in range is.

public class BossEnemy : Enemy, IDashable
{
    public TimeSpan LastDashTime { get; set; } = TimeSpan.FromSeconds(-1);
    private TimeSpan DashCooldown = TimeSpan.FromSeconds(5);
    public TimeSpan DashDuration { get; set; } = TimeSpan.FromSeconds(0.5);
    public int DashSpeed { get; set; } = 4;
    public bool IsDashing { get; set; } = false;
    private float dashTriggerDistance = 2000;
    private TimeSpan lastDashAwayTime = TimeSpan.FromSeconds(-1);
    private TimeSpan delayBeforeDashTime = TimeSpan.FromSeconds(1);
    private TimeSpan delayBeforeDashDuration = TimeSpan.FromSeconds(1);

    public BossEnemy(Vector2 position = default, int layer = 0, string id = "")
        : base(position, layer, id)
    {
        MaxHealth = 7500;
        Size = new Vector2(110);
        Speed = 80;
        Texture = App.AssetManager.GetSprite("Images/Entity/Lion");
    }

    public override void Update(GameTime gameTime)
    {
        var player = gameState.Player;

        if (!IsDashing)
        {
            if (gameTime.TotalGameTime - LastDashTime >= DashCooldown)
            {
                if (player != null && Vector2.Distance(Position, player.Position) < dashTriggerDistance)
                {
                    Dash(gameTime, Vector2.Normalize(player.Position - Position));
                    LastDashTime = gameTime.TotalGameTime;
                    return;
                }
            }

            if (gameTime.TotalGameTime - lastDashAwayTime >= DashCooldown)
            {
                if (player != null && player.IsAttacking && Vector2.Distance(Position, player.Position) <= 200)
                {
                    Dash(gameTime, Vector2.Normalize(Position - player.Position));
                    lastDashAwayTime = gameTime.TotalGameTime;
                    return;
                }
            }

            base.Update(gameTime);
        }
        else
        {
            Position += Velocity * (float)gameTime.ElapsedGameTime.TotalSeconds;

            if (gameTime.TotalGameTime - LastDashTime >= DashDuration)
            {
                IsDashing = false;
                Velocity = Vector2.Zero;
            }
        }
    }

    public void Dash(GameTime gameTime, Vector2 direction)
    {
        var player = gameState.Player;

        if (gameTime.TotalGameTime - delayBeforeDashTime < delayBeforeDashDuration)
        {
            Speed = 0;
            return;
        }

        LastDashTime = gameTime.TotalGameTime;
        IsDashing = true;
        delayBeforeDashTime = TimeSpan.FromSeconds(1);
        Velocity = direction * (Speed * DashSpeed);
    }
}

Hierna heb ik nog in waves wat code toegevoegd die ervoor zorgt dat er ook een boss wordt gespawned, en dat dat in de goede wave, en maar 1 keer gebeurt.

public class WaveController : GameObjectList
{
    protected readonly GameState gameState;

    ...
    private const int bossWaveNumber = 9;
    ...
    private bool bossEnemySpawned = false;
    ...
    public void AdvanceToNextWave()
    {
        ...
        if (currentWave == bossWaveNumber && !bossEnemySpawned)
        {
            SpawnEnemy(new BossEnemy());
                bossEnemySpawned = true;
                continue;
        }
        ...
    }
}

Bronnen


Laatst geüpdatet: June 3, 2024
Gecreëerd: May 14, 2024