{
replay
const canvas = DOM.canvas(width, height);
const engine = Matter.Engine.create();
const world = engine.world;
const renderer = Matter.Render.create({
element: canvas,
engine,
options: {
width,
height,
wireframes: false,
background: 'rgb(255, 255, 255)'
}
});
Matter.Render.run(renderer);
const runner = Matter.Runner.create();
Matter.Runner.run(runner, engine);
Matter.World.add(world, [
Matter.Bodies.rectangle(0, 0, width, 40, {
isStatic: true,
render: { fillStyle: "rgba(200,200,200,1)" }
}),
Matter.Bodies.rectangle(0, height - 10, width, 40, {
isStatic: true,
render: { fillStyle: "rgba(200,200,200,1)" }
}),
Matter.Bodies.rectangle(-width / 2, height / 2, 40, height, {
isStatic: true,
render: { fillStyle: "rgba(200,200,200,1)" }
}),
Matter.Bodies.rectangle(width / 2, height / 2, 40, height, {
isStatic: true,
render: { fillStyle: "rgba(200,200,200,1)" }
})
]);
const bodyOptions = {
frictionAir: 0,
friction: 0.0001,
restitution: 0.8,
render: { fillStyle: "black" }
};
Matter.World.add(
world,
Matter.Composites.stack(-width / 2 + 20, 0, 10, 12, 3, 5, (x, y) =>
Matter.Bodies.circle(x, y, Matter.Common.random(3, 15), bodyOptions)
)
);
Matter.World.add(
world,
Matter.Composites.stack(-width / 2 + 20, 0, 10, 12, 3, 5, (x, y) =>
Matter.Bodies.polygon(
x,
y,
Matter.Common.random(5, 7),
Matter.Common.random(10, 20),
bodyOptions
)
)
);
Matter.Render.lookAt(renderer, Matter.Composite.allBodies(world));
let timeScaleTarget = 1,
counter = 0;
Matter.Events.on(engine, 'afterUpdate', event => {
engine.timing.timeScale +=
(timeScaleTarget - engine.timing.timeScale) * 0.05;
counter += 1;
if (counter >= 150) {
if (timeScaleTarget < 1) {
timeScaleTarget = 1;
} else {
timeScaleTarget = 0.05;
}
explosion(engine);
counter = 0;
}
});
const mouse = Matter.Mouse.create(renderer.canvas),
mouseConstraint = Matter.MouseConstraint.create(engine, {
mouse,
constraint: {
stiffness: 0.2,
render: {
visible: true
}
}
});
Matter.World.add(world, mouseConstraint);
renderer.mouse = mouse;
return html`${renderer.canvas}`;
}