Kaboom
A JavaScript library that helps you make games fast and fun
README
Kaboom

[Kaboom](https://kaboomjs.com) is a JavaScript library that helps you make games fast and fun!
Start playing around with it in the Kaboom Playground
Examples
- ``` js
 - // initialize context
 - kaboom()
 - // load a sprite called "bean"
 - loadSprite("bean", "sprites/bean.png")
 - // compose the player game object from multiple components and add it to the game
 - const bean = add([
 - sprite("bean"),
 - pos(80, 40),
 - area(),
 - body(),
 - ])
 - // press space to jump
 - onKeyPress("space", () => {
 - // this method is provided by the "body" component above
 - bean.jump()
 - })
 - ```
 
Kaboom uses a powerful component system to compose game objects and behaviors.
- ``` js
 - // add a game obj to the scene from a list of component
 - const player = add([
 - // it renders as a sprite
 - sprite("bean"),
 - // it has a position
 - pos(100, 200),
 - // it has a collider
 - area(),
 - // it is a physical body which will respond to physics
 - body(),
 - // it has 8 health
 - health(8),
 - // or give it tags for easier group behaviors
 - "player",
 - "friendly",
 - // plain objects fields are directly assigned to the game obj
 - {
 - dir: vec2(-1, 0),
 - dead: false,
 - speed: 240,
 - },
 - ])
 - ```
 
Blocky imperative syntax for describing behaviors
- ``` js
 - // .onCollide() comes from "area" component
 - player.onCollide("enemy", () => {
 - // .hurt() comes from "health" component
 - player.hurt(1)
 - })
 - // check fall death
 - player.onUpdate(() => {
 - if (player.pos.y >= height()) {
 - destroy(player)
 - gameOver()
 - }
 - })
 - // if 'player' onCollide with any object with tag "enemy", run the callback
 - player.onCollide("enemy", () => {
 - player.hp -= 1
 - })
 - // all objects with tag "enemy" will move towards 'player' every frame
 - onUpdate("enemy", (e) => {
 - e.move(player.pos.sub(e.pos).unit().scale(e.speed))
 - })
 - // move up 100 pixels per second every frame when "w" key is held down
 - onKeyDown("w", () => {
 - player.move(0, 100)
 - })
 - ```
 
Usage
Start a Project With create-kaboom
The fastest way to start a Kaboom game is with [create-kaboom](https://github.com/replit/kaboom/tree/master/pkgs/create)
- ```sh
 - $ npm init kaboom mygame
 - ```
 
This will create a directory called mygame for you, containing all the files we need
- ```sh
 - $ cd mygame
 - $ npm run dev
 - ```
 
Then open http://localhost:5173 and edit src/game.js
Install as NPM Package
- ```sh
 - $ npm install kaboom
 - ```
 
- ``` js
 - import kaboom from "kaboom"
 - kaboom()
 - add([
 - text("oh hi"),
 - pos(80, 40),
 - ])
 - ```
 
also works with CommonJS
- ``` js
 - const kaboom = require("kaboom")
 - ```
 
Note that you'll need to use a bundler like esbuild or webpack to use Kaboom with NPM
Browser CDN
This exports a global kaboom function
- ``` html
 - <script src="https://unpkg.com/kaboom/dist/kaboom.js"></script>
 - <script>
 - kaboom()
 - </script>
 - ```
 
or use with es modules
- ``` html
 - <script type="module">
 - import kaboom from "https://unpkg.com/kaboom/dist/kaboom.mjs"
 - kaboom()
 - </script>
 - ```
 
works all CDNs that supports NPM packages, e.g. jsdelivr, skypack
Dev
1. npm install to install dev packages
1. npm run dev to start dev server
1. go to http://localhost:8000/ and pick an example
1. edit examples in examples/ to test
Check out CONTRIBUTION.md for more
Community
[Discord Server](https://discord.gg/aQ6RuQm3TF)
[GitHub Discussions](https://github.com/replit/kaboom/discussions)
Games
[on Replit](https://replit.com/apps/kaboom)
Misc
- Thanks to LaJBel for help building the Kaboom community
- Thanks to abrudz for the amazing APL386 font
- Thanks to Polyducks for the amazing kitchen sink font font
- Thanks to 0x72 for the amazing Dungeon Tileset
- Thanks to Kenney for the amazing 1-Bit Platformer Pack
- Find bitmap fonts: Oldschool PC Font
- Featured on Console 50
- Thanks to Umayr for kindly offering the "kaboom" npm package name
- Please buy fireworks on kaboom.com
- Documentation for v0.5 here
探客时代
