Developer Resources
Documentation
Everything you need to build games for Emberware
Start Here
Build Paddle in 8 Parts
Learn Emberware by building a complete game from scratch. Covers drawing, input, physics, AI, multiplayer, audio, and publishing.
Start the TutorialBrowse
Documentation Sections
Getting Started
Set up your development environment and create your first game.
- Prerequisites
- Your First Game
- Understanding the Game Loop
Tutorials
Step-by-step guides to building complete games.
- Build Paddle (8 Parts)
- Drawing & Input
- Multiplayer & Sound
Guides
In-depth explanations of Emberware features and best practices.
- Render Modes
- Asset Pipeline
- Publishing Your Game
API Reference
Complete FFI function reference with examples.
- Cheat Sheet
- Input Functions
- Graphics Functions
Examples
28+ example games organized by feature and complexity.
- Learning Path
- Graphics Examples
- Complete Games
Source Code
Browse the Emberware source, file issues, and contribute.
- GitHub Repository
- Issue Tracker
- Discussions
Developer Book
The complete Emberware developer documentation, hosted as an mdBook.
Open Full DocumentationQuick Reference
Common Patterns
Minimal Game
#![no_std]
#![no_main]
use core::panic::PanicInfo;
#[panic_handler]
fn panic(_: &PanicInfo) -> ! {
core::arch::wasm32::unreachable()
}
#[link(wasm_import_module = "env")]
extern "C" {
fn draw_rect(x: f32, y: f32, w: f32, h: f32, c: u32);
}
#[no_mangle]
pub extern "C" fn init() {}
#[no_mangle]
pub extern "C" fn update() {}
#[no_mangle]
pub extern "C" fn render() {
unsafe { draw_rect(100.0, 100.0, 50.0, 50.0, 0xFF6B6BFF); }
} Rollback-Safe State
// All game state in static variables
static mut PLAYER_X: f32 = 100.0;
static mut PLAYER_Y: f32 = 200.0;
static mut SCORE: u32 = 0;
#[no_mangle]
pub extern "C" fn update() {
unsafe {
// Read input for both players
let p1_move = left_stick_x(0);
let p2_move = left_stick_x(1);
// Deterministic updates
PLAYER_X += p1_move * 5.0;
}
}
// Multiplayer just works!