Di recente ho realizzato un semplice gioco Space Invadors usando un "sistema di entità". È un modello che separa estremamente bene attributi e comportamenti. Mi ci sono volute alcune iterazioni per comprenderlo appieno, ma una volta progettati alcuni componenti, diventa estremamente semplice comporre nuovi oggetti utilizzando i componenti esistenti.
Dovresti leggere questo:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Viene aggiornato frequentemente da un ragazzo estremamente ben informato. È anche l'unica discussione sul sistema di entità con esempi di codice concreti.
Le mie iterazioni sono state le seguenti:
La prima iterazione aveva un oggetto "EntitySystem" che era come descrive Adam; tuttavia i miei componenti avevano ancora dei metodi: il mio componente "renderable" aveva un metodo paint () e il mio componente di posizione aveva un metodo move () e così via. Quando ho iniziato a perfezionare le entità mi sono reso conto che dovevo iniziare a passare il messaggio tra componenti e ordinare l'esecuzione degli aggiornamenti dei componenti .... troppo disordinato.
Quindi, sono tornato indietro e ho riletto il blog di T-machines. Ci sono molte informazioni nei thread dei commenti - e in essi sottolinea davvero che i componenti non hanno comportamenti - i comportamenti sono forniti dai sistemi di entità. In questo modo non è necessario passare messaggi tra i componenti e ordinare gli aggiornamenti dei componenti perché l'ordine è determinato dall'ordine globale di esecuzione del sistema. Ok. Forse è troppo astratto.
Ad ogni modo per l'iterazione n. 2 questo è ciò che ho raccolto dal blog:
EntityManager: funge da "database" del componente, che può essere interrogato per entità che contengono determinati tipi di componenti. Questo può anche essere supportato da un database in memoria per un accesso rapido ... vedi t-machine parte 5 per maggiori informazioni.
EntitySystem - Ogni sistema è essenzialmente solo un metodo che opera su un insieme di entità. Ogni sistema utilizzerà i componenti x, yey di un'entità per fare il suo lavoro. Quindi dovresti interrogare il gestore per le entità con i componenti x, ye z quindi passare il risultato al sistema.
Entità - solo un ID, come un lungo. L'entità è ciò che raggruppa un insieme di istanze di componenti in un'entità.
Componente - un insieme di campi .... nessun comportamento! quando inizi ad aggiungere comportamenti, inizia a diventare confuso ... anche in un semplice gioco di Space Invadors.
Modifica : a proposito, 'dt' è il tempo delta dall'ultima chiamata del ciclo principale
Quindi il mio ciclo principale di Invadors è questo:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
All'inizio sembra un po 'strano, ma è incredibilmente flessibile. È anche molto facile da ottimizzare; per diversi tipi di componenti è possibile disporre di archivi dati di backup diversi per velocizzare il recupero. Per la classe 'form' è possibile supportarlo con un quadrifoglio per velocizzare l'accesso per il rilevamento delle collisioni.
Sono come te; Sono uno sviluppatore esperto ma non ho avuto esperienza nella scrittura di giochi. Ho trascorso un po 'di tempo a fare ricerche per dare schemi agli sviluppatori e questo ha attirato la mia attenzione. Non è in alcun modo l'unico modo per fare le cose, ma l'ho trovato molto intuitivo e robusto. Credo che il modello sia stato discusso ufficialmente nel libro 6 della serie "Game Programming Gems" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Non ho letto nessuno dei libri, ma ho sentito che sono di fatto il riferimento per la programmazione del gioco.