Sto lottando con l'astrazione del mio codice di animazione nel mio gioco usando uno stile funzionale. Come posso fare questo?

3

Il mio gioco è un top down 2D shmup programmato in uno stile funzionale. Sto lottando con l'astrazione del codice che è responsabile dell'animazione dei proiettili. Esistono molti tipi di armi con molti tipi di proiettili. Ecco alcuni che sono molto diversi:

  1. Una pistola standard che spara un proiettile che percorre una distanza nel tempo.
  2. Un laser che spara una linea che va dall'inizio alla fine in un istante.
    • Questo è diverso dal proiettile standard perché il suo proiettile non viaggia nel tempo. È disegnato come una linea. A differenza della pistola standard, l'animazione del raggio laser dovrebbe durare dopo che il proiettile ha colpito qualcosa.
  3. Una onda d'urto psichica che forma un'onda circolare esplosiva attorno al tuo corpo e danneggia qualsiasi cosa nel raggio d'azione. La dimensione del cerchio è variabile.
    • Questo è diverso dal proiettile standard perché le sue dimensioni sono variabili e circolari. Inoltre, non si muove. Sto lottando su come posso usare un foglio sprite per questo. Sembra che il modo migliore potrebbe essere quello di disegnare un cerchio sullo schermo. Tutti gli altri proiettili sono sprite.
    • Questo è diverso dal laser perché è una forma circolare piuttosto che una linea.

Se questo fosse orientato agli oggetti, il percorso che avrei intrapreso sarebbe semplice: creerei una classe Animation responsabile dell'animazione stessa. Il codice cliente non avrebbe idea di come il si verifichi l'animazione, passerebbe semplicemente gli oggetti necessari per farlo.

Ma non sono sicuro di come fare qualcosa di simile in uno stile funzionale. In questo momento, rappresento tutto come dato. Un projectile contiene animation di dati in questo modo:

projectile: {
  type: "laser"
  animation: ...
}

Ma quello che mi dà molto fastidio è che devo avere un interruttore per creare questo proiettile, e poi nel mio codice di rendering, devo avere un altro interruttore per decidere come usare i dati per animarlo . EG:

if projectile.type is "standard gun"
  rotateBulletTowardsVelocityAndAnimateAtPosition(projectile)
if projectile.type is "laser"
  rotateLaserTowardsTargetAndAnimateFromStartToTarget(projectile)
if projectile.type is "psychic shockwave"
  drawCircleAroundProjectilePosition(projectile)

Questo non mi sembra molto astratto. Qual è un modo migliore per codificarlo mentre sei ancora al suo servizio?

    
posta Daniel Kaplan 03.03.2014 - 23:08
fonte

2 risposte

4

Penso che sia necessario invertire le dipendenze qui - questi diversi tipi di animazione possono essere scritti come funzioni indipendenti che hanno una posizione, rendono un'animazione in quella posizione (o restituiscono un renderer di animazione che verrà eseguito in quella posizione che potresti eseguire più tardi).

Una volta implementate queste funzioni di rendering, è necessario passarle attraverso i livelli. Li inserirò nei tuoi giocatori in modo tale che abbiano una pistola attiva, e ogni volta che cambiano le pistole, ottieni un nuovo stato giocatore con il nuovo renderizzatore di riprese, che può essere passato a qualsiasi cosa che serva quando cercano di sparare.

    
risposta data 04.03.2014 - 00:06
fonte
-3

Potresti fornire una funzione che fornisce il percorso del proiettile dato un input e un'origine del tempo, e un altro che accetta le coordinate del proiettile ed esegue il rendering.

    
risposta data 03.03.2014 - 23:16
fonte