class Scene { // boid radius // no of boids // scene width // scene height constructor(boid_radius, no_of_boids) { this.boid_radius = boid_radius; this.no_of_boids = no_of_boids; this.boids = []; this.gameArea = {}; this.started = false; this.width = 600; this.height = 600; this.initGameArea(); this.initBoids(); } initBoids() { let boids = []; for (let i = 0; i < this.no_of_boids; i++) { boids.push(new Boid( this.boid_radius, "black", // 300, 300, 90, parseFloat(Number(Math.random() * (this.gameArea.canvas.width - 100) + 50).toFixed(1)), parseFloat(Number(Math.random() * (this.gameArea.canvas.height - 100) + 50).toFixed(1)), parseFloat(Number(Math.random() * 360).toFixed(2)), i, this.width, this.height )); } this.boids = boids; } initGameArea() { this.gameArea = new GameArea(this.width, this.height); this.gameArea.init() } start() { if (this.started) { return; } // Kinda annoying, setInterval is a piece of shite and is always run from global scope // Therefore "this.update" will be undefined unless we bind it const updateMe = this.update.bind(this); this.interval = setInterval(updateMe, 20); // updateMe(); this.started = true; } update() { if (!this.started) { return; } this.gameArea.clear(); for (let i = 0; i < this.boids.length; i++) { let result = this.boids[i].move(this.boids); this.boids[i].draw(this.gameArea.context); if (!result) { continue; } } return true; } stop() { if (!this.started) { return; } clearInterval(this.interval); this.interval = null; this.started = false; } reset() { if (this.started) { this.stop(); } this.boids = new Array; this.initBoids(); this.gameArea.clear(); this.started = false; } }