Eksperyment, który widzisz powyżej być może jest zupełnie bezcelowy, ale jest to interesujące piętnastominutowe ćwiczenie programistyczne owocujące czymś, co fajnie się ogląda przez piętnaście sekund.
Jeżeli nadal to czytasz, to widocznie uznałeś ten stosunek za akceptowalny, więc przeanalizujmy kod.
.
Linie [1-20] to tylko standardowe odpalenie Matter.js.
[26-45] główna funkcja animacji, która obraca prostokąty [21-26] i przesuwa półkę do góry [28-32] lub w dół [33-36], jeżeli dotarła ona na szczyt .
[29-30] określ kierunek obrotu (zgodnie lub przeciwnie do obrotu zegara). Byłoby prościej napisać
, ale to nie zadziała, jeżeli zwiększysz liczbę wierszy obracających się prostokątów (spróbuj zmienić 4 na 6 w [65]).
[47-55] dodaj nowe koło lub kwadrat (50% prawodopodobieństwa) po każdym kliknięciu.
<html> |
<body> |
<script src = 'matter.min.js'> </script> |
<script> |
let Engine = Matter.Engine, |
Render = Matter.Render, |
World = Matter.World, |
Bodies = Matter.Bodies, |
Body = Matter.Body; |
let engine = Engine.create(); |
let render = Render.create({ |
element: document.body, |
engine: engine, |
options: { |
wireframes: false |
} |
}); |
let world = engine.world; |
Engine.run(engine); |
Render.run(render); |
|
const width = 50, |
height = 10, |
gap = 100; |
|
function animate() { |
let direction; |
for (let i = 0; i < rectangles.length; i++) { |
if (Math.floor(i / 20) % 2) direction = -1; |
else direction = 1; |
Body.rotate(rectangles[i], direction * .05) |
}; |
|
for (let i = 0; i < shelves.length; i++) { |
Body.translate(shelves[i], { |
x: 0, |
y: -1 |
}); |
if (shelves[i].position.y < 0) Body.translate(shelves[i], { |
x: 0, |
y: 600 |
}); |
} |
window.requestAnimationFrame(animate); |
} |
|
let canvas = document.getElementById('myCanvas'); |
canvas.onclick = function() { |
let object; |
if (Math.random() > .5) |
object = Bodies.circle(200, 0, 20) |
else |
object = Bodies.rectangle(200, 0, 30, 30); |
World.add(engine.world, object); |
} |
|
const rectangles = []; |
let shelves = []; |
for (let i = 0; i < 4; i++) { |
rectangle = Bodies.rectangle(50, i * 150, width, height, { |
isStatic: true |
}); |
shelves.push(rectangle); |
} |
for (let rows = 2; rows < 4; rows++) |
for (let i = 2; i < 12; i++) { |
let rectangle = Bodies.rectangle(i * width + gap * (rows % 2), rows * gap, width, height, { |
isStatic: true |
}); |
let rectangle2 = Bodies.rectangle(i * width + gap * (rows % 2), rows * gap, height, width, { |
isStatic: true |
}); |
rectangles.push(rectangle, rectangle2); |
} |
|
World.add(world, shelves); |
World.add(engine.world, rectangles); |
|
World.add(engine.world, [ |
Bodies.rectangle(125, 520, 100, 10, { |
isStatic: true, |
angle: -Math.PI * 0.14 |
}), |
Bodies.rectangle(20, 300, 10, 600, { |
isStatic: true |
}), |
Bodies.rectangle(65, 100, 100, 10, { |
isStatic: true, |
angle: -Math.PI * 0.14 |
}), |
]); |
|
window.requestAnimationFrame(animate); |
|
</script></body></html> |