Planck.js

2D JavaScript Physics Engine

README

Planck.js


Planck.js is JavaScript (TypeScript) rewrite of Box2D physics engine for cross-platform HTML5 game development.

Motivations


- Taking advantage of Box2D's efforts and achievements
- Developing readable and maintainable JavaScript code
- Optimizing the library for web and mobile platforms
- Providing a JavaScript-friendly API


Documentation


- Documentation Wiki - This is the best place to start, and find other resources
- Examples - Online examples with editable code


Community


- Discord - Community discussions and Q/A
- Twitter @Piqnt - Updates and news
- GitHub - Source code and issues


API and Architecture


Planck.js includes Box2D algorithms without modification and its architecture is very similar to Box2D.
However some internal changes and refactoring are made during rewrite to address differences between C++ and JavaScript.

Planck.js public API closely follows Box2D API, with the following differences:

- b2 prefix is dropped from class names, for example b2World is now available as planck.World.
- Method names are converted from UpperCamelCase to lowerCamelCase.
- Definition classes/objects (BodyDef, FixtureDef, etc.) are replaced by inline JavaScript objects ({}).
- Shapes are considered immutable and are not cloned when used to create fixtures.
- Contact filtering can be customized by overriding shouldCollide method of Fixture.
- Listener classes are replaced with simple functions.
- World#on(eventName, listenerFn) and World#off(eventName, listenerFn) are added to add and remove event listeners. Currently supported events are:
'begin-contact', 'end-contact', 'pre-solve', 'post-solve', 'remove-joint', 'remove-fixture', 'remove-body'


Updates


v1.0-alpha


- Source code is migrated to TypeScript, to improves library usability, documentation and maintenance.

- Package name for v1.0+ is changed to planck. Package name for releases before v1.0 is planck-js.

- planck.internal namespace is deprecated and everything is directly available under main namesapce (except planck.internal.stats).

- Source files are moved to /src directory (from /lib) and directory layout is updated to match Box2D.

- Rollup is used to build the project.


Install


v0.3 (stable release)

To install planck-js@0.3 (stable release) see v0.3 branch.

v1.0 (alpha)

Staring from v1.0 package name is changed to planck.
Releases and updates before v1.0 will remain available under planck-js.

CDN

Planck.js is available on jsDelivr.

NPM

Install npm package.
  1. ```sh
  2. npm install planck
  3. ```

Import it in your code.
  1. ``` js
  2. import * as planck from 'planck';
  3. ```

Testbed

Use CDN in a web page.
  1. ``` html
  2. <html><body>
  3.   <script src="//cdn.jsdelivr.net/npm/planck@latest/dist/planck-with-testbed.min.js"></script>
  4.   <script>
  5.     planck.testbed(function(testbed) {
  6.       // Your testbed code
  7.     });
  8.   </script>
  9. </body></html>
  10. ```

Use NPM package in Node.
  1. ``` js
  2. const planck = require('planck/dist/planck-with-testbed');

  3. planck.testbed(function() {
  4.   // ...
  5. });
  6. ```

Projects


Games

- Astray 2 (source) by Rye Terrell
- Rope (source) by Fernando Serboncini
- I have to flap by Elias Ku
- Hoverator by Jonathon Vogel
- Totem Destroyer by Emanuele Feronato
- Pancake Tower by Aloysius Kieth
- Comeback by Romain Clément
- Space Rage 2 by Hendrik Mans
- Air Hockey (source) by Steve Meredith
- Zzzone! (source) by Jan Engehausen
- Star Fly by Kal Torak

Dynamic Visualization

- Fall / Fill by Jez Swanson
- 1000 Unique Postcards by Andreas Gysin
- Flag in the Wind by Nick Matantsev
- Dynamic Convex Hull by Bo Zheng
- Chaotic Water Wheel by John Hearn

Science and AI

- Handle by Ichiro Maruta
- Q-Learning Ragdoll by Mikko Kämäräinen
- Walking EA by Mats Krüger Svensson
- Neuroevolution Bots by Mishig Davaadorj

Game Development



Credits


Box2D is a popular C++ 2D rigid-body physics engine created by Erin Catto. Box2D is used in several popular games, such as Angry Birds, Limbo and Crayon Physics, as well as game development tools and libraries such as Apple's SpriteKit.

Planck.js is developed and maintained by Ali Shakiba.

TypeScript definitions for planck.js are developed by Oliver Zell.


License