Dopo aver fatto due domande sui sistemi di entità ( 1 , 2 ) e aver letto alcuni articoli su di essi, penso di capirli molto meglio di prima. Ho ancora alcune incertezze, principalmente sulla costruzione di un emettitore di particelle, un sistema di input e una telecamera. Ovviamente ho ancora qualche problema nella comprensione dei sistemi di entità, e potrebbero applicarsi a tutta un'altra gamma di oggetti, ma ho scelto questi tre perché sono concetti molto diversi, dovrebbero coprire un terreno abbastanza ampio e aiutarmi a capire i sistemi di entità e come gestire problemi come questi, io stesso, mentre si presentano.
Sto costruendo un motore in JavaScript e ho implementato la maggior parte delle funzionalità principali, tra cui: gestione dell'input, sistema di animazione flessibile, emettitore di particelle, classi e funzioni matematiche, gestione delle scene, una telecamera e un rendering e un sacco di cose di altre cose che i motori di solito supportano. Ho letto la risposta di Byte56, che mi ha interessato a trasformare il motore in un sistema di entità. Rimarrebbe comunque un motore di gioco HTML5, con la filosofia di base della scena, ma dovrebbe supportare la creazione dinamica di entità dai componenti.
Il problema che ho, ora, sta adattando il mio vecchio concetto di motore a questo nuovo paradigma di programmazione. Queste sono alcune delle definizioni delle domande precedenti, aggiornate:
Un Entity è un identificatore. Non ha dati, non è un oggetto, è un semplice ID che rappresenta un indice nell'elenco scene di tutte le entità (che in realtà ho intenzione di implementare come matrice di componenti).
Un componente è un detentore di dati, ma con metodi che possono operare su tali dati. Il miglior esempio è un componente
Vector2D
, o "Posizione". Ha dei dati:x
ey
, ma anche alcuni metodi che rendono operanti sui dati un po 'più facile:add()
,normalize()
, e così via.Un sistema è qualcosa che può operare su un insieme di entità che soddisfano determinati requisiti; di solito le entità devono avere un set specifico di componenti su cui operare. Il sistema è la parte "logica", la parte "algoritmo", tutte le funzionalità fornite dai componenti sono puramente per una più semplice gestione dei dati.
telecamera
La telecamera ha una Vector2D
proprietà position, una proprietà di rotazione e alcuni metodi per centrarla attorno a un punto. Ogni fotogramma viene inviato a un renderer, insieme a una scena, e tutti gli oggetti vengono tradotti in base alla sua posizione. La scena viene quindi renderizzata.
Come potrei rappresentare questo tipo di oggetto in un sistema di entità? La fotocamera sarebbe un'entità, un componente o una combinazione (secondo la mia risposta )?
Emettitore di particelle
Il problema che ho con il mio emettitore di particelle è, di nuovo, quale dovrebbe essere cosa. Sono abbastanza sicuro che le particelle stesse non dovrebbero essere entità, in quanto voglio supportarne oltre 10.000, e credo che la creazione di molte entità sarebbe un duro colpo per la mia performance.
Come potrei rappresentare questo tipo di oggetto in un sistema di entità?
Gestione input
L'ultimo di cui voglio parlare è come gestire l'input. Nella mia attuale versione del motore, esiste una classe chiamata Input
. È un gestore che si iscrive agli eventi del browser, come la pressione dei tasti e le modifiche alla posizione del mouse, e mantiene anche uno stato interno. Quindi, la classe del giocatore ha un react()
metodo, che accetta un oggetto di input come argomento. Il vantaggio di ciò è che l'oggetto di input potrebbe essere serializzato in .JSON e quindi condiviso sulla rete, consentendo simulazioni multiplayer fluide.
Come si traduce in un sistema di entità?