yo hice las animaciones con los hilos de setInterval, así se ve cuando pierdes cuando ganas y cuando si haces record
el código esta en mi github por si desean checarlo y la page por si desean probarlo
Introducción
Programemos un juego con JavaScript
Canvas
¿Qué es canvas en JavaScript?
Tamaño del canvas y sus elementos
Canvas responsive
Mapa del juego
¿Qué es un array bidimensional?
Arreglos multidimensionales en JavaScript
Refactor del mapa de juego
Movimientos del jugador
Eventos y botones
Objeto playerPosition
Limpieza de movimientos
No te salgas del mapa
Colisiones
Detectando colisiones fijas
Detectando colisiones con arrays
Victoria: subiendo de nivel
Derrota: perdiendo vidas
Bonus: adictividad
Sistema de vidas y corazones
Sistema de tiempo y puntajes
¿Qué es localStorage?
Guardando records del jugador
Deploy
Depurando errores del juego
Desplegando el juego a GitHub Pages
Próximos pasos
Reto: reinicio del juego
Reto: timeouts de victoria o derrota
¿Quieres un simulador laboral?
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Juan David Castro Gallego
Aportes 22
Preguntas 1
Les comparto, el resultado final de mi juego. 😄
Todo feedback es bienvenido.
Repositorio de GitHub.
Link del juego.
Creo una función showCollision que limpie todo el canvas y muestre un mensaje, cuyo contenido depende de si el jugador aún tiene vidas o no.
function showCollision() {
game.clearRect(0, 0, canvasSize, canvasSize);
game.font = '10px Verdana';
game.textAlign = 'center';
if(lives > 1) {
game.fillText('PERDISTE UNA VIDA, VUELVE A INTENTARLO', canvasSize/2, canvasSize/2);
}
else {
game.fillText('PERDISTE TODAS LAS VIDAS, VUELVE AL INICIO', canvasSize/2, canvasSize/2);
}
}
Luego, dentor de la fiunción movePlayer, en el condicional donde se verifica si hubo colisión, agrego la función showCollision y establezco un setTimeout para que espere un tiempo antes de llamar a la función leverlLost (levelFail para el profesor)
if (enemyCollision) {
console.log('Chocaste contra un enemigo :(');
showCollision();
setTimeout(levelLost, 2000);
}
Después de muchos intentos y ver a otros compañeros así pude resolver el reto de las colisiones y que se mostrase donde había chocado:
else if (bombCollision) {
showCollision();
setTimeout(gameLose, 1000);
}
Dentro de la función de movePlayer en el condicional pude introducir esta función con el setTimeout
.
function showCollision(){
firePos.x = playerPos.x;
firePos.y = playerPos.y;
console.log(firePos.x, firePos.y);
fireExp();
}
function fireExp(){
game.fillText(emojis['BOMB_COLLISION'], firePos.x, firePos.y)
}
Arriba está la función que se llama en movePlayer y esta a su vez llama a otra que ubica en las posiciones del jugador el emoji del fuego, con ello mostrando donde se chocó el jugador.
Acá les comparto algunas de las mejoras que le realicé al juego.
Aquí mi versión del juego. Todavía no he podido resolver el último reto sin que se rompa todo pero el mapa tiene algunos atajos y los encuentros con alienígenas se premian con vidas 😉.
Aquí mi repositorio: https://github.com/ElioDiez/Curso-Videojuego-en-JavaScript
Y aquí el juego: https://eliodiez.github.io/Curso-Videojuego-en-JavaScript/
¡Seguiré intentándolo!
Implemente mensajes en el canvas cada vez que chocas, pierdes o ganas:
GitHub: https://github.com/RedCode-123/Videojuego_JavaScript_2022
Acá dejo mi aporte. Le agregue un par de pantallas extras como por ejemplo el conteo hacia atrás antes de comenzar el game, como también una ventana de Game over y cuando ganas el game.
Repo: https://github.com/crisLeo-P01/proyecto-videogame
Juego: https://crisleo-p01.github.io/proyecto-videogame/
Hola comparto el proyecto. De los retos, el que más me costo es el de posicionar el jugador en el lugar correcto al hacer resize del HTML.
mhgame web del proyecto
repo en GitHub
Muchas gracias. Excelente curso.
Se me ocurrio usar una clase que nombro “inactive” en CSS le agrego display:none.
En mi js luego, en el codigo de las colisiones agrego.
const boom = setInterval(() => {canvas.classList.toggle('inactive'); game.fillText(emojis['BOMB_COLLISION'], collision.x, collision.y)}, 70);
console.warn('BOOOM');
setTimeout(() => {clearInterval(boom); startGame() }, 700);
El canvas desaparece y aparece .
Pruébalo has una colision.
https://orlando0x.github.io/videojuego-con-javascript/
Esta fue mi resolución en base a ver como usar el set interval en los comentarios.
if (enemyCollision) {
showColision();
//espera 1 segundo para empezar la funciona level fail//
setTimeout (levelFail,1000);
}
para que el fuego aparezca y no se vea la calavera hice lo siguiente.
function showColision() {
game.fillText (emojis['BOMB_COLLISION'], playerPosition.x, playerPosition.y);
playerPosition.x = undefined;
playerPosition.y = undefined;
console.log ('choque');
}
Hola 🙋♂️, les comparto mi proyecto:
Dungeon Magician
Inspirado en el juego del Buscaminas
y un rpg 2d tradicional, Dungeon Magician
trata de un mago en busca de gemas encantadas.
Distintas trampas mágicas se encuentran escondidas en el mapa, tienes la habilidad de prever el peligro en un radio de 1 cuadro a tu alrededor si la situación así lo requiera.
.
Esquiva las minas con tu intuición, perspicacia y cumple con tu destino 🧙♂️🌟.
Primera versión
El videojuego ha sido elaborado durante las sesiones del taller de Platzi con HTML🧡, CSS 💙y JavaScript💛 y adicionalmente se han añadido algunas funcionalidades, como:
Incorporación de fuego 🔥 en las colisiones contra las bombas
Contador de tiempo ⏱ en segundos + 2 decimales
Tarjetas interactivas al perder, ganar sin récord y ganar con nuevo récord
Pantalla de inicio del juego 🤠con enlaces a redes sociales
Animación al ganar un nivel y perder vidas 🟠🟡🟢🔵🔴
Pantalla para registrar tus mejores récords.🎖🎖
⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
📌Prueba la demo del juego 🎮
📌Échale un vistazo al repositorio de GitHub
El videojuego ha sido elaborado durante las sesiones del taller de Platzi con HTML🧡, CSS 💙y JavaScript💛 y adicionalmente se han añadido algunas funcionalidades, como:
Funcionalidad | Tutorial |
---|---|
Incorporación de fuego 🔥 en las colisiones contra las bombas | Ver |
Contador de tiempo ⏱ en segundos + 2 decimales | Ver |
Tarjetas interactivas al perder, ganar sin récord y ganar con nuevo récord | Ver |
Pantalla de inicio del juego 🤠 | Ver |
Animación al ganar un nivel 🟠🟡🟢🔵🔴 | Ver |
📌Prueba la demo del juego 🎮 ⭐⭐⭐⭐⭐
📌Échale un vistazo al repositorio de GitHub
📌Échale un vistazo al Taller de Platzi
Mira cómo agregar una animación al subir de nivel
Resultado:
🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵🔵
Paso a paso
🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢
Prueba la demo:
📌Prueba la demo del juego 🎮 ⭐⭐⭐⭐⭐
Dejo mi jueguito después de tomar características como modelos de algunos compañeros logre terminar los retos
Dejo mi juego desplegado
https://manuel15939.github.io/taller-practico-javascript-videogame/
Mi repositorio
https://github.com/manuel15939/taller-practico-javascript-videogame
Cuando haya una colisión entre la calaverita y una bomba lo cambio por una explosión y uso el setTimeout para después retomar el punto de partida inicial del mapa en el que nos encontremos
if(giftCollisionXY){
levelUp();
}else if(bombaCollisionXY){
console.log('Tocaste una bomba');
game.fillText(emojis['EXPLOTION'],playerPosition.x,playerPosition.y);
setTimeout(gameFailed,1000);
}else{
game.fillText(emojis['PLAYER'],playerPosition.x,playerPosition.y);
}
Después de muchos dolores de cabeza, logré hacer:
Si bien hay bastantes cosas para mejorar o añadir a mi código, por ahora mi problema es hacer que las interfaces de los navegadores en los móviles no interfieran con el contenido de la página tapándolo xd
Hay muchas ideas interesantes en la sección de comentarios, haré mi idea, pero aprenderá de las demás!
Pude agregar las colisiones usando
//Comparar la colisión con las bombas
for (let i = 0; i < bombitas.length; i++) {
if((positionJugador.x).toFixed(3) == (bombitas[i].positionX).toFixed(3) && (positionJugador.y).toFixed(3) == (bombitas[i].positionY).toFixed(3)){
console.log("Boom!!! REVENTASTE");
game.clearRect(bombitas[i].positionX-elementsSize,bombitas[i].positionY-elementsSize,elementsSize,elementsSize);//borrar en donde hubo colision
game.fillText(emojis["BOMB_COLLISION"],bombitas[i].positionX,bombitas[i].positionY);//insertar emoji colision
setTimeout(failed,1000);
}
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?