From bc07f56a94c70b6ce78cd8d8dc43dd7922678519 Mon Sep 17 00:00:00 2001 From: liabru Date: Sun, 12 Dec 2021 13:19:37 +0000 Subject: [PATCH] added example for Composite.remove --- examples/index.js | 1 + examples/remove.js | 138 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 examples/remove.js diff --git a/examples/index.js b/examples/index.js index e11d4e9..bee420f 100644 --- a/examples/index.js +++ b/examples/index.js @@ -27,6 +27,7 @@ module.exports = { raycasting: require('./raycasting.js'), restitution: require('./restitution.js'), rounded: require('./rounded.js'), + remove: require('./remove.js'), sensors: require('./sensors.js'), sleeping: require('./sleeping.js'), slingshot: require('./slingshot.js'), diff --git a/examples/remove.js b/examples/remove.js new file mode 100644 index 0000000..6fac386 --- /dev/null +++ b/examples/remove.js @@ -0,0 +1,138 @@ +var Example = Example || {}; + +Example.remove = function() { + var Engine = Matter.Engine, + Render = Matter.Render, + Runner = Matter.Runner, + Composites = Matter.Composites, + Common = Matter.Common, + MouseConstraint = Matter.MouseConstraint, + Mouse = Matter.Mouse, + Composite = Matter.Composite, + Bodies = Matter.Bodies, + Events = Matter.Events; + + // create engine + var engine = Engine.create(), + world = engine.world; + + // create renderer + var render = Render.create({ + element: document.body, + engine: engine, + options: { + width: 800, + height: 600, + showAngleIndicator: true, + } + }); + + Render.run(render); + + // create runner + var runner = Runner.create(); + Runner.run(runner, engine); + + var stack = null, + updateCount = 0; + + var createStack = function() { + return Composites.stack(20, 20, 10, 5, 0, 0, function(x, y) { + var sides = Math.round(Common.random(1, 8)); + + // round the edges of some bodies + var chamfer = null; + if (sides > 2 && Common.random() > 0.7) { + chamfer = { + radius: 10 + }; + } + + switch (Math.round(Common.random(0, 1))) { + case 0: + if (Common.random() < 0.8) { + return Bodies.rectangle(x, y, Common.random(25, 50), Common.random(25, 50), { chamfer: chamfer }); + } else { + return Bodies.rectangle(x, y, Common.random(80, 120), Common.random(25, 30), { chamfer: chamfer }); + } + case 1: + return Bodies.polygon(x, y, sides, Common.random(25, 50), { chamfer: chamfer }); + } + }); + }; + + // add and remove stacks every few updates + Events.on(engine, 'afterUpdate', function() { + // limit rate + if (stack && updateCount <= 50) { + updateCount += 1; + return; + } + + updateCount = 0; + + // remove last stack + if (stack) { + Composite.remove(world, stack); + } + + // create a new stack + stack = createStack(); + + // add the new stack + Composite.add(world, stack); + }); + + // add another stack that will not be removed + Composite.add(world, createStack()); + + Composite.add(world, [ + // walls + Bodies.rectangle(400, 0, 800, 50, { isStatic: true }), + Bodies.rectangle(400, 600, 800, 50, { isStatic: true }), + Bodies.rectangle(800, 300, 50, 600, { isStatic: true }), + Bodies.rectangle(0, 300, 50, 600, { isStatic: true }) + ]); + + // add mouse control + var mouse = Mouse.create(render.canvas), + mouseConstraint = MouseConstraint.create(engine, { + mouse: mouse, + constraint: { + stiffness: 0.2, + render: { + visible: false + } + } + }); + + Composite.add(world, mouseConstraint); + + // keep the mouse in sync with rendering + render.mouse = mouse; + + // fit the render viewport to the scene + Render.lookAt(render, { + min: { x: 0, y: 0 }, + max: { x: 800, y: 600 } + }); + + // context for MatterTools.Demo + return { + engine: engine, + runner: runner, + render: render, + canvas: render.canvas, + stop: function() { + Matter.Render.stop(render); + Matter.Runner.stop(runner); + } + }; +}; + +Example.remove.title = 'Composite Remove'; +Example.remove.for = '>=0.14.2'; + +if (typeof module !== 'undefined') { + module.exports = Example.remove; +}