Skip to content

jEngine — 2D Game Engine

Build 2D games with Rust performance and scripting simplicity. Deploy to Windows, the Web and Android from a single project.

Dual Scripting

Write game logic in Lua or JavaScript — same API, your choice of language. Hot-reload scripts during development.

Cross-Platform

Build for Windows (DirectX 12 / Vulkan), the Web (WebGPU, WebGL2 fallback) and Android (Vulkan, GLES fallback) from the same project.

Visual Editor

Tauri 2 + Svelte editor with scene tree, inspector, asset browser, viewport gizmos, and undo/redo.

Rust Performance

Powered by wgpu (GPU), hecs (ECS), rapier2d (physics), and glam (SIMD math). Native speed, even on WASM.

Full Game Systems

Physics, audio, animation, tilemaps, particles, lighting, navigation, UI, input actions, event bus, prefabs — batteries included.

Visual Scripting

Behavior Graph — node-based logic editor for building game behaviors without writing code. Zero VM overhead.

Visual Shader Editor

Shader Graph — node-based shader authoring with live preview. Compiles to WGSL, one shader for every backend.

Packages

Extend the engine in Rust: components, systems and script commands in a crate. Around fifty ship with it — see All packages.

AI-Ready

Machine-readable API specs and agent SDK docs let AI assistants create complete games programmatically.

SystemDescription
Renderingwgpu sprite batching in z order, texture atlases, meshes, lines, trails, signed-distance-field text, cameras that render to textures, pixel-perfect cameras, sprite masks
LightingPoint, spot, directional and freeform lights, soft shadows from occluders, normal maps, specular, ambient occlusion, toon bands, light cookies, HDR with bloom and tonemapping
Post-processingBloom, vignette, blur, tilt-shift, light shafts, pixelate, CRT
ECShecs, with 100+ built-in components and Rust packages that add more
ScriptingLuau natively, real Lua 5.3 (Fengari) in the editor and on the web, plus JavaScript on desktop; namespaced API (Transform.get_position)
Physicsrapier2d — rigid bodies, colliders, joints, a character controller, raycasts and shape queries, contacts with impulses, fracture, area effects
Audiokira natively, Web Audio in the browser — SFX, music, mixer buses with low-pass and reverb, spatial sound
AnimationSprite sheets, property tweens, skeletons with blending, crossfades, IK and jiggle bones, cloth and rope
TilemapsTiled import, orthogonal / isometric / hexagonal maps, autotiling, animated tiles, chunked colliders, A* pathfinding
ParticlesCPU emitters with drag, turbulence, collision and sub-emitters; GPU particles in the hundreds of thousands
NavigationBaked visibility graphs and agents that path around colliders
UIEntity UI and JSON-defined .gui documents, scaled to any screen and safe area, controller navigation
InputKeyboard, mouse, gamepads (with rumble), multi-touch, on-screen touch controls, action mapping
LocalisationString tables as data, plural rules, text that follows the player’s language
Visual ScriptingBehavior Graph — node-based logic, sharing the event bus with scripts
Shader GraphNode-based materials compiled to WGSL, one shader for every backend
NetworkingA lockstep relay for turn-based online play
EditorTauri 2 + Svelte: scene tree, inspector, asset browser, gizmos, undo/redo, build panel
-- player.lua — move with the arrow keys, jump with space
local speed = 200
local jump_force = 400
function init(entity)
log("Player ready!")
end
function update(entity, dt)
local x, y = Transform.get_position(entity)
if Input.is_action_pressed("move_right") then
x = x + speed * dt
end
if Input.is_action_pressed("move_left") then
x = x - speed * dt
end
Transform.set_position(entity, x, y)
if Input.is_action_just_pressed("jump") then
Physics.apply_impulse(entity, 0, jump_force)
end
end