BornEngine / engine surface
Native games from TypeScript.
A class-first TypeScript game engine built around owned services, explicit resource lifetimes, and native performance—with Web/WASM support.
- macOS
- Windows
- Linux
- iOS
- tvOS
- watchOS
- Android
- Web / WASM
From an empty folder to a running game, without a framework maze.
Subclass Game to keep startup, gameplay, and rendering together. The runtime owns the window and services; resources created with this stay bound to that runtime. Perry compiles the TypeScript side, and the engine owns the native renderer.
$ bornengine create
$ cd MyGame
$ bornengine run main.ts
→ building native target
→ running MyGameOne code shape, many targets
Keep the whole game in one class.
Override onStart, loop, and render, then start the engine with run(). The same instance owns the renderer and shared assets through this.assets. Use run(callbacks) when you need direct frame control.
import { Colors, Game, Texture } from '@bornengine/engine';
class Undertale extends Game {
private readonly player: Texture | null;
constructor() {
super({ window: { title: 'Undertale', width: 800, height: 450 } });
this.player = this.assets.loadTexture('assets/player.png');
}
protected override onStart() {
// Initialize game-specific systems.
}
protected override loop(_dt: number) {
// Update gameplay state in seconds.
}
protected override render() {
this.renderer.clear(Colors.SNOW);
if (this.player !== null && this.player.isLoaded) this.player.draw({ x: 190, y: 200 });
}
}
new Undertale().run();A compact core, not a black box
Build the part of the game you are thinking about.
The next frame is yours
Start with the project. Stay for the engine.
The companion CLI lives at github.com/RuanFernandes/bornengine-cli.