You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.2 KiB
JavaScript
166 lines
4.2 KiB
JavaScript
"use strict"
|
|
let fps = 0;
|
|
const logicTickRate_ms = 100;
|
|
|
|
//Rending the
|
|
const render = (time) => {
|
|
fps += 1;
|
|
ctx.clearRect(0,0, c.width, c.height);
|
|
drawables.forEach(d => {
|
|
ctx.save();
|
|
d.draw(d, ctx);
|
|
ctx.restore();
|
|
});
|
|
}
|
|
|
|
const renderLoop = (time) => {
|
|
requestAnimationFrame(renderLoop);
|
|
render(time);
|
|
}
|
|
|
|
const logicLoop = () => {
|
|
// Update the world state.
|
|
|
|
//Iterate over drawables, and do something fun with them
|
|
drawables = drawables
|
|
.map((d) => {
|
|
switch(d.name)
|
|
{
|
|
case "bug":
|
|
//jiggle the bug
|
|
return {
|
|
...d,
|
|
position: {
|
|
x: clamp(d.position.x + randomIntInclusive(-5, 5), 0, c.width - d.width),
|
|
y: clamp(d.position.y + randomIntInclusive(-5, 5), 0, c.height - d.height)
|
|
}
|
|
}
|
|
case "bouncer":
|
|
//Bounces around like the dvd logo.
|
|
return {
|
|
...d,
|
|
position: dvdBounce(d)
|
|
}
|
|
default:
|
|
return d;
|
|
}
|
|
});
|
|
|
|
function dvdBounce(drawable){
|
|
if((drawable.position.x) <= 0){
|
|
drawable.direction[0] = 1;
|
|
}
|
|
if((drawable.position.x + drawable.size) >= c.width){
|
|
drawable.direction[0] = -1;
|
|
}
|
|
if((drawable.position.y) <= 0){
|
|
drawable.direction[1] = 1;
|
|
}
|
|
if((drawable.position.y + drawable.size) >= c.height){
|
|
drawable.direction[1] = -1;
|
|
}
|
|
|
|
|
|
return {
|
|
x: drawable.position.x + (drawable.direction[0] * drawable.speed),
|
|
y: drawable.position.y + (drawable.direction[1] * drawable.speed)
|
|
}
|
|
}
|
|
|
|
setTimeout(logicLoop, logicTickRate_ms)
|
|
}
|
|
|
|
//Print debugging info
|
|
setInterval(()=> {
|
|
document.getElementById("FPS").textContent = `FPS: ${fps}`;
|
|
fps = 0;
|
|
}, 1000, fps)
|
|
|
|
// ================== //
|
|
// Events
|
|
window.onresize = (event) =>{
|
|
fixCanvasStyle(c);
|
|
}
|
|
const addBug = () => {
|
|
drawables.push({
|
|
name: "bug",
|
|
position: {
|
|
x: randomIntInclusive(0, c.width),
|
|
y: randomIntInclusive(0, c.height)
|
|
},
|
|
width: 10,
|
|
height: 15,
|
|
draw: (self, ctx) => ctx.fillRect(self.position.x, self.position.y, self.width, self.height)
|
|
});
|
|
}
|
|
const addBouncer = () => {
|
|
drawables.push({
|
|
name: "bouncer",
|
|
position: {
|
|
x: randomIntInclusive(0, c.width),
|
|
y: randomIntInclusive(0, c.height)
|
|
},
|
|
size: 30,
|
|
colour: "#f22",
|
|
speed: 10,
|
|
direction: [1,1], //Vector x,y
|
|
draw: (self, ctx) =>{
|
|
ctx.fillStyle = self.colour;
|
|
ctx.fillRect(self.position.x, self.position.y, self.size, self.size)
|
|
}
|
|
|
|
});
|
|
}
|
|
|
|
// ================== //
|
|
// Utils
|
|
function randomIntInclusive(min, max) {
|
|
min = Math.ceil(min);
|
|
max = Math.floor(max);
|
|
return Math.floor(Math.random() * (max - min + 1) + min); //The maximum is inclusive and the minimum is inclusive
|
|
}
|
|
function fixCanvasStyle(canvas){
|
|
//Canvas met een hoogte/breedte gezet via css schaalt het canvas naar de juiste groote
|
|
// met deze functie vergroot je het aantal pixels in het canvas.
|
|
const cStyle = getComputedStyle(canvas);
|
|
const stripNonDidgits = /[^\d.-]/g;
|
|
|
|
canvas.height = cStyle.height.replace(stripNonDidgits,'')
|
|
canvas.width = cStyle.width.replace(stripNonDidgits,'')
|
|
}
|
|
function clamp(value, min, max){
|
|
if(value > max) return max;
|
|
if(value < min) return min;
|
|
return value;
|
|
}
|
|
|
|
|
|
// ================== //
|
|
// Setup
|
|
|
|
// The array containing all our drawable objects.
|
|
let drawables = [{
|
|
name: "wall",
|
|
position: {
|
|
x: 100,
|
|
y: 140
|
|
},
|
|
thickness: 10,
|
|
draw: ()=>{}
|
|
}]
|
|
|
|
const c = document.getElementById("c") // The canvas
|
|
const ctx = c.getContext('2d'); // The rendering context of the canvas
|
|
fixCanvasStyle(c);
|
|
|
|
// Add a couple moving things for fun
|
|
addBug();
|
|
addBug();
|
|
addBug();
|
|
addBouncer();
|
|
addBouncer();
|
|
|
|
//start de logic & rendering loops
|
|
logicLoop();
|
|
window.requestAnimationFrame(renderLoop);
|