Quick answer: GameMaker camera shake feeling repetitive even though you use random? Per-frame random calls produce uncorrelated jitter that the eye reads as “buzzy”. Smooth with Perlin or animated curves.

An explosion shake reads as TV-static jitter instead of a believable shake. Each frame is independently random.

Perlin Noise Smoothing

var t = current_time / 1000;
offset_x = perlin_noise(t * 10) * intensity;
offset_y = perlin_noise((t + 1000) * 10) * intensity;

Perlin noise is continuous — adjacent frames have correlated values. Feels like real shake.

Decay Over Time

Multiply intensity by max(0, 1 - elapsed / duration). Shake starts hard, fades out smoothly. More natural than abrupt stop.

Rotational Shake Too

Add small rotation offset for a more cinematic feel. Combined with positional shake, evokes camera-strapped-to-explosion energy.

Trauma-Driven Intensity

Track a 0-1 ‘trauma’ value. Apply trauma^2 as intensity multiplier (sub-linear feels right). Hit events bump trauma; trauma decays.

Verifying

Shakes feel weighty, fade naturally, never read as random noise.

“Per-frame random is buzz. Perlin noise plus trauma decay gives cinematic shake.”

Sample any post-2014 Vlambeer talk on game feel — the trauma model is the industry standard for a reason.