import 'package:flutter/services.dart'; class InputManager { Set _previousKeys = {}; bool isMovingForward = false; bool isMovingBackward = false; bool isTurningLeft = false; bool isTurningRight = false; // Discrete (triggers once per press) bool isInteracting = false; // Continuous bool isFiring = false; int? requestedWeaponIndex; void update() { final pressedKeys = HardwareKeyboard.instance.logicalKeysPressed; // Calculate all keys that were pressed exactly on this frame final newlyPressedKeys = pressedKeys.difference(_previousKeys); // * Movement isMovingForward = pressedKeys.contains(LogicalKeyboardKey.keyW); isMovingBackward = pressedKeys.contains(LogicalKeyboardKey.keyS); isTurningLeft = pressedKeys.contains(LogicalKeyboardKey.keyA); isTurningRight = pressedKeys.contains(LogicalKeyboardKey.keyD); // * Interaction (Space) // Much simpler now using the newlyPressedKeys set isInteracting = newlyPressedKeys.contains(LogicalKeyboardKey.space); // * Firing (Left Control) // - Keeping this continuous for machine guns isFiring = pressedKeys.contains(LogicalKeyboardKey.controlLeft) && !pressedKeys.contains(LogicalKeyboardKey.space); // * Manual Weapon Switching requestedWeaponIndex = null; // Iterate through newly pressed keys and switch on them for (final LogicalKeyboardKey key in newlyPressedKeys) { switch (key) { case LogicalKeyboardKey.digit1: requestedWeaponIndex = 0; // Knife case LogicalKeyboardKey.digit2: requestedWeaponIndex = 1; // Pistol case LogicalKeyboardKey.digit3: requestedWeaponIndex = 2; // Machine Gun } } // * Save state for next tick _previousKeys = Set.from(pressedKeys); } }