Bene, so che questo post è piuttosto vecchio, ma non ho potuto resistere.
Di recente ho costruito un motore di gioco. Utilizza le librerie di parti 3d per il rendering e la fisica, ma ho scritto la parte principale, che definisce ed elabora le entità e la logica di gioco.
Il motore segue sicuramente un approccio tradizionale. Esiste un ciclo di aggiornamento principale che chiama la funzione di aggiornamento per tutte le entità. Le collisioni vengono segnalate direttamente per richiamata sulle entità. Le comunicazioni tra entità vengono effettuate tramite puntatori intelligenti scambiati tra entità.
Esiste un sistema di messaggi primitivo, che elabora solo un piccolo gruppo di entità nei messaggi del motore. È preferibile che tali messaggi vengano elaborati al termine di un'interazione di gioco (ad esempio, la creazione o la distruzione di un'entità) perché possono interferire con l'elenco di aggiornamento. Quindi, alla fine di ogni ciclo di gioco, viene consumato un piccolo elenco di messaggi.
Nonostante il primitivo sistema di messaggi, direi che il sistema è in gran parte "basato su loop di aggiornamento".
Bene. Dopo aver usato questo sistema, penso che sia molto semplice, veloce e ben organizzato. La logica del gioco è visibile e autonoma all'interno delle entità, non dinamica come una quewe di messaggi. Davvero non lo farei basato su eventi perché, a mio avviso, i sistemi di eventi introducono complessità inutili nella logica di gioco e rendono il codice di gioco molto difficile da capire e da debug.
Ma penso anche che un puro sistema di "aggiornamento basato su loop" come il mio abbia anche alcuni problemi.
Ad esempio, in alcuni momenti, un'entità può trovarsi in uno stato "non fare nulla", potrebbe essere in attesa che il giocatore si avvicini o qualcos'altro. Nella maggior parte dei casi, l'entità brucia il tempo del processore per nulla ed è meglio spegnere l'entità e accenderla quando si verifica un determinato evento.
Quindi, nel mio prossimo motore di gioco, adotterò un approccio diverso. Le entità si registreranno per le operazioni del motore, come l'aggiornamento, il disegno, il rilevamento delle collisioni e così via. Ognuno di questi eventi avrà elenchi separati di interfacce di entità per le entità effettive.