Realizzo un po 'di sviluppo di giochi da solista e rimango sempre bloccato in una parte dell'architettura in cui non riesco a decidere quale sia il modo migliore per affrontare un problema. Mi sono imbattuto in un buon problema di architettura e spero di poter utilizzare le lezioni apprese da esso. Lo riassumerò un po 'per un problema teorico:
Supponiamo che il mio gioco abbia due abilità, "Heal Player" e "Stun Enemies". Ognuna delle abilità è riutilizzabile con un cooldown. Il gioco avrà bisogno di un pulsante separato per attivare ciascuna delle abilità.
La classe principale per il gameplay si chiama GameplayCore . La mia GUI è contenuta in una classe HUD e i nemici sono tutti controllati da un EnemyManager . La classe Giocatore contiene la salute del giocatore. GameplayCore crea e memorizza l'istanza HUD, l'istanza EnemyManager e l'istanza Player.
Ovviamente voglio separare il codice UI dal codice di funzionalità. Quindi, dal lato GUI, ho le classi HealButton , StunButton e HealthBar che definiscono l'aspetto e il comportamento di tali controlli. Dal lato della funzionalità, ho la classe Player con una proprietà health , una classe AbstractAbility che definisce il comportamento delle abilità condivise compreso il cooldown, e le classi HealAbility e StunAbility che la estendono per definire le implementazioni concrete.
Per evitare che GameplayCore diventi troppo gonfio, creo una classe AbilitySet per creare e gestire le istanze di HealAbility e StunAbility e creare un'istanza di AbilitySet in GameplayCore.
Ecco dove le cose cominciano a cadere a pezzi. Voglio essere in grado di cambiare l'aspetto dei pulsanti mentre i loro cooldowns salgono. Voglio che il codice di recupero sia autonomo in AbstractAbility, quindi HealAbility e StunAbility hanno bisogno di riferimenti ai pulsanti corrispondenti. Ora ho bisogno di passare quei riferimenti dall'HUD a GameplayCore e poi al costruttore di AbilitySet in modo che possano essere passati nei costruttori per i pulsanti di abilità. HealAbility ha bisogno di riferimenti a HealthBar (in HUD) e Player (in GameplayCore). StunAbility ha bisogno di un riferimento a EnemyManager in modo che possa recuperare la collezione di nemici da attraversare e stordire. Ma HUD ha bisogno di riferimenti a HealAbility e StunAbility in modo che possa chiamarli quando vengono premuti i pulsanti.
Tutto è diventato piuttosto aggrovigliato; c'è troppo accoppiamento e onestamente non sono sicuro di dove sia il posto migliore per costruire le classi di abilità. Sono molto tentato di unire tutti del codice di abilità nei pulsanti di abilità, il che semplificherebbe enormemente tutto, ma poi avrei un codice di funzionalità importante mescolato in una classe UI.
Qual è un buon approccio organizzativo a questo problema? Quali sono alcune buone strategie architettoniche che potrei usare per evitare che il codice si intasi troppo? Il mio intero approccio è strongmente imperfetto?
modifica: dovrei notare che questo particolare progetto è in ActionScript 3, che include un sistema di eventi (con le sue peculiarità e limitazioni).