Releases / v0.116.0-rc3
v0.116.0-rc3 Lands On Its Feet
2026-10-12 Engine
Everything in rc2, plus the rest of a 2D pipeline. Save in Aseprite and the game has the frames. Bring levels in from Tiled or LDtk. Drop down through platforms, have the camera look ahead and keep to rooms, and fade between scenes.
Aseprite files are sprite sheets
Put an .aseprite (or .ase) file in the project. Beside it you get:
- a sheet of every frame, with the texture already sliced;
- a sprite animation for every tag, such as
hero_walkorhero_jump.
Save in Aseprite and both are rewritten within a second, so the new frames
show up in the Scene view and in a running game. There's no export step. Drag
the .aseprite into the Scene view to place it as a Sprite.
What you see is what Aseprite's own export draws:
- visible layers and groups, with their opacity;
- linked cels and z-index;
- indexed, grayscale and RGBA sprites, and tilemap layers.
Tags keep how they play: reverse, ping-pong, and a repeat count. Every frame keeps its own duration.
Exported sheets got better too. A packed or trimmed sheet JSON now imports, laid out again on a grid. Only rotated frames are refused, and the message names the checkbox to untick.
Levels from Tiled and LDtk
Drag a .tmx or .ldtk file into the Scene view, or right-click it in Assets
▸ ▦ Import level. Each level becomes one node holding:
- a tile layer for every layer, with every flip and turn kept;
- an empty node for every object or entity, tagged with its class, so
findTagged("spawn")finds your spawn points; - one tileset for the whole level, with collision worked out from the art.
One tile is one world unit, so sprites dropped beside the level match its pixel size. Every visible layer collides. Untick Collidable on layers that are only decoration.
Drop down through a platform
Set node.dropThrough = true on a character standing on a one-way tile and it
falls through. The Pixel Platformer does this when you hold down and press
Jump.
if node.grounded and my < -0.5 and input.justPressed("Jump") then
node.dropThrough = true
end
A jump that doesn't clear a one-way ledge now falls back down rather than snapping up onto it.
Paths across a tile level
tm:path(from, to) finds a route across a tilemap for a top-down game. Solid
tiles are walls. It returns the square centres to walk through, and whether
the route reaches the goal.
local path, reached = level:tilemap():path(enemy, player, { avoid = { "water" }, cost = { mud = 3 } })
Diagonal steps never cut past a wall's corner. When the goal is walled off, the path ends as close as it can get.
The camera looks ahead and keeps to rooms
A 2D camera has two new settings, in the Inspector and in node:setCamera2D:
- look ahead leads the target in the direction it last moved. A player running right sees what is coming.
- rooms takes a tag. Every node carrying it is a room the size of its tile
layers. The camera keeps its view inside the room the player is in, and
glides across when they walk into the next one. Imported levels are tagged
level.
Fade between scenes
scene.load("level2", { fade = 0.6 }) -- through black
scene.load("level2", { fade = 1.0, color = {1, 1, 1} }) -- through white
The screen fades out, the scene swaps while it is covered, and the new scene fades in. The fade covers the HUD and finishes even while the game is paused.
Animate in the Image tab
- hold sets how long a frame shows:
2×holds it twice as long. - Tags name runs of frames and say which way each one plays.
- The onion skin shows any number of frames before (in red) and after (in green) the one you're drawing.
- File ▸ Export ▸ Frames → sprite sheet also writes a sprite animation per tag, with every hold kept.
Upgrading
Nothing to do. An Image tab document with holds or tags is saved in a newer format that earlier versions won't open. Documents without them are saved as before.
Floptle Hub
Engine
The binaries are not signed yet. On macOS, right-click the app and pick Open the first time. On Windows, if SmartScreen appears, pick More info then Run anyway.