Search documentation

Find pages, sections, and content across all docs.

WavedashDocs

GameMaker

Publish GameMaker projects to the web via the GX.games (Opera GX) WebAssembly export.

View example project on GitHub Playtest the example project

GameMaker ships to the web via its GX.games (Opera GX) export target, which produces a WebAssembly runner plus a flat set of static files. Wavedash hosts those files directly.

Export your game

First, set your build target. In the top right of the GameMaker workspace, click the Target Device dropdown to open the Target Platform manager, then select GX.games as the Platform and GMS2 VM as the Output. Click Apply.

Then in the IDE: Build → Create Executable. This produces a .zip containing:

  • index.html
  • runner.js, runner.wasm
  • runner.data, audio-worklet.js
  • game.unx (your packed game)
  • runner.json

Unzip into build/ and point upload_dir at it.

SDK integration

GameMaker reaches JavaScript through an extension. Create one in your project (e.g. ext_wavedash) with a single .js file that wraps Wavedash:

Calling Wavedash.init() is required. Your game stays hidden behind the Wavedash loading screen until you do. Call it once your game is ready to play.

// extensions/ext_wavedash/ext_wavedash.js
function wavedash_js_init() {
  const Wavedash = window.Wavedash;
  if (Wavedash) Wavedash.init({ debug: true });
  return 1.0;
}

function wavedash_js_update_progress(progress) {
  const Wavedash = window.Wavedash;
  if (Wavedash) Wavedash.updateLoadProgressZeroToOne(progress);
  return 1.0;
}

Register each function in the extension editor — make sure External Name matches the JS function name, Argument Count matches the number of arguments, and the extension is marked for the HTML5 / Opera GX target.

Then wrap them in a GML script so the rest of your code doesn't touch the extension directly:

// scripts/scr_wavedash/scr_wavedash.gml
function wavedash_init() {
    wavedash_js_init();
}

function wavedash_update_progress(_progress) {
    wavedash_js_update_progress(_progress);
}

Load progress and init

Wavedash expects two calls: a progress update while your game loads, and a single init once the player can interact. Put them in your root controller's Create event:

// obj_game Create event
wavedash_update_progress(1);
wavedash_init();

wavedash.toml

game_id = "YOUR_GAME_ID_HERE"
upload_dir = "./build"
entrypoint = "index.html"

GameMaker's GX.games runtime letterboxes the canvas to the room's aspect ratio — this is baked into the generated index.html and cannot be disabled via project options. To go edge-to-edge on arbitrary browser sizes you'd need to set up dynamic views/cameras that match the viewport aspect each step.

Known issues

show_message and alerts. Wavedash hosts games in a sandboxed iframe without allow-modals. GameMaker's show_message compiles to alert(), which silently fails. Remove all show_message calls or replace them with in-game UI.

Ad and mobile extensions. If your project includes Google Mobile Ads, IAP, or other mobile-only extensions, make sure they exit early or are stripped for web builds. Leftover ad snippets in the exported index.html can cause console errors.

HTML5 target. The legacy HTML5 export is not recommended — use GX.games even if you're not publishing to Opera GX. The WebAssembly pipeline is more reliable.