Snarky\'s
LOADING
Arrows / WASDMoveSpaceJump (double-jump in air)Any key / tap / clickStart / Restart
platformer#platformer#3d#coins#jumping#godot#kenney

Hop between floating blocks, grab every coin, stick the flag.

A bite-sized 3D platformer: double-jump across floating blocks and falling platforms, scoop up coins for points, and reach the flag to win. Miss a jump and it's game over. Made by Kenney as an open-source Godot starter kit with CC0 art.

0 plays0 players0 remixesPublished 2d ago
Open source

Made by Kenney (kenney.nl). Released under the MIT (code), CC0 (assets) license — original source.

Changes for this platform: Switched the renderer from Forward+ to Compatibility (WebGL 2) so it runs in browsers; exported with Godot 4.6.3 as a single-threaded web build; the engine runtime is served from the platform's shared /engine/godot/4.6.3/ instead of being bundled; replaced the default HTML shell with a launcher that shows a loading backdrop and calls ArcadeSDK.ready(). Also disabled the kit's own gl_compatibility background_energy_multiplier=0.25 override in scripts/main.gd (scripts/main.gd), which rendered the sky almost black under the actual Compatibility renderer in this export; kept its sun light_energy/shadow_opacity compensation. Downscaled sprites/skybox.png's import (process/size_limit 0 -> 1024, in sprites/skybox.png.import) from its 4096x2048 source so the VRAM-compressed (BPTC) skybox shrank from 8.4 MB to ~0.5 MB, cutting index.pck from 8.87 MB to ~1.0 MB to fit the platform's 8 MB per-file upload limit; the sky is a soft gradient with sparse stars so the lower resolution is visually indistinguishable. Added scripts/sdk.gd (new autoload), a guarded bridge to the host's ArcadeSDK following the same typeof/get_interface guard pattern as kenney-city-builder's builder.gd: score(n) and submitScore(n) call the JS interface method directly (plain ints marshal natively), gameOver({score, won}) is built as a small JS expression instead since Godot Dictionaries do not marshal into a native JS object through JavaScriptBridge method calls, and best score is persisted via ArcadeSDK.storage under the key 'platformer3d-best-score'. Added scripts/input_setup.gd (new autoload) which binds arrow keys onto the kit's WASD-only move_left/move_right/move_forward/move_back actions at runtime via InputMap.action_add_event so the platform's touch joystick (which synthesizes arrow KeyboardEvents) can move the player, and removes the arrow-key bindings from the kit's own camera_left/camera_right/camera_up/camera_down actions (which already used the same arrow keys for manual camera orbit) so the touch joystick no longer also spins the camera; gamepad camera control is unaffected. Added objects/goal.gd and a Goal Area3D (scenes/main.tscn, next to the existing decorative flag model, which had no finish trigger of its own) for the win condition. Extended scripts/player.gd with a 'fell' signal emitted when falling below the level (y < -10, previously silently reloaded the whole scene) so the platform wrapper can end the run as a loss instead of respawning silently. Extended scripts/main.gd with a TITLE/PLAYING/GAME_OVER/WIN state machine wiring Player's existing coin_collected signal to SDK.score(), the new 'fell' signal to SDK.gameOver({won:false}), and the new Goal's 'reached' signal to SDK.gameOver({won:true})+SDK.submitScore(), plus best-score load/save and freezing the player's physics process outside of PLAYING. Extended scripts/hud.gd and scenes/main.tscn with a Best-score label and a full-screen title/game-over/win message overlay (new LabelSettings and a semi-transparent ColorRect backdrop); the original coin-count Icon/x/Coins readout is unchanged. All 3D models, textures, sounds and the core movement/jump/coin-collect gameplay code are otherwise unchanged from the original kit.

Comments 0

Log in to comment.

  • Loading…