flutter3d
Showcase Changelog 38 packages API reference

Gallery

The four games below are one engine playing four genres. Each frame is the live game, running on the same WebGL2 backend as its own demo page.

Strategy No sample run: orders aren't on the tape yet

Click a frame first, because the keyboard goes to whatever was clicked last. Each game takes a few seconds to fetch its textures and models before the first frame draws.

Opening a run #

A downloaded .f3drun opens in the desktop level editor (apps/flutter3d_editor, flutter run -d macos), on the timeline panel described in the level editor. There you can pause, step and scrub to any recorded moment.

You can't open a run from this page, or from any browser. The editor is desktop-only by design: it writes a level document back to the disk it came from, which a browser will not do. So unlike the four games above it has no web build, and a downloaded run opens on whichever desktop has the editor installed.

Recording your own #

The shooter's sample above came from a real, headless run of the simulation: a second process, driven over a socket, stepped sixty times a second and written out as a .f3drun. Nobody edited the file by hand. The platformer's and racing's samples are the same idea in a smaller shape. Each genre's test/demo_test.dart already proves that a shipped level replays byte for byte, and each has a tool/record_sample.dart that runs the same route and writes the result to site/assets/samples/ as well as asserting against it.

Strategy has no sample, and a recorder is not what it lacks. The tape in a .f3drun is a GameAction's continuous press, release and analogue state, sampled every fixed step, which is the shape a shooter's aim or a car's throttle already has. A strategy match is played through discrete orders (CommandPost.restock, a TrainOrder), and main.dart never turns those into an InputState; there is no InputState anywhere in that file. Recording a match would mean teaching the tape format a second kind of frame, which is more than writing a third tool/record_sample.dart.

Next #