class GamePlay extends Board { constructor(ctx, key) { super(ctx, key); this.controls = { 'KeyS': ()=>{ this.nextLevel(++this.level); }, 'KeyX': ()=>{ let b = new Ball(); b.update(this.ctx, this.bar.x + this.bar.w/2, this.bar.y); this.balls.push(b); this.balls[this.balls.length - 1].start(); }, 'Space': ()=>{ this.balls[0].moving = true; }, 'KeyN': ()=>{ if(this.lives.get()==0) this.next(1); } } this.gameOver = new GameOver(); this.score = new Score(); this.lives = new Lives(); this.bar = new Bar(ctx, key); this.levels = new Levels(); this.newGame(); } newGame() { this.lives.reset(); this.score.reset(); this.nextLevel(1); } nextLevel(lvl) { this.level = lvl; this.bricks = this.levels.load(lvl); this.bar.reset(); this.balls = []; this.balls.push(new Ball()); } update() { if(this.lives.get()==0) { this.loopStop(); this.gameOver.update(this.ctx); // this.next(2); } else { this.balls = this.balls.filter(ball => { let r = ball.update(this.ctx, this.bar.x + this.bar.w/2, this.bar.y); ball.collide( this.bar.x, this.bar.y, this.bar.x + this.bar.w, this.bar.y + this.bar.h ); this.bricks.forEach(b=>{ if(b.alive){ if ( ball.collide(b.x,b.y,b.x+b.w,b.y+b.h) ) { this.score.add(1); b.alive = false; } }}); return r; } ); if (this.bricks.length==0) { this.nextLevel(++this.level); } if (this.balls.length==0) { if ( !this.lives.lost() ) this.balls.push(new Ball()); } this.bricks = this.bricks.filter(brick => brick.update(this.ctx)); // if ( this.bricks.length == 0 ) this.nextLevel(); this.bar.update(); } this.score.update(this.ctx); this.lives.update(this.ctx); } }