Ad esempio, ecco come è strutturato il mio attuale progetto roguelike (in Java). Sta usando un motore grafico 2D, quindi gran parte del codice di rendering è già stato curato per me. Le critiche sono ben accette.
class Game
Questa classe imposta la macchina a stati che gestisce lo stato attuale del gioco. (in un menu vs. iniziare una nuova partita vs. giocare una partita salvata)
interface State
Ogni classe State contiene due loop: un loop per l'aggiornamento della logica e un loop per il rendering. Contengono inoltre il codice per chiamare la Game
classe e richiedere una modifica a uno stato diverso.
class ResourceManager
Un singleton inizializzato dalla Game
classe che carica tutte le risorse necessarie e consente l'accesso ad esse. Non mi piace questo design perché rende difficile caricare / scaricare risorse su diversi livelli, ad esempio. Probabilmente lo progetterei diversamente se dovessi ricominciare da capo.
class Map
Una mappa contiene una serie di tessere e un elenco di tutte le creature e gli oggetti sulla mappa. È una classe piuttosto semplice.
class Creature
Le creature contengono informazioni su se stesse, inclusi i calcoli del movimento (che richiedono loro di sapere in quale mappa si trovano e di essere in grado di interrogarle per scoprire gli ostacoli). Decidere se farlo, o fare in modo che un qualche tipo di manager si prenda cura di lui per tutte le creature è qualcosa con cui faccio fatica.
interface AITask
Le creature possono avere un elenco di AITask, che vengono eseguiti ogni volta che viene eseguito il ciclo logico della creatura. L'AITask ha il suo circuito logico che impartisce comandi alla creatura e una condizione di terminazione che determina se l'attività è stata completata con successo o no.
interface UIElement
Ho implementato la mia interfaccia utente per questo motore. Ogni UIElement ha un loop di rendering e un loop logico. Hanno anche un ciclo per l'elaborazione dell'input da tastiera / mouse. Tutti gli elementi possono avere un numero di elementi figlio, che sono resi dopo i loro genitori, e assumono l'input da tastiera / mouse. Ciò consente di avere menu con sottomenu, ad esempio.