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_walk or hero_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.

lua
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.

lua
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

lua
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

Linux x86_64 10.7 MB Download → sha256 e23bfc55e170812de563d67b10b1d2ed1bc2c6468d47f9fee7301d5c08681080
macOS Apple Silicon 7.4 MB Download → sha256 111058f465ce72049e47f702ba2c8f0d004d5d2a0b5c20f249e15647cc1421d0
macOS Intel 7.9 MB Download → sha256 7005e21d68ebeabad7ab1cdfdf9939b1ead8aa831be32623ff054ba461a6bec8
Windows x86_64 9.1 MB Download → sha256 023f3751e2dbf31deb6e54f2aa076fcb996a2affeab19bec56b3616001c6495b

Engine

Linux x86_64 54.0 MB Download → sha256 cbc99a8566e77037ef196175da566c3eef4525a1555e3ec3b748a0c8be814303
macOS Apple Silicon 42.0 MB Download → sha256 c8e878c3d7fc7d8606092f6711d47a4cc37b0d737f7ea77222ce6cc40515f030
macOS Intel 45.1 MB Download → sha256 b2904e544e5ca53d8c57e11780726ef510da448a8747b19eec0639f11b3a0a62
web 4.9 MB Download → sha256 6d2eb06eeca0245ca5d5896c61d23a1dbffe6710434533956a8539fb605655ef
Windows x86_64 50.9 MB Download → sha256 866632e3455b74b682ebed1a83c4b7f819bb17b3ae2653eda75b1196d297ce72

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.