Estoy jugando con un clon de bomberman para aprender a desarrollar juegos.
Hasta ahora he hecho mosaicos, movimiento, detección de colisión y recogida de artículos. También tengo pseudo bombardeo (solo gráficos y colisión, sin funcionalidad real).
Hice un jsFiddle del juego con la funcionalidad que tengo actualmente. Sin embargo, el código en el violín es muy feo. Desplácese por el mapa y encontrará cómo coloco bombas.
De todos modos, lo que me gustaría hacer es un objeto que tenga información general sobre bombas como:
function Bomb(){
this.radius = player.bombRadius;
this.placeBomb = function (){
if(player.bombs != 0){
// place bomb
}
}
this.explosion = function (){
// Explosion
}
}
Sin embargo, no sé cómo encajarlo en el código. Cada vez que coloco una bomba, ¿debo hacerla var bomb = new Bomb();
o necesito tenerla constantemente en el script para poder acceder a ella?
¿Cómo hace daño la bomba? ¿Es tan simple como hacer X, Y en todas las direcciones hasta que el radio se agote o el objeto lo detenga? ¿Puedo usar algo como setTimeout (bomb.explosion, 3000) como temporizador?
Se agradece cualquier ayuda, ya sea una explicación simple de la teoría o ejemplos de código basados en el violín. Cuando probé el objeto, rompe el código.
Actualización: ahora coloco bombas, y después de un cierto tiempo lo elimino dependiendo de la posición en la que lo coloqué. Pero si coloco una bomba antes de que explote la primera bomba, solo se elimina una de ellas (obviamente, dado que bombX y bombY han cambiado desde que se colocó la primera).
Ahora necesito saber cómo solucionar este problema, ¿tal vez crear una nueva matriz con todas las posiciones de bomba? ¿Cuál es la mejor manera de hacer esto?
Código actual:
function placeBomb(){
if(placebomb && player.bombs != 0){
map[player.Y][player.X].object = 2;
bombX = player.X; bombY = player.Y;
placebomb = false;
player.bombs--;
setTimeout(explode, 3000);
}
}
function explode(){
alert('BOOM!');
delete map[bombY][bombX].object;
player.bombs++;
}
fuente
Respuestas:
No se ve tan mal, pero necesita un mejor control del tiempo y la entrada. Como su velocidad de movimiento depende de la configuración de repetición de pulsación de tecla en la máquina del usuario, eso no es exactamente óptimo.
En su lugar, debe realizar un seguimiento de las teclas que se están presionando actualmente, puede hacer esto como (en pseudocódigo):
Y luego, en su función de actualización, mueve el reproductor si
keyisdown
, y posiblemente aplica algunas otras condiciones, como que el jugador no puede moverse si se movió hace menos de un número de actualizaciones.Mantenga un contador actualizado o alguna otra forma de hacer un seguimiento del tiempo para que su código siempre sepa exactamente qué tan avanzado debe estar.
Da bomb
Personalmente, lo mantendría simple, en realidad no es necesario usarlo
this
,new
y todas las otras cosas elegantes en JavaScript para hacer objetos útiles.Podrías hacer algo como:
Luego, puede recorrer el mapa en cada actualización, verificar si hay una bomba y si es hora de explotar, si es así, sople y elimine el objeto de la bomba.
Seguimiento de errores
Su código está filtrando errores, son bastante simples, pero si no aprende sobre ellos y los maneja, tendrá problemas más adelante. Cada navegador moderno tiene una consola de desarrollador de clones Firebug. Ábralo, mire la pestaña de la consola de script, vea todo el desagradable texto rojo y corríjalo.
Editar: preocupaciones sobre el cronometraje
Solo para el registro, es probable que desee algo un poco más avanzado que el
setInterval
cronometraje, si es serio, realmente necesita ajustar su código para el intervalo de tiempo. Vea mi primera respuesta de Stack Overflow para obtener una descripción aproximada del problema: https://stackoverflow.com/a/2549426/305545Editar: versión setTimeOut corregida
Dado que está utilizando las mismas variables para diferentes bombas, las sobrescribirá cada vez que coloque una nueva bomba. Puede usar un cierre para crear variables individuales para cada bomba, de esta manera:
Ahora los
bombX
ybombY
las variables y laexplode
función son locales para el cierre creado por placeBombs, por lo que es la instancia local deexplode
que se adjunta al tiempo de espera, y lee las variables locales. Cada vez que llama,placeBomb
se crea un nuevo cierre.No hubiera usado setTimeout para esto, habría contado las actualizaciones, asegurando así un número fijo de actualizaciones antes de que estalle la bomba, pero supongo que esto funcionará bien.
fuente
Parece que obtuviste un buen toldo, solo quería agregar un código útil para las explosiones.
fuente