Hola Mario. Gracias por la corrección. Hice unos arreglos y ahora no da ningún error.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ejemplo aprenderaprogramar.com</title><meta charset="utf-8">
<style type="text/css">
button {margin:10px;}
.volador{border: solid 1px; width: 20px; text-align: center; padding:15px;
color: yellow; border-radius: 40px; background: purple; position: absolute; }
#volador0{top: 300px; left: 200px;}
.contenedor{border: solid 2px; width: 100%; background-color: grey;}
#contenedor1{height: 400px;}
#contenedor2{height: 100px;}
#palo{width: 200px; border: solid 4px black; position: absolute; top: 320px; left: -50px;}
#agujero{width: 0; height: 0; text-align: center; padding:15px; border-radius: 40px; background: black; position: absolute; display:none;}
</style>
<script type="text/javascript">
window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame || window.oRequestAnimationFrame;
var nodoBola;
var animacionColocaBolas, animacionMuevePalo, animacionMueveBola, animacionEvitaGolpe, animacionAgujeroDesaparece, animacionCreceTexto;
var moverPalo, cambiaColor;
var ejeXInicial = [];var ejeYInicial = [];var contadorX = [];var contadorY = [];var posicionX = [];var posicionY = [];
var posicionXPalo = -50;
var direccionPalo = false;
var posicionXBolaBlanca = 200;
var sizeAgujero = 0;
var sizeTexto = 0;
function comenzarAnimacion(){
nodoBola = document.querySelectorAll('.volador');
posicionInicialBolas();
colocarBolas();
moverPalo = setTimeout(function(){muevePalo()}, 14000);
cambiaColor = setTimeout(function(){cambiaColorBolas()}, 3000);
}
function detener() {
cancelAnimationFrame(animacionColocaBolas);
cancelAnimationFrame(muevePalo);
cancelAnimationFrame(evitaGolpe);
cancelAnimationFrame(mueveBolas);
cancelAnimationFrame(animacionMuevePalo);
clearTimeout(cambiaColor);
//clearInterval(cambiaColor);
}
function animacionTexto(){ // Función que se encarga de la animacion que hace aparecer el texto 'game over' haciendolo cecer.
document.getElementById('contenedor1').style.fontSize = sizeTexto + 'px';
document.getElementById('contenedor1').style.color = 'white';
document.getElementById('contenedor1').style.textAlign = 'center';
document.getElementById('contenedor1').innerHTML = 'Game over!!';
sizeTexto++;
animacionCreceTexto = requestAnimationFrame(animacionTexto);
if(sizeTexto==100){
cancelAnimationFrame(animacionCreceTexto);
}
}
function posicionInicialBolas(){ // esta función asigna las coordenadas a cada bola
for(var i=1; i<nodoBola.length; i++){
var coordenadas = coordenadasAleatorias();
nodoBola[i].style.left = coordenadas[0] + 'px';
nodoBola[i].style.top = coordenadas[1] + 'px';
ejeXInicial[i-1] = coordenadas[0];
ejeYInicial[i-1] = coordenadas[1];
}
function coordenadasAleatorias(){ // aquí se generan las coordenadas aleatoriamente
var eje = [];
eje[0] = Math.round(Math.random()*(100-700)+parseInt(700));
eje[1] = Math.round(Math.random()*(120-480)+parseInt(480));
return eje;
}
}
function colocarBolas(){ // esta función contiene las coordenadas hasta donde tendrán que moverse las bolas, para quedar colocadas.
var posX = Number(document.body.clientWidth) - 100;
posicionX = [(posX-200), (posX-150), (posX-150), (posX-100), (posX-100), (posX-100), (posX-50), (posX-50), (posX-50), (posX-50),
posX, posX, posX, posX, posX];
posicionY = [300, 275, 325, 250, 300, 350, 225, 275, 325, 375, 200, 250, 300, 350, 400];
for(var i=0; i<15; i++){
contadorX[i] = ejeXInicial[i];
contadorY[i] = ejeYInicial[i];
}
animacionColocaBolas = requestAnimationFrame(mueveBolas);// desde aquí empzamos a mover las bolas llamando a la función mueveBolas
}
function cambiaColorBolas(){ // funcion que se encarga de cambiar el color de las bolas aleatoriamente.
var colores = ['maroon', 'red', 'orange', 'Gold', 'olive', 'Crimson', 'aqua', 'lime', 'green', 'navy',
'blue', 'LawnGreen','salmon', 'teal', 'silver', 'gray'];
var indice = Math.round(Math.random()*(0-14)+parseInt(14));
for(i=1; i<16; i++){
nodoBola[i].style.backgroundColor = colores[indice];
if(indice<(colores.length-2)){
indice++;
}else{
indice = 0;
}
}
cambiaColor = setTimeout(function(){cambiaColorBolas()}, 3000);
}
function muevePalo(){ // esta función se encarga de la animación que mueve el palo.
if(posicionXPalo == -150){direccionPalo=true;}
if(direccionPalo){
posicionXPalo+=2;
}else{
posicionXPalo--;
}
if(posicionXPalo==0){
cancelAnimationFrame(muevePalo);
}else{
document.getElementById('palo').style.left = posicionXPalo + 'px';
animacionMuevePalo = requestAnimationFrame(muevePalo);
}
if(posicionXPalo == -6){animacionMueveBola = requestAnimationFrame(mueveBolaBlanca);}
}
function agujeroDesaparece(){ // función que hace desaparer el supuesto agujero que se traga la bola 'JS'.
if(sizeAgujero>0){
document.getElementById('agujero').style.width = sizeAgujero + 'px';
document.getElementById('agujero').style.height = sizeAgujero + 'px';
sizeAgujero--;
animacionAgujeroDesaparece = requestAnimationFrame(agujeroDesaparece);
}else{
document.getElementById('agujero').style.display = 'none';
clearInterval(cambiaColor);
setTimeout(function(){animacionTexto()}, 2000);
cancelAnimationFrame(agujeroDesaparece);
}
}
function mueveBolaBlanca(){ // función que hace moverse la bola 'JS'
if(posicionXBolaBlanca>(Number(document.body.clientWidth)-50)){
nodoBola[0].style.display = 'none';
animacionAgujeroDesaparece = requestAnimationFrame(agujeroDesaparece);
cancelAnimationFrame(animacionMueveBola);
} else {
posicionXBolaBlanca+=2;
nodoBola[0].style.left = posicionXBolaBlanca + 'px';
animacionMueveBola = requestAnimationFrame(mueveBolaBlanca);
}
if(posicionXBolaBlanca==Number(document.body.clientWidth)-200 || posicionXBolaBlanca==Number(document.body.clientWidth)-199){
document.getElementById('agujero').style.left = (Number(document.body.clientWidth)-48) + 'px';
document.getElementById('agujero').style.top = 300 + 'px';
document.getElementById('agujero').style.display = 'block';
sizeAgujero++;
}
if(sizeAgujero>0 && sizeAgujero<23){
document.getElementById('agujero').style.width = sizeAgujero + 'px';
document.getElementById('agujero').style.height = sizeAgujero + 'px';
sizeAgujero++;
}
if(posicionXBolaBlanca==(Number(document.body.clientWidth)-450) || posicionXBolaBlanca==(Number(document.body.clientWidth)-449)){
animacionEvitaGolpe = requestAnimationFrame(evitaGolpe); // iniciamos la animacion que aparta las bolas.
setTimeout(pararAnimacion, 1000); // cuando pasa un segundo ejecutamos la función que para la animación anterior.
setTimeout(mueveBolas, 3000); // cuando pasan 3 segundos llamamos a la función mueveBolas para que se vuelvan a colocar las bolas en su sitio.
}
function pararAnimacion(){cancelAnimationFrame(animacionEvitaGolpe);}
}
function evitaGolpe(){ // función que hace que las bolas del 1 al 15 dejen paso a la bola 'JS' desplazandose verticalmente.
var sumaOResta = [-1, -1, 1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1];
for (var i = 0; i<sumaOResta.length; i++){
contadorY[i] = contadorY[i] + sumaOResta[i]
nodoBola[i+1].style.top = contadorY[i] + 'px';
}
animacionEvitaGolpe = requestAnimationFrame(evitaGolpe);
}
function mueveBolas() { // esta función mueve las bolas de la 1 a la 15
for(var i=1; i<16; i++){
if(posicionX[i-1]!=contadorX[i-1]){
if(posicionX[i-1]<contadorX[i-1]){
contadorX[i-1]--;
}else{
contadorX[i-1]++;
}
}
if(posicionY[i-1]!=contadorY[i-1]){
if(posicionY[i-1]<contadorY[i-1]){
contadorY[i-1]--;
}else{
contadorY[i-1]++;
}
}
nodoBola[i].style.left = contadorX[i-1] + 'px';
nodoBola[i].style.top = contadorY[i-1] + 'px';
}
var bolasColocadas = 0;
for(var i=0; i<posicionX.length; i++){ // este bucle es usado para comprobar que las bolas están colocadas
if(posicionX[i]==contadorX[i]){bolasColocadas++;}
if(posicionY[i]==contadorY[i]){bolasColocadas++;}
}
if(bolasColocadas==30){ // si todas las bolas estan colocadas.
detener(); // pararemos la animación.
}else{
animacionColocaBolas = requestAnimationFrame(mueveBolas); // sino, volvemos a ejecutar la animación de forma recursiva.
}
}
</script>
</head>
<body >
<div class="contenedor" id="contenedor2">
<div><button id="start" onclick="comenzarAnimacion()">Empezar</button><button id="stop" onclick = "detener()">Detener</button></div>
<div id="posicionDiv" ></div><div id="posicionDiv1"></div><div id="displayReloj"></div>
</div>
<div class="contenedor" id="contenedor1">
<div id="volador0" class="volador">JS</div>
<div id="volador1" class="volador">1</div>
<div id="volador2" class="volador">2</div>
<div id="volador3" class="volador">3</div>
<div id="volador4" class="volador">4</div>
<div id="volador5" class="volador">5</div>
<div id="volador6" class="volador">6</div>
<div id="volador7" class="volador">7</div>
<div id="volador8" class="volador">8</div>
<div id="volador9" class="volador">9</div>
<div id="volador10" class="volador">10</div>
<div id="volador11" class="volador">11</div>
<div id="volador12" class="volador">12</div>
<div id="volador13" class="volador">13</div>
<div id="volador14" class="volador">14</div>
<div id="volador15" class="volador">15</div>
<div id="agujero"></div>
<div id="palo"></div>
</div>
</body>
</html>
Saludos.