Sto provando a creare un gioco Tower Defense dove i minion si muovono attraverso un labirinto e puoi costruire torri in cima dei muri dei labirinti per fermare i servi. Uso personalmente Python e pygame , ma sto cercando risposte progettuali generiche che possano essere applicate a qualsiasi linguaggio OOP.
Quindi, dato che entrambi i minion e le torri hanno una dimensione e una posizione, così come un'immagine sprite, ho pensato che sarebbe stato appropriato creare una classe base comune:
class Entity:
def __init__(self, image, size, position):
self.image = image
self.size = size
self.position = position
def draw(self, surface):
surface.blit(self.image, self.position, self.size)
Bene, quindi voglio che il mio gioco funzioni in modo simile a Vector TD , dove hai più diversi tipi di torri che è possibile creare, ma è possibile creare più istanze di ogni tipo e ciascuna istanza può essere aggiornata singolarmente. Ciò significa che ho bisogno di un qualche tipo di modo generico per spiegare come funzionano tutte le torri di tipo simile, ma ho bisogno che ogni istanza sia separata. Così ho iniziato con una classe base Tower
con tutte le proprietà a cui posso pensare:
class Tower(Entity):
def __init__(self, image, size, position, attack_speed, attack_damage, attack_splash_radius, attack_range, cost):
super().__init__(image, size, position)
self.attack_speed = attack_speed
self.attack_damage = attack_damage
... # etc
Ma il problema è che tutte le torrette dello stesso tipo hanno lo stesso intervallo, la stessa velocità di attacco, lo stesso costo, ecc. ma sono comunque singole istanze, quindi sarebbe stupido copiare tutte queste proprietà comuni con lo stesso valori per ogni istanza separatamente.
Il motivo per cui non faccio una sottoclasse di Tower
per creare i miei tipi di torre personalizzati è perché non aggiungono nulla alla classe. Letteralmente, l'unica cosa che farebbero è cambiare i valori predefiniti per gli argomenti di __init__
. L'uso di sottoclassi come questo porterebbe anche ai valori comuni che vengono copiati in ogni istanza, quindi se la mia sottoclasse GreenTower
ha default range=800
per tutte le mie torrette, significherebbe che il valore 800
verrebbe memorizzato separatamente in ogni istanza ( quando potevano semplicemente usare un valore comune). Mi sembra che ci sia un modo migliore.
Quindi la mia domanda riguarda interamente la struttura / architettura / struttura del sistema. Come dovrei raggruppare queste proprietà insieme consentendo comunque l'aggiornamento individuale delle torrette separatamente? Idealmente potrei essere in grado di progettare questi tipi di torri in qualcosa come JSON, dove posso caricarli dinamicamente al gioco.