Skip to content

t1k:designer:base:feel-juice

FieldValue
Modulebase
Version1.13.2
Efforthigh
Tools

Keywords: animation curves, camera punch, chromatic aberration, coyote time, damage numbers, easing, hit flash, hit stop, hit-stop, juice, knockback, particle burst, particles, screen shake, squash stretch, time slow, vignette

/t1k:designer:base:feel-juice

  • Making combat, movement, or UI interactions feel more satisfying
  • Adding screen shake, hit stop (freeze frames), or camera punch
  • Designing floating damage numbers, hit flash, or particle bursts
  • Tuning animation easing curves (ease-out, spring, squash-and-stretch)
  • Fixing input latency, input buffering, or dead zone issues
  • Adding time-slow (bullet time), chromatic aberration, or vignette effects

Juice = visual + audio feedback that makes every action feel consequential. Rule: Every player action must produce visible, audible feedback within 1 frame.

Feedback Priority Stack (when budget is limited)

Section titled “Feedback Priority Stack (when budget is limited)”
  1. Sound (always — even at 8-bit fidelity)
  2. Hit flash / color change (1-2 frames)
  3. Particle burst (3-10 particles minimum)
  4. Camera reaction (shake or punch)
  5. Screen-space effect (chromatic aberration, time slow)
ScenarioAmplitudeFrequencyDecay
Light hit0.05–0.1020–30 HzExponential 0.15s
Heavy hit0.15–0.3015–20 HzExponential 0.25s
Explosion0.40–0.6010–15 HzLinear 0.4s
Boss slam0.80–1.008–12 HzEase-out 0.6s

Implementation: use a camera shake component on a singleton; a shake system reads amplitude/frequency/decay and drives the camera offset each frame. Never shake the main camera directly — shake a child rig.

  • Per-entity freeze (preferred): pause simulation for 2–4 frames via your engine’s time-scale or system group API. Resume via countdown component.
  • Global time scale: simpler but breaks UI animations — use only for boss cinematic moments.
  • Values: light hit = 2 frames; heavy hit = 3–4 frames; parry/crit = 5–6 frames.
  • Freeze attacker AND target — asymmetric freeze causes visual disconnect.
EventCountSpeedLifetimeShape
On-hit (light)5–8 sparks2–4 m/s0.2–0.3sHemisphere toward attacker
On-hit (heavy)12–20 shards4–8 m/s0.3–0.5sFull sphere + ground splat
On-death20–40 mixed3–10 m/s0.5–1.0sRadial burst + linger
On-level-up15–25 sparkles1–3 m/s upward1.0–2.0sCone upward

Use GPU-instanced particle bursts. Attach to entities via your engine’s event/component system.

PhaseTimingNotes
Attack wind-upFrame 0 (input frame)Whoosh/grunt starts immediately
ImpactFrame of collisionCrack/thud on hit confirm
Cooldown tickEvery 0.25s remainingSubtle UI blip — not every frame
Critical hit+50ms delay after impactStinger layered on top of impact sfx

Rule: audio cue starts on the same frame as the visual — never let visual lead audio by >1 frame.

  • Light tap (UI button, collect item): HapticFeedback.LightImpact()
  • Medium impact (enemy hit, block): HapticFeedback.MediumImpact()
  • Heavy impact (death, boss hit, explosion): HapticFeedback.HeavyImpact()
  • Selection change (menu scroll): HapticFeedback.SelectionChanged()
  • Pattern: visual → audio → haptic (50ms max delay between layers)
  • Always provide haptic toggle in settings; default ON for mobile, OFF for tablet.
EffectValuesReference
Hit stop2-4 frames at 60fps (33-66ms)references/hit-feedback.md
Screen shakemagnitude 0.1-0.3 (hit), 0.5+ (explosion)references/screen-effects.md
Ease-out appear0.2s UI elementsreferences/animation-curves.md
Input latency budget<100ms total, <50ms action gamesreferences/input-responsiveness.md
Coyote time3-6 frames grace after leaving edgereferences/input-responsiveness.md
Input buffer window2-4 frames before action completesreferences/input-responsiveness.md
#Anti-PatternProblemFix
1No feedback on actionsFeels broken, unresponsiveEvery action: sound + visual within 1 frame
2Delayed input responsePlayer feels lag, distrustedStart animation on input frame (optimistic rendering)
3Excessive shakeNauseating, unplayable for someCap magnitude at 0.5 units; add reduce-motion option
4Uniform feedbackAll hits feel the sameScale effects by damage: crit = 2× shake + larger number
5No squash/stretchMotion feels rigid, lifelessApply 0.8/1.2 scale on land/impact over 0.2s
6Missing coyote timePlatformer feels unfairAlways: 3-6 frame jump grace after leaving platform
7Shake in large-scale battles500+ units = constant max-trauma, camera never stops vibratingDisable CinemachineImpulseListener on camera or set CameraTrauma.MaxIntensity=0. Trauma-per-hit (0.03) × hundreds of hits/frame = instant saturation
  • game-feel-foundations — theoretical framework (Swink’s 6 metrics, perception thresholds, ADSR theory, principles audit). Use that skill for why / how much; this skill for how.
  • game-ux-design — feedback must not obscure critical HUD info (shake budget vs readability)
  • engine animation skills (auto-activated via registry) — animation and curve implementation
  • tweening library skill (auto-activated via registry) — zero-alloc tweening for juice effects
  • engine rendering skills (auto-activated via registry) — GPU-side effects
  • engine VFX skills (auto-activated via registry) — particle VFX
FileCoverage
references/hit-feedback.mdHit stop frames, hit flash, knockback, damage numbers, screen shake, particle bursts
references/screen-effects.mdShake formula, camera punch, chromatic aberration, time slow, vignette, flash effects
references/animation-curves.mdEase types, UI animation timing, squash/stretch, anticipation, follow-through, spring physics
references/input-responsiveness.mdLatency budget, input buffering, coyote time, cancel windows, dead zone, priority system