Autor Tema: setTimeout Efectos JavaScript visuales, imagen, texto mover. Recursión CU01166E.  (Leído 5264 veces)

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola,

Citar
EJERCICIO 1
Realiza una descripción de cada una de las instrucciones del código del ejemplo anterior indicando cuál es su cometido. Si has seguido el curso desde el principio, debes ser capaz de interpretar todo el código.
Ejemplo: La primera línea <!DOCTYPE … realiza la declaración de tipo de documento HTML a efectos de que los navegadores interpreten en qué versión de HTML está escrito el código.

Aquí dejo el código comentado:
Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!--realiza la declaración de tipo de documento HTML a
efectos de que los navegadores interpreten en qué versión de HTML está escrito el código-->
<html><!--etiqueta de apertura del código HTML-->
<head><!--etiqueta de apertura de la cabecera del documento-->
<title>Cursos aprende a programar</title><!--título del documento HTML-->
<meta charset="utf-8"><!--indica el juego de caracteres que se debe emplear para interpretar el HTML-->
<meta name="description" content="Aprende a programar con cursos reconocidos por su calidad didáctica"><!--indica a los buscadores el contenido de la página-->
<meta name="keywords" content="HTML, CSS, JavaScript, Java, Visual Basic, Joomla, PHP"><!--indica a los buscadores palabras claves para su localización-->
<style type="text/css"><!--etiqueta de apertura para la definición de estilos CSS-->
*{font-family: verdana, sans-serif;} /*establece para todo el documento un tipo de letra*/
#principal{text-align:center;width:95%; margin: 0 auto;} /*establece para las etiquetas con id="principal" alineación centrada,
ancho del 95% y el margen*/
.tituloCurso {color: white; float:left; padding: 36px 44px; /*establece para las etiquetas con class="tituloCurso" color de la letra, el elemento se desplaza
a la izquierda tanto como es posible, el padding, ...*/
font-size: 2.65em; font-style:bold; text-decoration:none;}/*... tamaño de la letra, letra en negrita y texto sin decoración*/
a:hover{color:orange !important;} /*en los elementos 'a' al pasar el ratón por sobre ellos, el color de texto será orange y al tener
'!important' prebalecerá aunque en otra parte del código diga que el texto debe ir en otro color*/
</style><!--etiqueta de cierre de la definición de estilos CSS-->
<script type="text/javascript"><!--etiqueta de apertura para el código JavaScript-->
function ejemplo(){//Creamos una función de nombre 'ejemplo'.
var nodosTituloCurso = document.querySelectorAll(".tituloCurso");/*creamos la variable 'nodosTituloCurso' que contendrá un array con todos los nodos
que contengan el selector CSS ".tituloCurso".*/
var contador = 0; var nodosCambiados = new Array(); var tocaCambiar = true; /* se crean y se inicializan tres variables, la primera numérica,
la segunda un array y la ultima una booleana*/
setTimeout(function() {ejemploAccion(nodosTituloCurso, nodosCambiados, contador, tocaCambiar)}, 1500); /*cuando pase 1,5 segundos se ejecutará
la función 'ejemploAccion' y le pasaremos los valores de las variables 'nodosTituloCurso', 'nodosCambiados',
'contador' y 'tocaCambiar'.*/
}//cierre de la función 'ejemplo'.
function ejemploAccion(nodosTituloCurso, nodosCambiados, contador, tocaCambiar) {//creamos la función ejemploAccion, que recivirá cuatro parámetros.
if (contador<nodosTituloCurso.length){ // si la variable 'contador' es menor que la cantidad de nodos que hay en la variable 'nodosTituloCurso'.
var indice = Math.floor((Math.random() * (nodosTituloCurso.length)));/*crea la variable 'indice' y se le da un valor aleatorio comprendido entre
cero y el tamaño del array 'nodosTituloCurso'.*/
if (nodosCambiados.length!=0) {  // si la variable 'nodosCambiados' que es un array, contiene un numero de elementos distinto a 0 entrará en la condición.
for (var i=0; i<nodosCambiados.length; i++) {  // bucle for que recorre los elementos del array 'nodosCambiados'.
if(nodosCambiados[i]==indice) {tocaCambiar = false;} /* si el elemento del array 'nodosCambiados' en el que nos econtramos es igual
al contenido de la variable 'indice', 'tocaCambiar' valdrá false.*/
}//cierre del bucle for.
} // cierre de la condición if.
if (tocaCambiar==true) {// si la variable 'tocaCambiar' es igual a true...
cambiarNodo(nodosTituloCurso[indice]);/*llamamos a la función 'cambiarNodo' pasandole como parámetro el elemento del array 'nodosTituloCurso'
con índice valor de la variable 'indice'.*/
nodosCambiados.push(indice); // se añade el valor de la variable 'indice' al array 'nodosCambiados'.
contador = contador+1; // aumentamos el valor de la variable 'contador' en uno.
setTimeout(function() {ejemploAccion(nodosTituloCurso, nodosCambiados, contador, tocaCambiar)}, 1500); /*Cuando pase 1,5 segundos
se ejecutará la función 'ejemploAccion' pasandole como parámetros el contenido de las variables, 'nodosTituloCurso',
'nodosCambiados', 'contador' y 'tocaCambiar'. De esta forma generamos recursión.*/
} else { // si no se cumple la condición del if se hara lo siguiente...
tocaCambiar=true; // la variable tocaCambiar valdrá true
ejemploAccion(nodosTituloCurso, nodosCambiados, contador, tocaCambiar); /* llamos a la función 'ejemploAccion' pasandole los valores de las
cuatro variables situadas entre los parentesis. Generamos recursión.*/
}
}else { //si no se cumple la condición del if anterior, se acaba la recursión y se hará lo siguiente...
   document.body.style.backgroundColor='black'; // se cambia el background del body, quedando en negro.
   document.getElementById('principal').style.color='white'; // el color del texto del elemento con id 'principal' pasará a ser blanco.
   for (var i=0; i<nodosTituloCurso.length; i++) { // bucle for que recorre el array 'nodosTituloCurso'.
nodosTituloCurso[i].style.color='yellow'; // se cambia el color del texto de los elementos que forman el array 'nodosTituloCurso'.
   } // cierre del bucle for     
} // cierre del condicional if
}// cierre de la función 'ejemploAccion'.
function cambiarNodo(elNodo){elNodo.style.backgroundColor = 'black'; } /* función de nombre cambiarNodo, que recive como parámetro un nodo al cuál
se le cambiará el color de fondo, quedando en negro.*/
</script><!--etiqueta que cierra el código JavaScript-->
</head><!--etiqueta de cierre de la cabecera del documento HTML-->
<body onload="ejemplo()"><!--etiqueta de apertura del cuerpo del documento HTML. Cuando se carga el body se llama a la función 'ejemplo()' que está en
mas arriba en el código JavaScript-->
<div id="principal"><h1>Cursos de programación</h1><!--etiqueta de apertura div con id principal y un texto que se muestra como encabezado h1-->
<h3>Reconocidos por su calidad didáctica</h3><!--texto que recive la propiedad de encabezado h3-->
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59"> Fundamentos</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188"> Java</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=69&Itemid=192"> HTML</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=75&Itemid=203"> CSS</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=78&Itemid=206"> JavaScript</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=70&Itemid=193"> PHP</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=38&Itemid=152"> Joomla</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61"> Visual Basic</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59"> Pseudocódigo</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=section&layout=blog&id=7&Itemid=26"> Libros/ebooks</a></div>
<div ><a class="tituloCurso" href="http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=64&Itemid=87">Cursos tutorizados</a></div>
<!--diez div que en su interior tinen un hipervinculo (etiqueta <a></a>)cada uno, que tienen como clase 'tituloCurso'-->
</div><!--cierre del div con id 'principal'-->
</body><!--cierre de la etiqueta boy-->
</html><!--cierre de la etiqueta html-->

Citar
EJERCICIO 2
Crea una animación JavaScript (decide tú el efecto que quieres implementar: pueden ser cosas moviéndose por la pantalla, texto cambiando de tamaño o cualquier otra cosa que se te ocurra) con las herramientas que hemos ido conociendo a lo largo del curso. Ejecútalo en distintos navegadores y comprueba que se ejecute tal y como esperas en todos ellos.

Aquí el código de mi pequeño intento de animación:
Código: [Seleccionar]
<!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; position;relative;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 animacionColocaBolas;
var animacionMuevePalo;
var animacionMueveBola;
var animacionEvitaGolpe;
var animacionAgujeroDesaparece;
var animacionCreceTexto;
var moverPalo;
var 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(){
posicionInicialBolas();
colocarBolas();
moverPalo = setTimeout(function(){muevePalo()}, 15000);
cambiaColor = setTimeout(function(){cambiaColorBolas()}, 3000);
}
function detener() {
cancelAnimationFrame(animacionColocaBolas);
cancelAnimationFrame(muevePalo);
cancelAnimationFrame(evitaGolpe);
cancelAnimationFrame(mueveBolas);
cancelAnimationFrame(animacionMuevePalo);
clearTimeOut(cambiaColor);
clearTimeOut(moverPalo);
}
function animacionTexto(){
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(){
var nodoBola = document.querySelectorAll('.volador');
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(){
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(){
var nodoBola = document.querySelectorAll('.volador');
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);
}
function cambiaColorBolas(){
var nodoBola = document.querySelectorAll('.volador');
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(){
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 == -4){animacionMueveBola = requestAnimationFrame(mueveBolaBlanca);}
}
function agujeroDesaparece(){
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';
setTimeout(function(){animacionTexto()}, 2000);
cancelAnimationFrame(agujeroDesaparece);
}
}
function mueveBolaBlanca(){
var nodoBola = document.querySelectorAll('.volador');
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){
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);
setTimeout(pararAnimacion, 1000);
setTimeout(mueveBolas, 3000);
}
function pararAnimacion(){cancelAnimationFrame(animacionEvitaGolpe);}
}
function evitaGolpe(){
var nodoBola = document.querySelectorAll('.volador');
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() {
var nodoBola = document.querySelectorAll('.volador');
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++){
if(posicionX[i]==contadorX[i]){bolasColocadas++;}
if(posicionY[i]==contadorY[i]){bolasColocadas++;}
}
if(bolasColocadas==30){
detener();
}else{
animacionColocaBolas = requestAnimationFrame(mueveBolas);
}
}
</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>

Utilicé estas lineas para parar los setTimeout:

Código: [Seleccionar]
clearTimeOut(cambiaColor);
clearTimeOut(moverPalo);

pero no paran, ¿porque?

Saludos.
« Última modificación: 07 de Diciembre 2015, 11:33 por Ogramar »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días Pedro

El código del ejercicio 1 está bien comentado, pero aún así no estoy seguro de si te queda claro todo el código. Si tienes alguna duda sobre ese código indícalo.

La animación que has creado está muy bien, has utilizado diversas cosas con lo cual aprovechas todo lo visto a lo largo del curso que era el objetivo del ejercicio.

Sobre el problema que existe por el que la animación no se detiene al pulsar detener, te comento lo que se aprecia si activas la consola en el navegador:

En ejecución normal aparecen estos errores:

Código: [Seleccionar]
ReferenceError: clearTimeOut is not defined prueba.html:51:5
TypeError: nodoBola[i] is undefined prueba.html:99:6

En ejecución pulsando detener aparecen estos errores:

Código: [Seleccionar]
ReferenceError: clearTimeOut is not defined prueba.html:51:5
TypeError: nodoBola[i] is undefined prueba.html:190:6
TypeError: nodoBola[i] is undefined prueba.html:99:6

Habría que estudiar por qué salen esos errores y eliminarlos.

Intenta corregir primero el error de nodoBola[ i ] porque te puede estar interfiriendo en lo demás

Saludos

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola Mario. Gracias por la corrección. Hice unos arreglos y ahora no da ningún error.

Código: [Seleccionar]
<!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.

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días, ahora parece que va todo perfecto y estás logrando algo interesante para los programadores: ser capaces de depurar código.  :)

Ten en cuenta que en la función detener() debes añadir clearTimeout(moverPalo) para que la detención sea completa:

Código: [Seleccionar]
function detener() {
cancelAnimationFrame(animacionColocaBolas);
cancelAnimationFrame(muevePalo);
cancelAnimationFrame(evitaGolpe);
cancelAnimationFrame(mueveBolas);
cancelAnimationFrame(animacionMuevePalo);
clearTimeout(cambiaColor);
clearTimeout(moverPalo);
}

Sin esto parece que hay una detención pero después siguen ejecutándose cosas. Supongo que se quedó fuera por despiste.

Saludos

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola, sí, un despiste, ahora mismo lo soluciono.

Gracias otra vez por tu tiempo.

Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".