JSPM

abram-js

0.9.2
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • 0
  • Score
    100M100P100Q42394F
  • License MIT

Unity-inspired 2D game engine for browsers. Zero dependencies, Canvas2D rendering.

Package Exports

  • abram-js
  • abram-js/build/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (abram-js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

ABRAM

Advanced Browser Rendering Abstraction Module — a Unity-inspired 2D game engine for the browser, built with TypeScript. Zero runtime dependencies.

ABRAM logo

Features

  • Component-based architecture — GameObjects hold Modules (Sprite, Rigidbody, Collider, Animator, TrailRenderer, etc.)
  • Parent-child transforms — nested position, rotation, and scale with world coordinate propagation
  • Impulse-based physics — gravity, forces, drag, collision detection and response with OBB and circle colliders
  • Particle system — emit over time/distance/burst, pooling, sub-emitters, lifetime curves, occlusion culling
  • Sprite animation — state machine animator with frame-based transitions
  • Trail rendering — configurable width/color over trail lifetime
  • Input — keyboard tracking via InputSystem, mouse/cursor tracking via CursorInputSystem
  • Camera — position, zoom/scale, center tracking, bounding box confiner
  • Audio — Web Audio API manager with preloading, volume control, and playback handles
  • UI system — screen-space text and rect elements, independent of camera
  • Math utilities — Vector, Point, Polar coordinates, Bezier curves, color interpolation

Installation

Browser (script tag)

<script src="path/to/abram.js"></script>

npm

npm install abram-js

Usage

1. Create the engine

Browser

const { Engine, GameObject, Classes: { Vector, RGBAColor } } = window.Abram;

const root = document.getElementById('root');
const engine = new Engine(root, {
    width: 1280,
    height: 800,
    bgColor: new RGBAColor(30, 30, 30),
    drawFps: true,
});

ES modules

import Engine, { GameObject, Classes } from 'abram-js';
const { Vector, RGBAColor } = Classes;

const root = document.getElementById('root');
const engine = new Engine(root, {
    width: 1280,
    height: 800,
    bgColor: new RGBAColor(30, 30, 30),
});

2. Define a scene

A scene is a function that receives the engine and populates it with game objects.

async function MainScene(engine) {
    const player = new Player({ position: new Vector(100, 200), name: 'Player' });
    engine.AppendGameObject(player);

    const floor = new Floor({ position: new Vector(0, 400) });
    engine.AppendGameObject(floor);
}

engine.RegisterScene('main', MainScene);

3. Create game objects

Extend GameObject and use the lifecycle methods. Register modules in Start(), handle logic in Update() and FixedUpdate().

class Player extends GameObject {
    Start() {
        const sprite = new Sprite({
            image: new ImageWrapper('./player.png'),
            width: 64, height: 64, layer: 1,
        });
        this.RegisterModule(sprite);

        this.rb = new RigidBody({ useGravity: true, mass: 1, drag: 0.5 });
        this.RegisterModule(this.rb);

        this.collider = new Collider2D({
            shape: new OBBShape(64, 64),
            type: Collider2DType.Collider,
            parent: this.transform,
            rb: this.rb,
        });
        this.RegisterModule(this.collider);
    }

    FixedUpdate() {
        // Physics logic runs at fixed 50Hz
        super.FixedUpdate();
    }

    Update() {
        // Runs every frame — input, visuals, animation
        if (InputSystem.KeyPressed('ArrowRight')) {
            this.rb.AddForce(new Vector(5, 0));
        }
        super.Update();
    }
}

4. Start the engine and load a scene

engine.Start();
await engine.LoadScene('main');

Scenes can be swapped at any time — LoadScene tears down the current scene and loads the new one.

Lifecycle

Every GameObject and Module follows the lifecycle:

Start() (once, on registration) → FixedUpdate() (fixed 50Hz timestep, physics) → Update() (every frame, rendering/input) → Destroy() (on removal)

Build

npm run build       # full pipeline: clear -> tsc -> webpack
npm run build-ts    # TypeScript only
npm run bundle      # webpack only
npm run lint        # ESLint

Examples

The examples/ directory contains working demos. Open any example's index.html in a browser after running npm run build.

Example Description
simple-game Character movement with sprites, animation, physics, and input
collisions-detection OBB collider physics with spawning
particle-system Particle effects with lifetime curves
particle-collisions Particles with collision physics
fireworks-particle Fireworks with sub-emitters and time scaling
planets-patterns Orbital mechanics with trail renderers
galton-board Galton board physics simulation
turret-defense Turret defense game demo
bezier-curve Bezier curve visualization
colors RGBAColor manipulation and gradients

Documentation

Full documentation is in the docs/ folder:

License

MIT