Quick answer: Construct 3 animation names are case-sensitive, so “Run” and “run” are different animations. The most common causes of animations not playing are: a name mismatch, the animation speed being set to 0 in the Animations editor, setting the animation every tick without the “from beginning” parameter, or confusing “Set animation” with “Set frame”.
Here is how to fix Construct 3 animations that will not play or get stuck on the first frame. You set the animation to “Run” and the sprite just sits there on frame 0. Or you switch between “Idle” and “Walk” and the animation flickers or never actually plays through. This is one of the most searched Construct 3 problems, and it almost always comes down to one of five specific mistakes.
The Symptom
You have a Sprite object with multiple animations set up in the Animations editor. You use the “Set animation” action to switch between them. But one or more of the following happens:
The animation does not change at all — the sprite stays on whatever animation it was already playing. Or the animation switches but stays frozen on the first frame, never advancing to frame 1, 2, and so on. Or the animation appears to flicker, rapidly switching between frame 0 of two different animations without ever playing through either one.
In the Animations editor, everything looks correct. The frames are there, the animation previews fine when you click the play button, and the speed is apparently set. But at runtime, it does not work.
What Causes This
There are five common causes:
1. Animation name case mismatch. Construct 3 animation names are case-sensitive. If your animation is named “Run” in the editor but you write Set animation to "run" in the event sheet, nothing happens. The engine does not find an animation with that exact name and silently fails. No error, no warning — just no change.
2. Animation speed is 0. Each animation has a speed property in the Animations editor (measured in frames per second). If this is set to 0, the animation will display frame 0 and never advance. This often happens when you create a new animation and forget to set its speed, or when you accidentally set it to 0 while editing.
3. Setting the animation every tick. If you have an “Every tick” event (or any condition that fires continuously) that sets the animation, you are resetting the animation to frame 0 on every single frame. The animation never gets a chance to advance past the first frame because it keeps getting restarted. This causes the frozen-on-frame-0 symptom.
4. Missing “from beginning” parameter. The “Set animation” action has a second parameter: “from current frame” or “from beginning”. If the animation is already set to the name you are requesting and you use “from current frame”, nothing visible changes. If you need to restart an animation, you must explicitly use “from beginning”.
5. Confusing “Set animation” with “Set frame”. “Set animation” switches which animation is active. “Set frame” changes which frame is displayed within the current animation. If you accidentally use “Set frame” when you mean “Set animation”, you will just see a different frame of the same animation, not a different animation entirely.
The Fix
Step 1: Verify the animation name exactly matches. Open the Animations editor and copy the exact name. Pay attention to capitalization, trailing spaces, and special characters.
// BAD: Case mismatch
+ System: On start of layout
-> Player: Set animation to "run" (from beginning) // Won't work if named "Run"
// GOOD: Exact case match
+ System: On start of layout
-> Player: Set animation to "Run" (from beginning) // Matches "Run" exactly
You can also use the scripting API to list all animation names and verify them at runtime:
// JavaScript: Log all animation names for debugging
const player = runtime.objects.Player.getFirstInstance();
console.log("Current animation:", player.animation.name);
console.log("Animation speed:", player.animation.speed);
console.log("Current frame:", player.animation.frame);
console.log("Frame count:", player.animation.frameCount);
Step 2: Set the animation speed in the Animations editor. Click on the animation in the Animations panel, then check the Speed property in the Properties bar. Set it to your desired FPS (commonly 8-15 for character animations).
// You can also set speed via events if needed:
+ System: On start of layout
-> Player: Set animation speed to 10
Step 3: Only set the animation when the state changes, not every tick. Use a condition to check the current animation before setting a new one.
// BAD: Setting animation every tick (causes frame 0 freeze)
+ Keyboard: Right arrow is down
-> Player: Set animation to "Run" (from beginning) // Resets every tick!
// GOOD: Only set when animation actually needs to change
+ Keyboard: Right arrow is down
+ Player: Animation name ≠ "Run"
-> Player: Set animation to "Run" (from beginning)
// ALSO GOOD: Use "from current frame" to prevent reset
+ Keyboard: Right arrow is down
-> Player: Set animation to "Run" (from current frame)
The key difference: “from beginning” restarts from frame 0 every time it is called. “From current frame” only changes the animation name and continues from whatever frame the sprite is currently showing. If the animation is already “Run”, “from current frame” does nothing, which is exactly what you want for continuous movement.
Step 4: Check the looping setting. Each animation has a “Loop” property. If it is set to “No”, the animation plays once and stops on the last frame. For continuous animations like walking or idle, ensure Loop is set to “Yes”.
// Event sheet: Handling non-looping animations
+ Player: On animation "Attack" finished
-> Player: Set animation to "Idle" (from beginning)
// This ensures the player returns to Idle after the
// one-shot Attack animation completes
Step 5: Confirm you are using the right action. “Set animation” and “Set frame” are different actions. Make sure you are choosing the correct one from the action list.
// "Set animation" - switches the entire animation
-> Player: Set animation to "Jump" (from beginning)
// "Set frame" - changes frame within current animation
-> Player: Set animation frame to 3
// Use "Set frame" for things like directional sprites
// where each frame is a direction, not for switching states
Why This Works
Each fix addresses a specific failure in the animation pipeline:
Case-correct names allow the engine to find the animation in its internal lookup table. Construct 3 uses exact string matching for animation names — there is no fuzzy matching or case folding. A single character difference means the animation does not exist as far as the engine is concerned.
Non-zero speed tells the animation system how fast to advance frames. At speed 0, the frame counter never increments. The animation exists and is set correctly, but it literally cannot advance because the frame duration is infinite.
Conditional animation setting prevents the restart-every-tick problem. When you call “Set animation from beginning”, the engine resets the frame counter to 0 and the animation timer to 0. If this happens 60 times per second, the timer never reaches the threshold for advancing to frame 1. By checking the current animation name first, you only trigger the reset once, when the state actually changes.
Correct looping determines what happens after the last frame. With looping enabled, the animation wraps back to frame 0. Without it, the animation stops. For state-based animations (idle, walk, run), you almost always want looping. For one-shot animations (attack, death, jump), you want non-looping with a handler for the “On animation finished” trigger.
"I keep a naming convention document for all my animations. PascalCase, no spaces, no special characters. It eliminates the case-sensitivity problem entirely."
Related Issues
If your sprites are visible but collisions are not working, see Construct 3 collision not detected / overlap not triggering which covers collision polygon issues that can also relate to animation frame changes. If your objects disappear entirely instead of just having animation problems, check Construct 3 ‘Object Not Found’ error after destroying instances. And if audio cues tied to animations are not playing, Construct 3 audio not playing in browser covers the browser autoplay restrictions that often interact with animation-triggered sounds.
Check the name. Check the speed. Check the tick. In that order.