Quick answer: _pressed is edge-triggered (first frame only) by design. For auto-repeat, use mouse_check_button with a cooldown timer.
A spell-casting RPG wants holding the mouse to fire repeatedly. mouse_check_button_pressed only fires on the initial click. Holding does nothing further. Expected behavior, but you want auto-repeat.
Trio of Functions
mouse_check_button: true every frame while held. Level trigger.mouse_check_button_pressed: true only on the press frame. Edge trigger.mouse_check_button_released: true only on the release frame. Edge trigger.
Pick by intent: pressed for single actions (clicking a button); held for charging or continuous fire.
Auto-Repeat Pattern
// Create event
fire_cooldown = 0;
initial_delay = 15; // frames before repeat starts
repeat_rate = 5; // frames between auto-shots
// Step event
if (mouse_check_button(mb_left)) {
if (mouse_check_button_pressed(mb_left)) {
fire();
fire_cooldown = initial_delay;
} else if (fire_cooldown <= 0) {
fire();
fire_cooldown = repeat_rate;
} else {
fire_cooldown -= 1;
}
} else {
fire_cooldown = 0;
}
Initial click fires; then waits initial_delay frames before auto-repeating at repeat_rate cadence. Standard text-editor key-repeat feel.
Continuous Fire (No Initial Delay)
if (mouse_check_button(mb_left) and fire_cooldown <= 0) {
fire();
fire_cooldown = 3; // 20fps autofire at 60fps
}
fire_cooldown -= 1;
Simpler shmup-style: fires at fixed rate while held. No initial delay.
Verifying
Click and release: one shot. Hold: shots after delay at expected cadence. Release: resets. Cooldown should not persist across releases.
“Pressed for edges, button for level, timer for repeats. Three pieces, every input idiom.”
For shooter feel, gate auto-repeat behind a screenshake / muzzle flash — even a constant cadence reads as ‘feedback’ when each shot has weight.