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:
- Una pistola standard che spara un proiettile che percorre una distanza nel tempo.
- 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.
- 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?