Craters is a modular JavaScript framework reimplemented in TypeScript for rapid HTML5 game development
World, Entity, System, Query).Tile.ParticleSystem — sprite-based particle effects with per-particle gravity, drag, tinting, and directional bias. See guides/particle.md.KeyboardEvent.code.SoundManager, Sound) for sound effects and music with play/pause/stop/volume control.AssetsManager — async loaders for images, JSON, text, binary blobs, and fonts.TilemapManager — loads Tiled JSON maps and renders them via Sprite.Detailed guides for every module:
| Module | Guide |
|---|---|
ECS (World, Entity, System, Query) |
guides/ecs.md |
| RigidBody | guides/rigidbody.md |
| Vector | guides/vector.md |
SAT Collision (Box, Polygon, Circle) |
guides/sat.md |
| QuadTree | guides/quadtree.md |
| Canvas2DRenderer | guides/canvas-2d-renderer.md |
| WebGLRenderer | guides/webgl-renderer.md |
| Tile | guides/tile.md |
| Sprite | guides/sprite.md |
| FontManager | guides/font-manager.md |
| TilemapManager | guides/tilemap-manager.md |
| ParticleSystem | guides/particle.md |
| Input | guides/input.md |
| SoundManager / Sound | guides/sound.md |
| AssetsManager | guides/assets-manager.md |
| RenderLoop | guides/render-loop.md |
npm install craters
import { EntityComponentSystem as ECS, RenderLoop } from "craters";
// 1. Define Components
class Position extends ECS.Component {
constructor(public x: number, public y: number) { super(); }
}
class Velocity extends ECS.Component {
constructor(public dx: number, public dy: number) { super(); }
}
// 2. Define System
class MovementSystem extends ECS.System {
public execute(delta: number): void {
// Query entities with Position and Velocity
const query = this.world.createQuery([Position, Velocity]);
query.entities.forEach(entity => {
const pos = entity.getComponent(Position);
const vel = entity.getComponent(Velocity);
pos.x += vel.dx * delta;
pos.y += vel.dy * delta;
});
}
}
// 3. Setup World
const world = new ECS.World();
world.registerSystem(new MovementSystem());
// 4. Create Entity
const player = world.createEntity();
player.addComponent(new Position(0, 0));
player.addComponent(new Velocity(1, 0));
// 5. Run Loop
const loop = new RenderLoop((delta) => {
world.execute(delta);
});
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.
Also, please don't edit files in the "dist" subdirectory as they are generated via Grunt. You'll find source code in the "src" subdirectory!
See CHANGELOG.md for the full release history.
Copyright (c) 2021 John Swana Licensed under the MIT license.