gameloop = {
let n = 0;
let {r, x, xSpeed, y, ySpeed} = mutable ball;
function pauseBall(duration){
mutable ball = {r, x, y, xSpeed, ySpeed}
return Promises.delay(duration, mutable ball)
}
while (!mutable gameover) {
x = x + xSpeed;
y = y + ySpeed;
if (x < r + scale) {
xSpeed = Math.abs(xSpeed);
}
if (x + r > w - scale) {
xSpeed = -Math.abs(xSpeed);
}
if (y < r + scale) {
ySpeed = Math.abs(ySpeed);
}
if (y + r > h) {
ySpeed = -Math.abs(ySpeed);
}
eachBrick(bricks, (brick, row, col) => {
let hit = collide(mutable ball, brick);
if (!hit) return;
bricks[row][col] = null;
(hit == "v") ? ySpeed = -ySpeed : xSpeed = -xSpeed;
mutable scores += brick.points;
return true;
});
let px = mutable paddleX;
if (y + r > h - scale
&& x + r > px
&& x - r < px + paddleLength) {
yield pauseBall(0);
ySpeed = -ySpeed;
xSpeed = ((x - px) / paddleLength - 0.5) * Math.PI * speed;
}
mutable ball = {r, x, y, xSpeed, ySpeed};
if ( y + r > h ) {
mutable gameover = true;
yield pauseBall(3000);
}
yield true;
}
}