Metodi efficaci per aggiornare continuamente i movimenti in un gioco di difesa della torre?


8

Siamo quattro ragazzi che realizzano un gioco Tower Defense come progetto in prima elementare in un'università. Il gioco sarà davvero semplice!

  • Tre diverse torri
  • Tre mostri diversi
  • Una mappa (forse aggiungine un po 'di più se abbiamo tempo)

Il gioco deve essere orientato agli oggetti.

La struttura della classe è la seguente

  • Gioco - Disegno di grafica, ecc.
  • Livello : ogni livello è un oggetto di questa classe. Ogni livello ha un numero finito di oggetti wave (in un elenco)
  • Onda : contiene un elenco di oggetti mostro.
  • Monster - Questa è una superclasse. Realizziamo sottoclassi per i diversi tipi di mostri
  • Tower - Superclass alle torri. Ci sono sottoclassi per ogni tipo di torre.

Stiamo pensando a come risolvere il problema che molti oggetti devono fare cose, allo stesso tempo, ad esempio spostare un pixel in una direzione.

Ciò che ci è venuto in mente è l'idea di implementare il timer di classe av, per controllare quando gli oggetti fanno le cose. Non sono sicuro che questo sia il modo migliore per farlo. Qualcuno potrebbe dare alcune buone idee su come risolvere il continuo caso di aggiornamento?

Risposte:


12

La codifica di gioco completa descrive bene un ciclo di aggiornamento. È semplicemente un ciclo while in esecuzione nella tua classe principale che esegue le seguenti (più o meno):

while( game.isRunning )  
{  
  GetInput();
  Update( dt );
  Render();
}

Si passa in un tempo (delta time) a seconda che si desideri che il gioco funzioni a un frame rate fisso o variabile. Per un frame rate fisso, questo non è necessario.

Ora per fare quello che vuoi fare abbastanza facilmente è usare la nozione di vettori 2D, dove un vettore rappresenta la posizione del mostro (x, y) e un vettore di velocità che rappresenta la direzione in cui il mostro sta viaggiando (in unità / sec ).

Quindi, per creare mostri con velocità diverse, tutto ciò che devi fare è cambiare il vettore di velocità in qualunque cosa tu voglia e lasciare che la funzione monster.update () lo gestisca per te.

Per esempio:

Monster monster = new Monster();
monster.position = new Vector2( 0, 0 );
monster.velocity = new Vector2( 1, 0 );   // Every frame I want the monster 
                                          // to move 1 unit to the right

E il tuo metodo di aggiornamento sarebbe simile a questo (per una frequenza di fotogrammi fissa di 60 fotogrammi al secondo):

monster.position += monster.velocity * ( 1.0f / 60.0f ); // The ( 1.0f / 60.0f ) would  
                                                         // be dt if it was passed into the Update() method

Questo è noto come metodo di aggiornamento di Euler ed è un metodo molto semplice e diretto per implementare le equazioni del movimento.

Spero che sia di aiuto.


+1 per la grande spiegazione. Direi che varrebbe la pena menzionare che il "tempo variabile" non è l'unico approccio (sebbene il mio preferito personale) all'approccio alla tempistica dei cicli di aggiornamento, il tempo variabile rispetto al tempo fisso è spesso dibattuto in luoghi come questo e vale la pena cerca :)
Zaky tedesco

3

Fondamentalmente, utilizzo un ciclo di aggiornamento e non un sistema basato su eventi.

Per aggiornare i mostri, puoi iterare un elenco di mostri e aggiornarli nel ciclo di aggiornamento con, diciamo, monster.update()

Se un mostro deve camminare, deve aggiornare la sua posizione. Quindi, nel metodo di aggiornamento, calcolo la nuova posizione sulla base del tempo trascorso, che è memorizzato in una classe separata 'timer'.

Dovrebbero essere tutte le cose che camminano;)


Abbiamo il metodo per il movimento dei mostri. È abbastanza semplice. Il problema è come far muovere i mostri e sparare alle torri quando hanno una "velocità" diversa ...
Øyvind

1
@ Øyvind: basta passare il tempo trascorso come parametro al metodo di aggiornamento. Quindi un mostro può calcolare la sua nuova posizione muovendosi elapsedTime * movementPerSecond. Oppure potresti avere un tempo di recupero sulla torre di tiro: if(cooldown > 0){ cooldown -= elapsedTime } else { cooldown = X, shoot(); }ecc.
Bummzack,

2

Suppongo che riempirà bene lo scopo di un progetto uni, ma in un gioco reale avrei una classe di mostri concreta, e invece di sottoclassare i tipi, avrei i diversi tipi di mostri descritti nei file di dati. Velocità, punti salute, resistenze a diversi tipi di danni e folletti possono essere perfettamente descritti nei file, ti renderà più facile aggiungere nuovi tipi di mostri al tuo gioco e non dovrai compilare ogni volta che voglio farlo.

Comunque, riguardo al movimento. Dai a tutti i tuoi oggetti "mobili" una variabile di velocità diversa. Ogni fotogramma nella logica di gioco attraversi tutti quegli oggetti mobili e fai qualcosa di simile

object.x += Math.cos(object.angle) * object.speed * timeSinceLastIteration;
object.y += Math.sin(object.angle) * object.speed * timeSinceLastIteration;

Questo vale per mostri, missili dalle torri, ecc ...

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.