Clon de Bomberman, ¿cómo hacer bombas?

8

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++;
}
justanotherhobbyist
fuente
1
jsFiddle + Firebug -> herramienta de creación de prototipos del juego? Nunca había pensado en eso. ¡+1 por volar mi mente muy agradablemente! :)
Anko

Respuestas:

6

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):

keyisdown=false
keydown event{
    if(!keyisdown){
        //This is the 'real' keydown event, the one that only happens the moment the
        //key is pressed down. You may not need it, but this is how you construct it.
    }
    keyisdown=true
}

keyup event{
    keyisdown=false
}

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, newy todas las otras cosas elegantes en JavaScript para hacer objetos útiles.

Podrías hacer algo como:

bombobject = {} //That is all it takes to make an object.
bombobject.blowtime = currenttime + delay
bombobject.position = mapobject
mapobject.bomb = bombobject

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 setIntervalcronometraje, 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/305545

Editar: 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:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        var bombX = player.X;
        var bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
    function explode(){
        alert('BOOM!');
        delete map[bombY][bombX].object;
        player.bombs++;
    }
}

Ahora los bombXy bombYlas variables y la explodefunción son locales para el cierre creado por placeBombs, por lo que es la instancia local de explodeque se adjunta al tiempo de espera, y lee las variables locales. Cada vez que llama, placeBombse 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.

aaaaaaaaaaaa
fuente
Sí, el violín no es el mismo código que mi game.js, algunos copian y pegan al azar. El código real no da ningún error en las herramientas de desarrollador de firebug o chromes. Intentaré hacer funcionar tu bomba. Gracias. :)
justanotherhobbyist
Realmente, no hay errores? ¿Tampoco si intentas moverte fuera del mapa?
aaaaaaaaaaaa
Ahora que lo mencionas, obtuve ese, pero eso no es un problema ya que los primeros mosaicos son un marco de concreto. :) Solo el mapa de violín que se simplificó.
justanotherhobbyist
Sí, noté el problema con setTimeout, ahora tengo una serie de bombas, que funciona bien con 2 bombas, con más no elimina la del medio, supongo que tengo que hacer algo de tiempo si (timer> = timeplaced) o algo similar. Aprendo mucho cometiendo errores y teniendo que resolverlos a medida que avanzo: D, hace unos días ni siquiera podía hacer pong.
justanotherhobbyist
De nada. Y es genial saber que estás aprendiendo, a veces es difícil creer que resolver los problemas inmediatos de las personas realmente te llevará a cualquier parte.
aaaaaaaaaaaa
0

Parece que obtuviste un buen toldo, solo quería agregar un código útil para las explosiones.

            for (int i = 0; i < actor.blasradius; ++i)
        {
            tiles[actor.tileX - i][actor.tileY].explode(); //left
            tiles[actor.tileX + i][actor.tileY].explode(); //right
            tiles[actor.tileX][actor.tileY -i].explode(); //up
            tiles[actor.tileX][actor.tileY + i].explode(); //down
        }
omgnoseat
fuente
Sí, obtuve algo similar, pero con condiciones como cajas, concreto, etc. y destruir o detener dependiendo de eso. El código se puede leer aquí: gamedev.stackexchange.com/questions/26065/…
justanotherhobbyist