Added configurable weapons.
This commit is contained in:
@@ -11,7 +11,7 @@ public record DrawHudContext : DrawContext
|
|||||||
public int Shield;
|
public int Shield;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class Hud
|
public class Hud
|
||||||
{
|
{
|
||||||
private Texture2D _pixel;
|
private Texture2D _pixel;
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
using AlienAttack.MonoGame.Things.Items;
|
using AlienAttack.MonoGame.Things.Items;
|
||||||
|
using AlienAttack.MonoGame.Things.Muzzles;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class Bullet(float x, float y, float xVel, float yVel, Sprite owner) : Sprite(x, y)
|
public class Bullet(float x, float y, float xVel, float yVel, Sprite owner) : Sprite(x, y)
|
||||||
{
|
{
|
||||||
protected float XVelocity = xVel;
|
protected float XVelocity = xVel;
|
||||||
protected float YVelocity = yVel;
|
protected float YVelocity = yVel;
|
||||||
@@ -32,7 +35,9 @@ internal class Bullet(float x, float y, float xVel, float yVel, Sprite owner) :
|
|||||||
|
|
||||||
public override void OnCollision(SpriteCollisionContext context)
|
public override void OnCollision(SpriteCollisionContext context)
|
||||||
{
|
{
|
||||||
if (context.Sprite is Bullet || context.Sprite == Owner || context.Sprite is Item)
|
Sprite sprite = context.Sprite;
|
||||||
|
|
||||||
|
if (sprite is Bullet || sprite == Owner || sprite is Item || sprite is Explosion)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IsDead = true;
|
IsDead = true;
|
||||||
|
|||||||
11
AlientAttack.MonoGame/Things/Bullets/BulletDef.cs
Normal file
11
AlientAttack.MonoGame/Things/Bullets/BulletDef.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
|
public sealed class BulletDef
|
||||||
|
{
|
||||||
|
public required BulletKind Kind { get; init; }
|
||||||
|
public required int Width { get; init; }
|
||||||
|
public required int Height { get; init; }
|
||||||
|
public required Func<float, float, float, float, Sprite, Bullet> Create { get; init; }
|
||||||
|
}
|
||||||
100
AlientAttack.MonoGame/Things/Bullets/BulletDefinitions.cs
Normal file
100
AlientAttack.MonoGame/Things/Bullets/BulletDefinitions.cs
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
|
public static class BulletDefinitions
|
||||||
|
{
|
||||||
|
public static readonly BulletDef LaserSmall = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.LaserSmall,
|
||||||
|
Width = LaserBulletSmall.Width,
|
||||||
|
Height = LaserBulletSmall.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new LaserBulletSmall(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef LaserMedium = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.LaserMedium,
|
||||||
|
Width = LaserBulletMedium.Width,
|
||||||
|
Height = LaserBulletMedium.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new LaserBulletMedium(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef LaserLarge = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.LaserLarge,
|
||||||
|
Width = LaserBulletLarge.Width,
|
||||||
|
Height = LaserBulletLarge.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new LaserBulletLarge(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef MinigunSmall = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.MinigunSmall,
|
||||||
|
Width = MinigunBulletSmall.Width,
|
||||||
|
Height = MinigunBulletSmall.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new MinigunBulletSmall(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef MinigunMedium = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.MinigunMedium,
|
||||||
|
Width = MinigunBulletMedium.Width,
|
||||||
|
Height = MinigunBulletMedium.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new MinigunBulletMedium(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef MinigunLarge = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.MinigunLarge,
|
||||||
|
Width = MinigunBulletLarge.Width,
|
||||||
|
Height = MinigunBulletLarge.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new MinigunBulletLarge(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef PlasmaSmall = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.PlasmaSmall,
|
||||||
|
Width = PlasmaBulletSmall.Width,
|
||||||
|
Height = PlasmaBulletSmall.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new PlasmaBulletSmall(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef PlasmaMedium = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.PlasmaMedium,
|
||||||
|
Width = PlasmaBulletMedium.Width,
|
||||||
|
Height = PlasmaBulletMedium.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new PlasmaBulletMedium(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef PlasmaLarge = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.PlasmaLarge,
|
||||||
|
Width = PlasmaBulletLarge.Width,
|
||||||
|
Height = PlasmaBulletLarge.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new PlasmaBulletLarge(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef ProtonSmall = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.ProtonSmall,
|
||||||
|
Width = ProtonBulletSmall.Width,
|
||||||
|
Height = ProtonBulletSmall.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new ProtonBulletSmall(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef ProtonMedium = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.ProtonMedium,
|
||||||
|
Width = ProtonBulletMedium.Width,
|
||||||
|
Height = ProtonBulletMedium.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new ProtonBulletMedium(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly BulletDef ProtonLarge = new()
|
||||||
|
{
|
||||||
|
Kind = BulletKind.ProtonLarge,
|
||||||
|
Width = ProtonBulletLarge.Width,
|
||||||
|
Height = ProtonBulletLarge.Height,
|
||||||
|
Create = (x, y, vx, vy, o) => new ProtonBulletLarge(x, y, vx, vy, o),
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class LaserBulletLarge : Bullet
|
public class LaserBulletLarge : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 8;
|
public const int Width = 8;
|
||||||
public const int Height = 28;
|
public const int Height = 28;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class LaserBulletMedium : Bullet
|
public class LaserBulletMedium : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 7;
|
public const int Width = 7;
|
||||||
public const int Height = 21;
|
public const int Height = 21;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class LaserBulletSmall : Bullet
|
public class LaserBulletSmall : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 6;
|
public const int Width = 6;
|
||||||
public const int Height = 18;
|
public const int Height = 18;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class MinigunBulletLarge : Bullet
|
public class MinigunBulletLarge : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 9;
|
public const int Width = 9;
|
||||||
public const int Height = 27;
|
public const int Height = 27;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class MinigunBulletMedium : Bullet
|
public class MinigunBulletMedium : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 11;
|
public const int Width = 11;
|
||||||
public const int Height = 21;
|
public const int Height = 21;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class MinigunBulletSmall : Bullet
|
public class MinigunBulletSmall : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 11;
|
public const int Width = 11;
|
||||||
public const int Height = 21;
|
public const int Height = 21;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class PlasmaBulletLarge : Bullet
|
public class PlasmaBulletLarge : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 9;
|
public const int Width = 9;
|
||||||
public const int Height = 31;
|
public const int Height = 31;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class PlasmaBulletMedium : Bullet
|
public class PlasmaBulletMedium : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 8;
|
public const int Width = 8;
|
||||||
public const int Height = 26;
|
public const int Height = 26;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class PlasmaBulletSmall : Bullet
|
public class PlasmaBulletSmall : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 7;
|
public const int Width = 7;
|
||||||
public const int Height = 24;
|
public const int Height = 24;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class ProtonBulletLarge : Bullet
|
public class ProtonBulletLarge : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 13;
|
public const int Width = 13;
|
||||||
public const int Height = 13;
|
public const int Height = 13;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class ProtonBulletMedium : Bullet
|
public class ProtonBulletMedium : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 10;
|
public const int Width = 10;
|
||||||
public const int Height = 10;
|
public const int Height = 10;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Bullets;
|
namespace AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
internal class ProtonBulletSmall : Bullet
|
public class ProtonBulletSmall : Bullet
|
||||||
{
|
{
|
||||||
public const int Width = 6;
|
public const int Width = 6;
|
||||||
public const int Height = 6;
|
public const int Height = 6;
|
||||||
|
|||||||
@@ -2,16 +2,12 @@
|
|||||||
using AlienAttack.MonoGame.Things.Items;
|
using AlienAttack.MonoGame.Things.Items;
|
||||||
using AlienAttack.MonoGame.Things.Weapons;
|
using AlienAttack.MonoGame.Things.Weapons;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Audio;
|
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using Microsoft.Xna.Framework.Input;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Enemies;
|
namespace AlienAttack.MonoGame.Things.Enemies;
|
||||||
|
|
||||||
internal class GreenEnemy : EnemyShip
|
public class GreenEnemy : EnemyShip
|
||||||
{
|
{
|
||||||
//Enemy01_Green_Frame_1_png_processed
|
//Enemy01_Green_Frame_1_png_processed
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
using AlienAttack.MonoGame.Things.Bullets;
|
using AlienAttack.MonoGame.Things.Bullets;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Audio;
|
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Enemies;
|
namespace AlienAttack.MonoGame.Things.Enemies;
|
||||||
|
|
||||||
internal class RedEnemy : EnemyShip
|
public class RedEnemy : EnemyShip
|
||||||
{
|
{
|
||||||
protected int FireThreshold => 20;
|
protected int FireThreshold => 20;
|
||||||
protected int CurrentFireThreshold { get; set; } = 20;
|
protected int CurrentFireThreshold { get; set; } = 20;
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
using AlienAttack.MonoGame.Things.Bullets;
|
using AlienAttack.MonoGame.Things.Bullets;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Audio;
|
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Enemies;
|
namespace AlienAttack.MonoGame.Things.Enemies;
|
||||||
|
|
||||||
internal class TealEnemy : EnemyShip
|
public class TealEnemy : EnemyShip
|
||||||
{
|
{
|
||||||
protected int FireThreshold => 20;
|
protected int FireThreshold => 20;
|
||||||
protected int CurrentFireThreshold { get; set; } = 20;
|
protected int CurrentFireThreshold { get; set; } = 20;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Microsoft.Xna.Framework.Graphics;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things;
|
namespace AlienAttack.MonoGame.Things;
|
||||||
|
|
||||||
internal class Explosion(int x, int y, float xVel, float yVel) : Sprite(x, y)
|
public class Explosion(int x, int y, float xVel, float yVel) : Sprite(x, y)
|
||||||
{
|
{
|
||||||
protected int CurrentFrame { get; private set; } = 1;
|
protected int CurrentFrame { get; private set; } = 1;
|
||||||
protected int MaxFrames => 9;
|
protected int MaxFrames => 9;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace AlienAttack.MonoGame.Things.Items;
|
namespace AlienAttack.MonoGame.Things.Items;
|
||||||
|
|
||||||
internal class Ammo : Item
|
public class Ammo : Item
|
||||||
{
|
{
|
||||||
protected override PickupKind Kind => PickupKind.Ammo;
|
protected override PickupKind Kind => PickupKind.Ammo;
|
||||||
|
|
||||||
@@ -8,9 +8,4 @@ internal class Ammo : Item
|
|||||||
{
|
{
|
||||||
TextureName = @$"Sprites\Powerup_Ammo";
|
TextureName = @$"Sprites\Powerup_Ammo";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ApplyEffect(Player player)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace AlienAttack.MonoGame.Things.Items;
|
namespace AlienAttack.MonoGame.Things.Items;
|
||||||
|
|
||||||
internal class Energy : Item
|
public class Energy : Item
|
||||||
{
|
{
|
||||||
protected override PickupKind Kind => PickupKind.Plasma;
|
protected override PickupKind Kind => PickupKind.Plasma;
|
||||||
|
|
||||||
@@ -8,9 +8,4 @@ internal class Energy : Item
|
|||||||
{
|
{
|
||||||
TextureName = @$"Sprites\Powerup_Energy";
|
TextureName = @$"Sprites\Powerup_Energy";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ApplyEffect(Player player)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace AlienAttack.MonoGame.Things.Items;
|
namespace AlienAttack.MonoGame.Things.Items;
|
||||||
|
|
||||||
internal class Health : Item
|
public class Health : Item
|
||||||
{
|
{
|
||||||
protected override PickupKind Kind => PickupKind.Health;
|
protected override PickupKind Kind => PickupKind.Health;
|
||||||
|
|
||||||
@@ -8,9 +8,4 @@ internal class Health : Item
|
|||||||
{
|
{
|
||||||
TextureName = @$"Sprites\Powerup_Health";
|
TextureName = @$"Sprites\Powerup_Health";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ApplyEffect(Player player)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Items;
|
namespace AlienAttack.MonoGame.Things.Items;
|
||||||
|
|
||||||
internal abstract class Item : MoveableSprite
|
public abstract class Item : MoveableSprite
|
||||||
{
|
{
|
||||||
private Vector2 _anchor; // the "center" the item orbits around
|
private Vector2 _anchor; // the "center" the item orbits around
|
||||||
private float _t; // radians
|
private float _t; // radians
|
||||||
@@ -59,13 +59,10 @@ internal abstract class Item : MoveableSprite
|
|||||||
|
|
||||||
public override void OnCollision(SpriteCollisionContext context)
|
public override void OnCollision(SpriteCollisionContext context)
|
||||||
{
|
{
|
||||||
if (context.Sprite is Player player)
|
if (context.Sprite is Player)
|
||||||
{
|
{
|
||||||
IsDead = true;
|
IsDead = true;
|
||||||
ApplyEffect(player);
|
|
||||||
context.AudioManager.PlayPickup(Kind);
|
context.AudioManager.PlayPickup(Kind);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void ApplyEffect(Player player);
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace AlienAttack.MonoGame.Things.Items;
|
namespace AlienAttack.MonoGame.Things.Items;
|
||||||
|
|
||||||
internal class Rockets : Item
|
public class Rockets : Item
|
||||||
{
|
{
|
||||||
protected override PickupKind Kind => PickupKind.Rockets;
|
protected override PickupKind Kind => PickupKind.Rockets;
|
||||||
|
|
||||||
@@ -8,9 +8,4 @@ internal class Rockets : Item
|
|||||||
{
|
{
|
||||||
TextureName = @$"Sprites\Powerup_Rockets";
|
TextureName = @$"Sprites\Powerup_Rockets";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ApplyEffect(Player player)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace AlienAttack.MonoGame.Things.Items;
|
namespace AlienAttack.MonoGame.Things.Items;
|
||||||
|
|
||||||
internal class Shields : Item
|
public class Shields : Item
|
||||||
{
|
{
|
||||||
protected override PickupKind Kind => PickupKind.Shield;
|
protected override PickupKind Kind => PickupKind.Shield;
|
||||||
|
|
||||||
@@ -8,9 +8,4 @@ internal class Shields : Item
|
|||||||
{
|
{
|
||||||
TextureName = @$"Sprites\Powerup_Shields";
|
TextureName = @$"Sprites\Powerup_Shields";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ApplyEffect(Player player)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ using Microsoft.Xna.Framework.Graphics;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things;
|
namespace AlienAttack.MonoGame.Things;
|
||||||
|
|
||||||
internal class MiniExplosion(int x, int y, float xVel, float yVel) : Sprite(x, y)
|
public class MiniExplosion(int x, int y, float xVel, float yVel) : Sprite(x, y)
|
||||||
{
|
{
|
||||||
protected int CurrentFrame { get; private set; } = 1;
|
protected int CurrentFrame { get; private set; } = 1;
|
||||||
protected int MaxFrames => 9;
|
protected int MaxFrames => 9;
|
||||||
|
|||||||
@@ -8,10 +8,11 @@ using Microsoft.Xna.Framework.Graphics;
|
|||||||
using Microsoft.Xna.Framework.Input;
|
using Microsoft.Xna.Framework.Input;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things;
|
namespace AlienAttack.MonoGame.Things;
|
||||||
|
|
||||||
internal enum PlayerHorizontalMoveState
|
public enum PlayerHorizontalMoveState
|
||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
Left,
|
Left,
|
||||||
@@ -19,7 +20,7 @@ internal enum PlayerHorizontalMoveState
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
internal enum MoveFlag
|
public enum MoveFlag
|
||||||
{
|
{
|
||||||
None = 0,
|
None = 0,
|
||||||
Left = 1,
|
Left = 1,
|
||||||
@@ -34,7 +35,7 @@ public class DrwaState
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class Player : MoveableSprite
|
public class Player : MoveableSprite
|
||||||
{
|
{
|
||||||
protected PlayerHorizontalMoveState MoveState = PlayerHorizontalMoveState.None;
|
protected PlayerHorizontalMoveState MoveState = PlayerHorizontalMoveState.None;
|
||||||
protected MoveFlag MoveFlags;
|
protected MoveFlag MoveFlags;
|
||||||
@@ -61,10 +62,64 @@ internal class Player : MoveableSprite
|
|||||||
{
|
{
|
||||||
BoundBox = new Rectangle(0, 0, 64, 64);
|
BoundBox = new Rectangle(0, 0, 64, 64);
|
||||||
//ActiveWeapons.Add(new Minigun());
|
//ActiveWeapons.Add(new Minigun());
|
||||||
ActiveWeapons.Add(new MinigunTripleSpreadFast());
|
//ActiveWeapons.Add(new MinigunTripleSpreadFast());
|
||||||
//ActiveWeapons.Add(new MinigunSpread());
|
//ActiveWeapons.Add(new MinigunSpread());
|
||||||
Health = 100;
|
Health = 100;
|
||||||
Shield = 100;
|
Shield = 100;
|
||||||
|
|
||||||
|
// Weapon 1
|
||||||
|
WeaponDef weaponDef = new()
|
||||||
|
{
|
||||||
|
Name = "Weapon 1",
|
||||||
|
Bullet = BulletDefinitions.LaserLarge,
|
||||||
|
Pattern = ShotPatterns.TripleSpread,
|
||||||
|
FireSfxKey = ""
|
||||||
|
};
|
||||||
|
|
||||||
|
WeaponState weasponState = new()
|
||||||
|
{
|
||||||
|
FireThreshold = 15,
|
||||||
|
SpeedMultiplier = 1,
|
||||||
|
DamageBonus = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
ConfigurableWeapon configurableWeapon = new(weaponDef, weasponState);
|
||||||
|
|
||||||
|
// Weapon 2
|
||||||
|
//WeaponDef weaponDef2 = new()
|
||||||
|
//{
|
||||||
|
// Name = "Weapon 2",
|
||||||
|
// Bullet = BulletDefinitions.MinigunSmall,
|
||||||
|
// Pattern = ShotPatterns.Single,
|
||||||
|
// FireSfxKey = ""
|
||||||
|
//};
|
||||||
|
|
||||||
|
//WeaponState weasponState2 = new()
|
||||||
|
//{
|
||||||
|
// FireThreshold = 20,
|
||||||
|
// SpeedMultiplier = 2f,
|
||||||
|
// DamageBonus = 0
|
||||||
|
//};
|
||||||
|
|
||||||
|
//ConfigurableWeapon configurableWeapon2 = new(weaponDef2, weasponState2);
|
||||||
|
|
||||||
|
ActiveWeapons.Add(configurableWeapon);
|
||||||
|
//ActiveWeapons.Add(configurableWeapon2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 GetMuzzleLocal(MuzzleId muzzle)
|
||||||
|
{
|
||||||
|
switch (muzzle)
|
||||||
|
{
|
||||||
|
case MuzzleId.Center:
|
||||||
|
return Muzzles[0].LocalPx;
|
||||||
|
case MuzzleId.Left:
|
||||||
|
return Muzzles[1].LocalPx;
|
||||||
|
case MuzzleId.Right:
|
||||||
|
return Muzzles[2].LocalPx;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Texture2D texture = Game
|
//Texture2D texture = Game
|
||||||
|
|||||||
36
AlientAttack.MonoGame/Things/Weapons/ConfigurableWeapon.cs
Normal file
36
AlientAttack.MonoGame/Things/Weapons/ConfigurableWeapon.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using AlienAttack.MonoGame.Things.Muzzles;
|
||||||
|
|
||||||
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
|
public class ConfigurableWeapon(WeaponDef def, WeaponState state) : Weapon
|
||||||
|
{
|
||||||
|
public override int FireThreshold => state.FireThreshold;
|
||||||
|
|
||||||
|
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
||||||
|
{
|
||||||
|
if (owner is not Player player) return;
|
||||||
|
|
||||||
|
foreach (var shot in def.Pattern.Shots)
|
||||||
|
{
|
||||||
|
// muzzle local -> world
|
||||||
|
var muzzleLocal = player.GetMuzzleLocal(shot.Muzzle); // make a fast lookup
|
||||||
|
var muzzleWorld = MuzzleMath.GetMuzzleWorld(player, muzzleLocal);
|
||||||
|
|
||||||
|
// speed upgrade
|
||||||
|
float vx = shot.Velocity.X * state.SpeedMultiplier;
|
||||||
|
float vy = shot.Velocity.Y * state.SpeedMultiplier;
|
||||||
|
|
||||||
|
// center bullet on muzzle + pattern offset
|
||||||
|
var pos = MuzzleMath.CenterBulletOn(muzzleWorld, def.Bullet.Width, def.Bullet.Height) + shot.Offset;
|
||||||
|
|
||||||
|
var bullet = def.Bullet.Create(pos.X, pos.Y, vx, vy, owner);
|
||||||
|
|
||||||
|
// optional: apply damage bonus generically
|
||||||
|
//bullet.Damage += state.DamageBonus;
|
||||||
|
|
||||||
|
context.SpawnSprite(bullet);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.AudioManager.PlayPlayerFire(); // or use _def.FireSfxKey -> audio routing
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ using System;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Weapons;
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
internal record FireBulletContext
|
public record FireBulletContext
|
||||||
{
|
{
|
||||||
public Sprite Owner { get; init; }
|
public Sprite Owner { get; init; }
|
||||||
public SpriteUpdateContext SpriteUpdateContext { get; init; }
|
public SpriteUpdateContext SpriteUpdateContext { get; init; }
|
||||||
@@ -24,7 +24,7 @@ public record Shot
|
|||||||
public float YVelocity { get; init; }
|
public float YVelocity { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
internal record FireBulletFromMuzzleContext
|
public record FireBulletFromMuzzleContext
|
||||||
{
|
{
|
||||||
public Sprite Owner { get; init; }
|
public Sprite Owner { get; init; }
|
||||||
public SpriteUpdateContext SpriteUpdateContext { get; init; }
|
public SpriteUpdateContext SpriteUpdateContext { get; init; }
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using AlienAttack.MonoGame.Things.Muzzles;
|
|||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Weapons;
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
internal class Minigun : Weapon
|
public class Minigun : Weapon
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 15;
|
public override int FireThreshold => 15;
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ internal class Minigun : Weapon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal abstract class MinigunSingle : Weapon
|
public abstract class MinigunSingle : Weapon
|
||||||
{
|
{
|
||||||
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
||||||
{
|
{
|
||||||
@@ -50,23 +50,23 @@ internal abstract class MinigunSingle : Weapon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunSingleSlow : MinigunSingle
|
public class MinigunSingleSlow : MinigunSingle
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 20;
|
public override int FireThreshold => 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunSingleAverage : MinigunSingle
|
public class MinigunSingleAverage : MinigunSingle
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 15;
|
public override int FireThreshold => 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal class MinigunSingleFast : MinigunSingle
|
public class MinigunSingleFast : MinigunSingle
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 10;
|
public override int FireThreshold => 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal abstract class MinigunDouble : Weapon
|
public abstract class MinigunDouble : Weapon
|
||||||
{
|
{
|
||||||
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
||||||
{
|
{
|
||||||
@@ -91,23 +91,22 @@ internal abstract class MinigunDouble : Weapon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunDoubleSlow : MinigunDouble
|
public class MinigunDoubleSlow : MinigunDouble
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 30;
|
public override int FireThreshold => 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunDoubleAverage : MinigunDouble
|
public class MinigunDoubleAverage : MinigunDouble
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 20;
|
public override int FireThreshold => 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MinigunDoubleFast : MinigunDouble
|
||||||
internal class MinigunDoubleFast : MinigunDouble
|
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 15;
|
public override int FireThreshold => 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal abstract class MinigunTriple : Weapon
|
public abstract class MinigunTriple : Weapon
|
||||||
{
|
{
|
||||||
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
||||||
{
|
{
|
||||||
@@ -133,23 +132,22 @@ internal abstract class MinigunTriple : Weapon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunTripleSlow : MinigunTriple
|
public class MinigunTripleSlow : MinigunTriple
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 30;
|
public override int FireThreshold => 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunTripleAverage : MinigunTriple
|
public class MinigunTripleAverage : MinigunTriple
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 20;
|
public override int FireThreshold => 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MinigunTripleFast : MinigunTriple
|
||||||
internal class MinigunTripleFast : MinigunTriple
|
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 15;
|
public override int FireThreshold => 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal abstract class MinigunTripleSpread : Weapon
|
public abstract class MinigunTripleSpread : Weapon
|
||||||
{
|
{
|
||||||
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
public override void Fire(Sprite owner, SpriteUpdateContext context)
|
||||||
{
|
{
|
||||||
@@ -175,18 +173,18 @@ internal abstract class MinigunTripleSpread : Weapon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunTripleSpreadSlow : MinigunTripleSpread
|
public class MinigunTripleSpreadSlow : MinigunTripleSpread
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 30;
|
public override int FireThreshold => 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class MinigunTripleSpreadAverage : MinigunTripleSpread
|
public class MinigunTripleSpreadAverage : MinigunTripleSpread
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 20;
|
public override int FireThreshold => 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal class MinigunTripleSpreadFast : MinigunTripleSpread
|
public class MinigunTripleSpreadFast : MinigunTripleSpread
|
||||||
{
|
{
|
||||||
public override int FireThreshold => 15;
|
public override int FireThreshold => 15;
|
||||||
}
|
}
|
||||||
6
AlientAttack.MonoGame/Things/Weapons/Shot.cs
Normal file
6
AlientAttack.MonoGame/Things/Weapons/Shot.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
using AlienAttack.MonoGame.Things.Muzzles;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
|
public readonly record struct Shot2(MuzzleId Muzzle, Vector2 Velocity, Vector2 Offset);
|
||||||
6
AlientAttack.MonoGame/Things/Weapons/ShotPattern.cs
Normal file
6
AlientAttack.MonoGame/Things/Weapons/ShotPattern.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
|
public sealed class ShotPattern
|
||||||
|
{
|
||||||
|
public required Shot2[] Shots { get; init; }
|
||||||
|
}
|
||||||
43
AlientAttack.MonoGame/Things/Weapons/ShotPatterns.cs
Normal file
43
AlientAttack.MonoGame/Things/Weapons/ShotPatterns.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using AlienAttack.MonoGame.Things.Muzzles;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
|
public static class ShotPatterns
|
||||||
|
{
|
||||||
|
public static readonly ShotPattern Single = new()
|
||||||
|
{
|
||||||
|
Shots =
|
||||||
|
[
|
||||||
|
new Shot2(MuzzleId.Center, new Vector2(0, -6), new Vector2(4, 0))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly ShotPattern Double = new()
|
||||||
|
{
|
||||||
|
Shots =
|
||||||
|
[
|
||||||
|
new Shot2(MuzzleId.Left, new Vector2(0, -6), new Vector2(4, 0)),
|
||||||
|
new Shot2(MuzzleId.Right, new Vector2(0, -6), new Vector2(4, 0))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly ShotPattern DoubleSpread = new()
|
||||||
|
{
|
||||||
|
Shots =
|
||||||
|
[
|
||||||
|
new Shot2(MuzzleId.Left, new Vector2(-1, -6), new Vector2(4, 0)),
|
||||||
|
new Shot2(MuzzleId.Right, new Vector2(1, -6), new Vector2(4, 0))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
public static readonly ShotPattern TripleSpread = new()
|
||||||
|
{
|
||||||
|
Shots =
|
||||||
|
[
|
||||||
|
new Shot2(MuzzleId.Left, new Vector2(-1, -6), new Vector2(4, 0)),
|
||||||
|
new Shot2(MuzzleId.Center, new Vector2(0, -6), new Vector2(4, 0)),
|
||||||
|
new Shot2(MuzzleId.Right, new Vector2(1, -6), new Vector2(4, 0))
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
using AlienAttack.MonoGame.Things.Bullets;
|
using AlienAttack.MonoGame.Things.Bullets;
|
||||||
using AlienAttack.MonoGame.Things.Muzzles;
|
using AlienAttack.MonoGame.Things.Muzzles;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
using System;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace AlienAttack.MonoGame.Things.Weapons;
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
internal abstract class Weapon : IWeapon
|
public abstract class Weapon : IWeapon
|
||||||
{
|
{
|
||||||
public abstract int FireThreshold { get; }
|
public abstract int FireThreshold { get; }
|
||||||
public int CurrentFireThreshold { get; private set; }
|
public int CurrentFireThreshold { get; private set; }
|
||||||
|
|||||||
11
AlientAttack.MonoGame/Things/Weapons/WeaponDef.cs
Normal file
11
AlientAttack.MonoGame/Things/Weapons/WeaponDef.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using AlienAttack.MonoGame.Things.Bullets;
|
||||||
|
|
||||||
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
|
public sealed class WeaponDef
|
||||||
|
{
|
||||||
|
public required string Name { get; init; }
|
||||||
|
public required ShotPattern Pattern { get; init; }
|
||||||
|
public required BulletDef Bullet { get; init; }
|
||||||
|
public required string FireSfxKey { get; init; } = "player_fire";
|
||||||
|
}
|
||||||
8
AlientAttack.MonoGame/Things/Weapons/WeaponState.cs
Normal file
8
AlientAttack.MonoGame/Things/Weapons/WeaponState.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
namespace AlienAttack.MonoGame.Things.Weapons;
|
||||||
|
|
||||||
|
public sealed class WeaponState
|
||||||
|
{
|
||||||
|
public int FireThreshold { get; set; }
|
||||||
|
public float SpeedMultiplier { get; set; } = 1f;
|
||||||
|
public int DamageBonus { get; set; } = 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user