|
- class Box {
- constructor(world, x, y, w, h, options) {
- // add box to physics simulation
- this.physicsBox = Matter.Bodies.rectangle(x, y, w, h, options);
- Matter.Composite.add(world, this.physicsBox);
-
- // add DOM box at the same coordinates
- this.div = document.createElement("box");
- document.body.appendChild(this.div);
- this.div.style.width = w + "px";
- this.div.style.height = h + "px";
- this.width = w;
- this.height = h;
- this.update();
- }
-
- update() {
- let pos = this.physicsBox.position;
- let angle = this.physicsBox.angle;
- let degrees = angle * (180 / Math.PI);
-
- let x = this.physicsBox.bounds.min.x;
- let y = this.physicsBox.bounds.min.y;
- this.div.style.transform = `translate(${x}px, ${y}px) rotate(${degrees}deg)`;
-
- // old uses position
- // this.div.style.transform = `translate(${pos.x - this.width / 2}px, ${pos.y - this.height / 2 }px) rotate(${degrees}deg)`;
- }
- }
-
- let engine;
- let boxes = [];
-
- setupMatter();
- addObjects();
- gameLoop();
-
- function setupMatter() {
- engine = Matter.Engine.create({ enableSleeping: true });
- }
-
- function addObjects() {
- boxes.push(
- new Box(engine.world, 250, 20, 40, 40, { restitution: 0.8 }),
- new Box(engine.world, 300, 350, 40, 40, { restitution: 0.8 }),
- new Box(engine.world, 320, 70, 40, 40, { restitution: 0.8 }),
- new Box(engine.world, 0, 400, 1200, 60, { isStatic: true }),
- new Box(engine.world, 260, 50, 40, 40),
- new Box(engine.world, 330, 300, 40, 40),
- new Box(engine.world, 350, 170, 40, 40),
- new Box(engine.world, 160, 150, 40, 40),
- new Box(engine.world, 190, 300, 40, 40),
- new Box(engine.world, 250, 270, 40, 40),
- );
- }
-
- function gameLoop() {
- // update the physics world
- Matter.Engine.update(engine, 1000 / 60);
- var sleepingCount = 0;
- // update the DOM world
- for (let b of boxes) {
- b.update();
- if (b.physicsBox.isSleeping)
- {
- sleepingCount += 1;
- }
- }
- console.debug("sleeping count:", sleepingCount);
- requestAnimationFrame(() => this.gameLoop());
- }
|