Lucas Monteiro Lucchesi, eu fiz um codigo parecido, porém não atende uns quesitos, mas eu acho que vai mesma ideai. De uma olhada:
<!DOCTYPE html>
<html>
<head>
<title>Logica Programação</title>
<meta charset="UTF-8">
</head>
<body>
<canvas id="tela" width="600" height="400">
</canvas>
</body>
<script>
/*
* Bola se deslocando no eixo X, de 0 até o limite;
* Eixo y=100, ao longo de todo trajeto.
* Raio da bola cresça(++) de 1 até 50 e quando raio== 50, que volte a diminuir(--) até
* raio==1.
* mantenha esse loop de cresce/encolhe
* Preciso que o programa dispare a função de crescimento quando raio==1, que dispare a
* função de encolhimento quando raio==50 e que fique nesse loop.
*
* Esse codigo foi feito de maneira rapida, podemos reaproveitar muitas partes,
* porém espero ter atendido o objetivo.
**/
var tela = document.getElementById("tela");
var widthCanvas = tela.getAttribute("width");
var c = tela.getContext("2d");
// Função que aumenta o raio!
function aumentaRaio(widthCanvas, limiteRaio) {
// Precisamos saber o tamanho width do canvas, e um limite de raio no seu caso 50.
var i = 0;
var h = setInterval(function() {
c.clearRect(0, 0, widthCanvas, tela.getAttribute("height")); // limpamos para os proximo quadros
c.beginPath();
c.arc(i, 100, i/(widthCanvas/limiteRaio), 0, 2 * Math.PI);
c.fillStyle = "blue";
c.fill();
if( i == (widthCanvas-limiteRaio)) {
// Se i for igual a largura do canvas - limite do raio (ou seja bolinha visivel!).
clearInterval(h); // limpamos esse setInterval que deixamos na variavel h.
diminueRaio(widthCanvas, limiteRaio); // e logo disparamos o diminueRaio.
}
i++;
}, 1);
};
function diminueRaio(widthCanvas, limiteRaio) {
// Precisamos saber o tamanho width do canvas, e um limite de raio no seu caso 50.
var i = (widthCanvas-limiteRaio); //Eixo x = no maximo do limite da largura mas a bolinha visivel.
var h = setInterval(function() {
c.clearRect(0, 0, widthCanvas, tela.getAttribute("height"));
i--;
if( i == 0) {
clearInterval(h);
c.beginPath();
c.arc(i, 100, 1, 0, 2 * Math.PI);
c.fillStyle = "blue";
c.fill();
aumentaRaio(widthCanvas, limiteRaio);
}
c.beginPath();
c.arc(i, 100, i/(widthCanvas/limiteRaio), 0, 2 * Math.PI);
c.fillStyle = "blue";
c.fill();
}, 1);
};
// Somente precisamos chamar uma função. Podemos começar diminuindo ou aumentando tanto faz.
diminueRaio(widthCanvas, 50);
</script>
</html>