Files
UoL/CM2030 Graphics Programming/Topic 4/4.3.5/sketch.js
2021-06-09 19:30:58 -05:00

118 lines
2.9 KiB
JavaScript

// Example is based on examples from:
// http://brm.io/matter-js/
// https://github.com/shiffman/p5-matter
// https://github.com/b-g/p5-matter-examples
// module aliases
let Engine = Matter.Engine;
let Render = Matter.Render;
let World = Matter.World;
let Bodies = Matter.Bodies;
let Constraint = Matter.Constraint;
let engine;
let ground;
let ball1;
let ball2;
let catapult;
let catapultSpacer;
let constraint;
function setup() {
createCanvas(800, 600);
engine = Engine.create(); // create an engine
setupCatapult();
setupBalls();
setupGround();
}
/////////////////////////////////////////////////////////////
function draw() {
background(0);
Engine.update(engine);
drawBalls();
drawCatapult();
drawGround();
}
function mouseClicked() {
if(ball2 == null)
{
ball2 = Bodies.circle(mouseX, mouseY, 50, {density: 0.01});
World.add(engine.world, [ball2]);
}
}
/////////////////////////////////////////////////////////////
function setupCatapult(){
catapult = Bodies.rectangle(width/2, height - 85, width * 0.75, 10);
constraint = Constraint.create({
bodyB: catapult,
pointA: {x: width/2, y: height - 85},
stiffness: 1
});
catapultSpacer = Bodies.rectangle(150, height - 50, 10, 60, {isStatic: true});
World.add(engine.world, [catapult, constraint, catapultSpacer]);
}
/////////////////////////////////////////////////////////////
function drawCatapult(){
fill(255);
drawVertices(catapult.vertices);
fill(255, 0, 0);
drawVertices(catapultSpacer.vertices);
}
/////////////////////////////////////////////////////////////
function setupBalls(){
let radius1 = 15;
ball1 = Bodies.circle(150, height - 50 - 55, radius1);
World.add(engine.world, [ball1]);
}
/////////////////////////////////////////////////////////////
function drawBalls(){
fill(0, 255, 0);
drawVertices(ball1.vertices);
if(ball2 != null)
drawVertices(ball2.vertices);
}
/////////////////////////////////////////////////////////////
function setupGround(){
ground = Bodies.rectangle(400, height-10, 810, 25, {isStatic: true});
World.add(engine.world, [ground]);
}
/////////////////////////////////////////////////////////////
function drawGround(){
noStroke();
fill(128);
drawVertices(ground.vertices);
}
////////////////////////////////////////////////////////////////
// ******* HELPER FUNCTIONS *********
// DO NOT WRITE BELOW HERE
/////////////////////////////////////////////////////////////
function drawVertices(vertices) {
beginShape();
for (let i = 0; i < vertices.length; i++) {
vertex(vertices[i].x, vertices[i].y);
}
endShape(CLOSE);
}
function drawConstraint(constraint) {
var offsetA = constraint.pointA;
var posA = {x:0, y:0};
if (constraint.bodyA) {
posA = constraint.bodyA.position;
}
var offsetB = constraint.pointB;
var posB = {x:0, y:0};
if (constraint.bodyB) {
posB = constraint.bodyB.position;
}
line(
posA.x + offsetA.x,
posA.y + offsetA.y,
posB.x + offsetB.x,
posB.y + offsetB.y
);
}