Making animated textures with .mcmeta
6 min read
Animated textures are not a special file type — they are an ordinary PNG with the frames stacked vertically, plus a small file telling Minecraft how to play them.
The image is a vertical strip
A 16×16 texture with four frames of animation is a 16×64 PNG: each frame square, stacked top to bottom, first frame at the top. The game infers the frame size from the width, so the height simply has to be a whole multiple of it. This is exactly how vanilla animates things like fire, water and prismarine.
prismarine.png 16 wide × 64 tall = 4 frames of 16×16
┌────────┐ frame 0
├────────┤ frame 1
├────────┤ frame 2
├────────┤ frame 3
└────────┘The .mcmeta file
Next to the texture sits a file with the same name plus .mcmeta — so prismarine.png is accompanied by prismarine.png.mcmeta. Note that it keeps the .png in the middle; this trips people up constantly.
{
"animation": {
"frametime": 2,
"interpolate": true
}
}Without this file, a tall PNG is not treated as an animation — it is treated as a squashed, wrong-sized texture. The strip alone does nothing.
frametime
How many game ticks each frame is held. There are 20 ticks in a second, so frametime: 2 is ten frames per second and frametime: 20 is one frame per second. It defaults to 1 — one frame every tick, which is very fast and rarely what you want.
interpolate
With interpolate: true, Minecraft blends smoothly between one frame and the next instead of cutting. This is how vanilla gets a slow shimmer out of only a handful of frames — it is generating everything in between for you.
Use it for gradual things: glows, water, gentle colour shifts. Turn it off for anything that should read as distinct steps, like a blinking light or a rotating pattern, where blending just produces mush.
Controlling frame order and timing
By default the frames play in file order and loop. A frames array overrides that — you can reorder frames, repeat them, and give individual frames their own duration:
{
"animation": {
"frametime": 4,
"frames": [
0,
1,
{ "index": 2, "time": 20 },
1
]
}
}That plays frames 0, 1, 2, 1 — a ping-pong rather than a loop — and holds frame 2 for a full second while the others use the default 4 ticks. Reusing frames this way keeps the PNG small; a bounce does not need its frames duplicated in the image.
Keep it short
Doing it without writing JSON
The editor handles animation as frames rather than as a file format: you build the frames, set the speed, and the strip and its .mcmeta are generated at export with the naming correct. You can also import a GIF and have it converted into frames, which is usually faster than drawing a loop by hand.
If something animates in the wrong order or not at all, it is almost always the .mcmeta name — check for texture.png.mcmeta rather than texture.mcmeta. Other failures are covered in why your texture pack isn’t working.
CreateTextures builds all of this for you — open the editor, edit what you want, and export a pack with the manifest, format number and folder layout already correct.
