]> git.r.bdr.sh - rbdr/sumo/blobdiff - lib/systems/physics_world_control.js
Add Grab System (#9)
[rbdr/sumo] / lib / systems / physics_world_control.js
index daa39c130f07366f118a92eae89770e1de64f3b3..370701eca7d92a077af8fb919d973e6a61f5cc71 100644 (file)
@@ -2,6 +2,7 @@ import { System } from '@serpentity/serpentity';
 import { Engine, World } from 'matter-js';
 
 import PhysicalNode from '../nodes/physical';
+import GrabAreaNode from '../nodes/grab_area';
 
 const internals = {
   kNoEngine: 'No matter js physics engine found. Make sure you set the `engine` key in the config object when initializing.'
@@ -56,6 +57,8 @@ export default class PhysicsWorldControlSystem extends System {
   added(engine) {
 
     this.physicalEntities = engine.getNodes(PhysicalNode);
+    this.grabAreaEntities = engine.getNodes(GrabAreaNode);
+
     this.physicalEntities.on('nodeAdded', (event) => {
 
       World.add(this.engine.world, [event.node.body.body]);
@@ -64,6 +67,15 @@ export default class PhysicsWorldControlSystem extends System {
 
       World.remove(this.engine.world, [event.node.body.body]);
     });
+
+    this.grabAreaEntities.on('nodeAdded', (event) => {
+
+      World.add(this.engine.world, [event.node.grabArea.area]);
+    });
+    this.grabAreaEntities.on('nodeRemoved', (event) => {
+
+      World.remove(this.engine.world, [event.node.grabArea.area]);
+    });
   }
 
   /**
@@ -78,6 +90,10 @@ export default class PhysicsWorldControlSystem extends System {
     this.physicalEntities.removeAllListeners('nodeAdded');
     this.physicalEntities.removeAllListeners('nodeRemoved');
     this.physicalEntities = null;
+
+    this.grabAreaEntities.removeAllListeners('nodeAdded');
+    this.grabAreaEntities.removeAllListeners('nodeRemoved');
+    this.grabAreaEntities = null;
   }
 
   /**
@@ -91,8 +107,7 @@ export default class PhysicsWorldControlSystem extends System {
    */
   update(currentFrameDuration) {
 
-    Engine.run(this.engine);
+    Engine.update(this.engine, currentFrameDuration);
   }
 };
 
-