Tilemaps in un Entity System Framework?


12

Ho letto su Entity System Frameworks in particolare Artemis. Sto cercando di decidere se è giusto per me. Lavoro rigorosamente su giochi di pixel art 2D basati su piastrelle e non penso che saranno mai ad alta intensità di risorse. Ho sempre usato OOP standard con molta eredità in passato.

La mia comprensione dell'Entity System Framework in questo momento (non sono sicuro di averlo ancora compreso completamente) è:

  • Le entità non sono altro che ID
  • I componenti non sono altro che dati stupidi aggiunti a un pool di componenti entità
  • I sistemi sono funzioni di aggiornamento collegate al mondo per gestire tutte le entità che corrispondono alla firma del componente Sistemi

Se la mia comprensione è corretta, allora ho un bel po 'di problemi a concettualizzare l'aggiunta di tilemap e alberi comportamentali di intelligenza artificiale in questo framework. In futuro chiederò informazioni sull'intelligenza artificiale.

Una piastrella dovrebbe essere integrata in questo framework? O dovrebbe essere tenuto separato per facilitarne la generazione con un editor di tilemap?

Se la piastrella deve essere integrata in questo framework, ciascuna piastrella è un'entità diversa? E il tilemap è un sistema? O la stessa tilemap è una singola entità con l'eredità costruita da essa?

Se la tilemap è sperate, quale sarebbe il modo migliore di rilevare le collisioni contro la tilemap esterna?

Capisco che più opzioni che ho elencato potrebbero essere corrette, ma se qualcuno lo ha fatto in passato potrebbero essere in grado di far luce sulla mia confusione. Forse c'è un'altra alternativa a cui non ho pensato?

Grazie.


Una nota completamente casuale, le coordinate X / Y funzionano anche come ID. Non che ti sto suggerendo di implementarlo nel tuo sistema di entità, ma piuttosto, puoi associare effetti alle tue tessere nello stesso modo in cui lo faresti in un sistema di entità.
William Mariager,

Ehi, sto solo trasmettendo il suggerimento di Byte56: i componenti non hanno davvero bisogno di essere stupidi detentori di dati. A volte sarebbe utile se potessero effettivamente gestire quei dati; vettori, per esempio.
jcora,

Mi piace molto anche questo suggerimento. Posso aggiungere tilemap nel framework delle entità senza dover separare gli helper dei tilemap dai dati o suddividere il tilemap in più componenti / entità.
Spencer Marr,

Tilemap è solo un altro componente e il sistema di collisione e il sistema di rendering gestiscono le collisioni con tilemap e il rendering di tilemap
Kikaimaru

Risposte:


8

Ho implementato un framework di componenti di entità (simile ad Artemis) dopo che ero già stato in sviluppo per un po ', ma non penso che avrei fatto le cose diversamente se partissi da una tabula rasa.

Ho il mio mondo totalmente separato dal quadro delle entità. Non aveva senso per me convertire il mondo in una sorta di entità o raccolta di entità. Il mio mondo è 3D con cubi, ma credo che lo stesso valga per le piastrelle. Le entità costituiscono tutto il resto del mondo, ma il terreno è separato. Tuttavia, quando i cubi vengono rimossi, generano entità "materiali".

Il rilevamento delle collisioni non è troppo difficile da collegare. Il tuo mondo probabilmente avrebbe isSolidAt(x,y)metodi di tipo che verranno utilizzati dal tuo sistema di collisione. Onestà, l'ho già detto una volta già oggi in una risposta diversa , fai tutto ciò che ha più senso per te. Non stai infrangendo alcuna regola rendendo separata la mappa delle tessere o rendendola un'entità. Qualunque cosa tu possa avvolgere la testa è la cosa migliore. Per me, quello era mantenere il mondo separato e rendere tutte le altre entità.


1
Supponiamo che la mia mappa sia un'entità. Come potrebbe un'altra entità accedere al isSolidAtmetodo della mappa ?
Gerardo Marset,

Memorizzare la mappa come entità probabilmente non è un'ottima idea proprio per questa situazione. Suppongo che devi comunicare direttamente con esso in questa situazione. Il sistema responsabile dell'entità mappa avrebbe accesso all'entità mappa e sarebbe in grado di recuperare informazioni da tale entità quando richiesto.
MichaelHouse

4

Ho aggiunto tilemap come componente separato all'entità (con tutte le tessere all'interno) e c'è anche un renderer separato per la mappa delle tessere, quindi posso renderlo in 3d o in 2d. Creare tutte le tessere come entità è possibile ma costoso.

qualcosa del genere:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

il vantaggio nel separare il disegno dalla logica è l'idea di base del modello MVC


1
L'intera tilemap è contenuta in un singolo componente? È collegato a una sorta di entità dell'ambiente di gioco / entità principale? Posso vedere un grande vantaggio ottenuto separando il renderer dal componente tilemap.
Spencer Marr,

Grazie per aver aggiornato la tua risposta! Adoro i frammenti di codice.
Spencer Marr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.