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 )