Fire weapons

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-13 20:36:40 +01:00
parent fb2b297900
commit 029e90ea9d
6 changed files with 143 additions and 1 deletions

View File

@@ -0,0 +1,51 @@
enum WeaponState { idle, firing }
abstract class Weapon {
final String name;
final int idleSprite;
final List<int> fireFrames;
final int damage;
final int msPerFrame;
WeaponState state = WeaponState.idle;
int frameIndex = 0;
int lastFrameTime = 0;
Weapon({
required this.name,
required this.idleSprite,
required this.fireFrames,
required this.damage,
this.msPerFrame = 100, // Speed of animation
});
int get currentSprite =>
state == WeaponState.idle ? idleSprite : fireFrames[frameIndex];
bool get isFiring => state == WeaponState.firing;
/// The main entry point for the player to use the gun.
/// Returns true if a bullet was actually spent.
bool fire(int currentTime, {required int currentAmmo}) {
if (state == WeaponState.idle && currentAmmo > 0) {
state = WeaponState.firing;
frameIndex = 0;
lastFrameTime = currentTime;
return true;
}
return false;
}
void update(int currentTime) {
if (state == WeaponState.firing) {
if (currentTime - lastFrameTime > msPerFrame) {
frameIndex++;
lastFrameTime = currentTime;
if (frameIndex >= fireFrames.length) {
state = WeaponState.idle;
frameIndex = 0;
}
}
}
}
}