Ho un GameController di base con una macchina a stati finiti per gestire la logica di gioco.
Aggiungo le modalità di gioco e mi imbatto in problemi che li implementano in modo pulito. La funzionalità di base del gioco rimane la stessa: fisica, gestione degli input, creazione di livelli, ma ho molti punti in cui ho bisogno di un blocco if / else perché la funzionalità è leggermente diversa. In due modalità di gioco era gestibile ma non la più bella implementazione. Sto aggiungendo una modalità di gioco extra e voglio pulirlo.
Ecco un esempio di codice semplificato (in C #):
void OnBlocksCleared(int count) {
score += getScoreFromClearedBlocks(count);
scoreController.setScore(score);
if (currentMode == GameMode.Endless) {
DataManager.Instance.AddTotalBlocksCleared(count);
} else if (currentMode == GameMode.Rush) {
// Do nothing
} else if (currentMode == GameMode.TimeAttack) {
if (allBlocks.Count <= 0) {
currentState = GameState.Win;
}
}
}
Ci sono metodi che hanno molta più logica e solo una singola riga se / else per una specifica modalità di gioco (se il tempo TimeAttack è scaduto, se il livello Rush è completato, ecc.) e alcuni metodi come sopra dove il if / else i blocchi occupano molto spazio. Stavo pensando di implementare un'interfaccia per ogni modalità di gioco, ma non è stato facile da implementare in modo pulito. Ecco cosa stavo progettando:
public interface IGameBehavior {
void SetHighscore();
void OnBlocksCleared(int count);
void SetRemainingTime(float remainingTime);
}
Quindi avrei EndlessBehavior, TimeAttackBehavior, RushBehavior e in fondo ai metodi corrispondenti chiamiamo il metodo specifico in questo modo.
void OnBlocksCleared(int count) {
// Do everything that's shared
gameBehavior.OnBlocksCleared(count);
}
Questo non sembra funzionare bene perché se il comportamento ha bisogno di modificare specifiche del gameController diventerà strettamente accoppiato. Inoltre, in molti casi solo uno o due comportamenti di gioco effettivamente fanno qualcosa.