Chaos-engine
This is a 2d game engine with physics,a basic canvas renderer,AI,audio management through web audio,an event system and many more features.
Features of this game engine.
- 
An entity-component-system architecture where entities are made up of components and components are updated by their respective systems.Data-driven systems only.
 - 
An AI system that follows the Craig - Renolds implementation.It provides means to follow a target,evade another entity,follow a path and wandering about in the game world.
 - 
A semi-realistic physics engine that features the following:
-> Collision Masking:Used to allow or disallow physical bodies from colliding with each other.
-> Narrowphase:Provides collision manifold from a given pair of bodies if the bodies are colliding.
-> Broadphase:Used to improve performance of the physics world by calculating pairs of bodies that could possibly be colliding.
-> Distance constraints:Used to constrain two bodies at a certain distance.
-> Static and Dynamic bodies types:Static bodies do not respond to collision with other bodies(due to infinite mass) while dynamic bodies respond to collision forces.
->
Composite bodies:It is a composition of several bodies and constraints.-> Friction:Bodies colliding experience friction between their two surfaces.
-> Sleeping:Bodies at rest do not need to be tested every frame hence are put to "sleep" to improve performance of the physics engine.
-> Querying:The world can be queried to know if bodies are within a certain range(either a bounding-box or bounding-circle).
-> Iterative solving for velocity to improve non-rotational stacking.
-> Shapes:Various convex shapes are supported in the physics engine.
 - 
An event system to provide defined events such as the collision event and user defined events.
 - 
A set of loaders to preload game assets.
 - 
A storage API to store data in cookies,sessions or local storage.
 - 
An input abstraction that normalizes input from the keyboard,mouse and touch on mobile devices.
 - 
A math library with support for 2D vectors.
 
Usage
Download and installation.
In order to get a copy of the engine ,enter the following command on your node project.
npm i chaos-studio
Import it into your project like this:
import * as CHAOS from "chaos-studio"
OR
Get the umd file from the dist folder of the repository, put it in your root directory and add it to your html page like so:
<head>
  <title>Load Example</title>
  <script src="./chaos.umd.js"></script>
</head>
This way,the "CHAOS" module name will be available on the window object.
OR
import the library from unpkg.com like this:
<head>
  <script src="https://unpkg.com/chaos-studio@latest/dist/chaos.umd.js"></script>
</head>
Creating an example
Setup game
Now we can create a small demo. Add this to your html file in the body tag for this example to work
<div id="can"></div>
In your JavaScript file,do this:
//creates a new game manager for us to handle the game's entities.
const game = new CHAOS.Manager()
//we need to draw the entities on the screen.
//that is done through a renderer.
const renderer = new CHAOS.Renderer2D()
//this binds the renderer to html.
//the canvas will be a child to the queried  html element(renderer will attach it to the html element with id of "can")
//CHAOS.Renderer2D.bindTo(renderer,"#can")
//This sets the width and height of the renderer to cover the entire screen.
CHAOS.Renderer2D.setViewport(renderer,innerWidth, innerHeight)
//Enables physics for the game.
game.registerPlugin(new CHAOS.Physics2DPlugin({
  //applies gravity to the physics world.
  gravity:new CHAOS.Vector2(0,900)
}))
//Enables rendering to 2D context of canvas
game.registerPlugin(new CHAOS.Renderer2DPlugin(renderer))
Add a box to the game
So far there is nothing on the screen... Lets fix that.
//Creates an entity on which we can components are added to.
game.create({
  //transform contains the position , orientation and scale of the entity
  "transform": new CHAOS.Transform(renderer.width/2, 300),
  //movable contains components to enable movement i.e velocity and rotation
  "movable": new CHAOS.Movable(),
  //bound is used for broadphase collision detection in the physics engine
  "bound": new CHAOS.BoundingBox(),
  //body is used for physics interaction with other bodies.
  "body": new CHAOS.Box(50, 50),
  //sprite is the object renderered onto the canvas.
  "sprite": new CHAOS.Sprite(
    new CHAOS.BoxGeometry(50, 50),
    new CHAOS.BasicMaterial()
  )
})
Adding ground
Now you should see a box falling into nothingness. Lets add ground it can land on.
const body = new CHAOS.Box(400, 100)
//This makes the body immune to gravity and collisions with other bodies.
CHAOS.Box.setType(body, CHAOS.Box.STATIC)
//Creates an entity that will act as ground.
game.create({
  "transform": new CHAOS.Transform(renderer.width/2, renderer.height - 800),
  "movable": new CHAOS.Movable(),
  "bound": new CHAOS.BoundingBox(),
  "body": body,
  "sprite": new CHAOS.Sprite(
    new CHAOS.BoxGeometry(400, 100),
    new CHAOS.BasicMaterial()
  )
})
**** WARNING ****
This is not yet a stable version hence dont rely on it to make production apps yet.
**** FUTURE WORK ****
- [ ] Add a webgl renderer
 - [ ] Stabilize the collision response to work well with large forces such as (gravity = 10000)
 - [ ] Stabilize rotational stacking in the physics engine
 - [ ] 
Add game state class for managing the game - [x] Add an animation system.
 - [ ] Add tutorials to this game engine
 - [ ] Add appropriate demos to the project and get a website running for them
 - [ ] Add some error handling mechanisms
 - [x] Add Serialization/Deserialization of objects(on the way)
 - [ ]~~ Kinematic bodies~~
 - [x] Collision masking using bits(bit masking)
 - [ ] More AI behaviors.
 - [ ] Add indexedDB to Storage API.
 - [ ] An audio tag fallback to Web audio (if necessary )