Clone di Bomberman, come si fanno le bombe?


8

Sto giocando con un clone di un bomberman per imparare lo sviluppo del gioco.

Finora ho fatto piastrelle, movimento, rilevamento delle collisioni e raccolta degli oggetti. Ho anche uno pseudo bombplacing (solo grafica e collisione, nessuna vera funzionalità).

Ho creato un jsFiddle del gioco con le funzionalità che ho attualmente. Il codice nel violino è molto brutto però. Scorri la mappa e scopri come posiziono le bombe.

Comunque, quello che vorrei fare è un oggetto, che ha le informazioni generali sulle bombe come:

function Bomb(){
  this.radius = player.bombRadius;
  this.placeBomb = function (){
    if(player.bombs != 0){
      // place bomb
    }
  }
  this.explosion = function (){
  // Explosion
  }
}

Non so davvero come adattarlo al codice però. Ogni volta che posiziono una bomba, devo fare var bomb = new Bomb();o devo averla costantemente nella sceneggiatura per potervi accedere.

Come fa la bomba a danneggiare? È semplice come fare X, Y in tutte le direzioni fino a quando il raggio si esaurisce o l'oggetto lo ferma? Posso usare qualcosa come setTimeout (bomb.explosion, 3000) come timer?

Qualsiasi aiuto è apprezzato, che si tratti di una semplice spiegazione della teoria o di esempi di codice basati sul violino. Quando ho provato l'oggetto in modo da rompere il codice.

Aggiornamento: ora posiziono le bombe e dopo un certo periodo le elimino a seconda della posizione in cui le ho piazzate. Ma se posiziono una bomba prima che esploda la prima bomba ne cancella solo una (ovviamente da quando bombX e bombY sono cambiate da quando è stata piazzata la prima).

Ora ho bisogno di sapere come risolvere questo problema, forse creare un nuovo array con tutte le posizioni della bomba? Qual è il modo migliore per farlo?

Codice attuale:

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++;
}

1
jsFiddle + Firebug -> strumento di prototipazione del gioco? Non ci avevo mai pensato. +1 per avermi stupito molto piacevolmente! :)
Anko,

Risposte:


6

Non sembra poi così male, ma è necessario un migliore controllo dei tempi e degli input. Poiché la velocità di movimento dipende dall'impostazione della ripetizione della pressione dei tasti sulla macchina degli utenti, ciò non è esattamente ottimale.

Invece dovresti tenere traccia di quali chiavi sono attualmente tenute premute, puoi farlo come (in pseudocodice):

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
}

E poi nella tua funzione di aggiornamento muovi il giocatore se keyisdown, e possibilmente applichi alcune altre condizioni, come il giocatore non può muoversi se si è spostato meno di un certo numero di aggiornamenti fa.

Tieni un contatore aggiornato o un altro modo per tenere traccia del tempo in modo che il tuo codice sappia sempre esattamente quanto dovrebbe essere avanzato.

Da Bomb
Personalmente mi piacerebbe mantenere le cose semplici, in realtà non c'è bisogno di usare this, newe tutte le altre cose di fantasia in JavaScript per fare oggetti utili.

Potresti fare qualcosa del tipo:

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

Quindi puoi scorrere la mappa ad ogni aggiornamento, controllare se c'è una bomba e se è il momento di esplodere, in caso affermativo e rimuovere l'oggetto bomba.

Bugtracking
Il tuo codice perde errori, sono piuttosto semplici, ma se non li conosci e li gestisci, avrai problemi in seguito. Ogni browser moderno ha una console di sviluppo del clone di Firebug. Aprilo, guarda la scheda della console degli script, vedi tutto il brutto testo rosso e correggilo.

Modifica: preoccupazioni di cronometraggio
Solo per la cronaca, probabilmente vorresti qualcosa di leggermente più avanzato rispetto setIntervalai tempi, se sei serio devi davvero regolare il tuo codice per la sequenza temporale. Vedi la mia primissima risposta Stack Overflow per una descrizione approssimativa del problema: https://stackoverflow.com/a/2549426/305545

Modifica: setTimeOut versione riparata
Dato che stai usando le stesse variabili per bombe diverse, le sovrascriverai ogni volta che viene piazzata una nuova bomba. Puoi usare una chiusura per creare variabili individuali per ogni bomba, in questo modo:

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++;
    }
}

Ora i bombXe bombYvariabili e la explodefunzione sono i locali alla chiusura creato da placeBombs, quindi è l'istanza locale di explodeche è attaccato al timeout, e legge le variabili locali. Ogni volta che chiami placeBombviene creata una nuova chiusura.

Non avrei usato setTimeout per questo, avrei contato gli aggiornamenti, assicurando così un numero fisso di aggiornamenti prima dell'esplosione della bomba, ma immagino che funzionerà bene.


Sì, il violino non è lo stesso codice del mio game.js, un po 'di copia incolla e si inserisce semplicemente in modo casuale. Il vero codice non fornisce alcun errore negli strumenti di sviluppo di firebug o chromes. Proverò a far funzionare la tua bomba. Grazie. :)
justanotherhobbyist

Davvero, nessun errore? Né se provi a muoverti fuori dalla mappa?
aaaaaaaaaaaa,

Ora che me lo hai detto, ho capito quello, ma non è un problema dato che le prime tessere sono una cornice di cemento. :) Solo la mappa del violino che è stata semplificata.
justanotherhobbyist,

Sì, ho notato il problema con setTimeout, ora ho una serie di bombe, che funziona bene con 2 bombe, con più non cancella quella di mezzo, immagino che dovrei fare un po 'di tempismo se (timer> = timeplaced) o qualcosa di simile. Imparo molto commettendo errori e dovendo risolverli mentre vado: D, pochi giorni fa non sono nemmeno riuscito a fare il pong.
justanotherhobbyist,

Prego. Ed è bello sapere che stai imparando, a volte è difficile credere che risolvere i problemi immediati delle persone porti davvero ovunque.
aaaaaaaaaaaa,

0

Sembra che tu abbia un bel tendalino, volevo solo aggiungere un po 'di codice utile per le esplosioni.

            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
        }

Sì, ho ottenuto qualcosa di simile ma con condizioni come casse, cemento ecc. E distruzione o arresto a seconda di esso. Il codice può essere letto qui: gamedev.stackexchange.com/questions/26065/...
justanotherhobbyist
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.