]> git.r.bdr.sh - rbdr/sumo/blobdiff - lib/sumo.js
Add control via keyboard (#6)
[rbdr/sumo] / lib / sumo.js
index da72991982c6ea6831699ac23d3eb005c686d8f4..2b6f085bce02b488a70a4236a1cb4d1825656ea9 100644 (file)
@@ -1,8 +1,30 @@
+import 'babel-polyfill';
+
+// Systems
+import ApplyForceSystem from './systems/apply_force';
+import CreateCouplingLineSystem from './systems/create_coupling_line';
+import ControlMapperSystem from './systems/control_mapper';
+import DashSystem from './systems/dash';
+import ElasticSystem from './systems/elastic';
+import PhysicsWorldControlSystem from './systems/physics_world_control';
+import PhysicsToAttributesSystem from './systems/physics_to_attributes';
+import RenderSystem from './systems/render';
+import AttributesToRenderableSystem from './systems/attributes_to_renderable';
+
+// Factories
+
+import SumoFactory from './factories/sumo';
+
+// External Dependencies
+
 import Serpentity from '@serpentity/serpentity';
+import { Application } from 'pixi.js';
+import { Engine } from 'matter-js';
 
 /* global window document */
 
 const internals = {
+  kBackgroundColor: 0xd8c590,
   kNoElementError: 'No element found. Cannot render.',
 
   // Handler for the window load event. Initializes and runs the app.
@@ -56,6 +78,8 @@ internals.Sumo = class Sumo {
 
     // Initialization functions
     this._initializeCanvas();
+    this._initializeMatter();
+    this._initializePixi();
     this._initializeSystems();
     this._initializeEntities();
   }
@@ -104,7 +128,7 @@ internals.Sumo = class Sumo {
 
       // We're sending the currentTime since it gives better results for
       // this type of renderer, though usually we expect the delta
-      this._engine.update(currentTime);
+      this._engine.update(currentFrameDuration);
       this._previousTime = currentTime;
     }
   }
@@ -119,6 +143,27 @@ internals.Sumo = class Sumo {
     window.addEventListener('resize', this._resizeCanvas.bind(this));
   }
 
+  // Initialize MatterJs
+
+  _initializeMatter() {
+
+    this._matterJs = Engine.create();
+
+    this._matterJs.world.gravity.y = 0;
+  }
+
+  // Initialize Pixi
+
+  _initializePixi() {
+
+    this._pixi = new Application({
+      backgroundColor: internals.kBackgroundColor,
+      view: this._canvas,
+      width: this._canvas.width,
+      height: this._canvas.height
+    });
+  }
+
   // Resizes the canvas to a square the size of the smallest magnitude
   // of the window.
 
@@ -143,12 +188,69 @@ internals.Sumo = class Sumo {
 
   _initializeSystems() {
 
+    this._engine.addSystem(new ControlMapperSystem());
+
+    this._engine.addSystem(new DashSystem());
+
+    this._engine.addSystem(new ApplyForceSystem());
+
+    this._engine.addSystem(new PhysicsWorldControlSystem({
+      engine: this._matterJs
+    }));
+
+    this._engine.addSystem(new ElasticSystem());
+
+    this._engine.addSystem(new PhysicsToAttributesSystem());
+
+    this._engine.addSystem(new AttributesToRenderableSystem());
+
+    this._engine.addSystem(new CreateCouplingLineSystem());
+
+    this._engine.addSystem(new RenderSystem({
+      application: this._pixi
+    }));
   }
 
   // Initializes the serpentity entities
 
   _initializeEntities() {
 
+    const sumoA = SumoFactory.createSumo(null, {
+      position: {
+        x: 50,
+        y: 50
+      }
+    });
+
+    const sumoB = SumoFactory.createControllableSumo(null, {
+      position: {
+        x: 500,
+        y: 78
+      }
+    });
+
+    const harness = SumoFactory.createHarness(null, {
+      position: {
+        x: 309,
+        y: 112
+      }
+    });
+
+    SumoFactory.createRubberBand(this._engine, {
+      entityA: sumoA,
+      entityB: harness
+    });
+
+    SumoFactory.createRubberBand(this._engine, {
+      entityA: sumoB,
+      entityB: harness
+    });
+
+    // To keep the coupling behind, we'll manually add the sumos later
+
+    this._engine.addEntity(sumoA);
+    this._engine.addEntity(sumoB);
+    this._engine.addEntity(harness);
   }
 };