# Entity Verwaltung in einem 2D Spiel



## GentleXD (27. Mai 2017)

Hallo,

ich habe mal wieder ein Problem. Ich versuche gerade alle meine dynamic Entitys zu verwalten, in meinem 2D Spiel. 

Momentan speichere ich jedes Entity in einer ArrayList und jedes Entity wird immer gerendert und geupdatet. Da es momentan nur den Spieler als Entity gibt. Außerdem werden zum Beispiel bei Collisions Abfragen zwischen einem Entity und den anderen Entitys alle Entitys durchlaufen und die Collision Abfrage wird für jedes Entity gemacht.

Nun habe ich überlegt die Entitys meiner Welt in Chunks aufzuteilen. Also zum Beispiel ist meine Welt 6000 * 100 Blöcke groß. Nun habe ich Chunks die 100 * 100 groß sind dann hätte ich 60 Chunks. Jeder Chunk hat dann eine Liste mit Entitys die sich momentan in dem Chunk aufhalten. Nun habe ich aber ein paar Probleme was passiert wenn sich ein Entity zum Beispiel im ersten Chunk also in den Koordinaten 0, 0 bis 100, 100 aufhält und dann sich bewegt und zu 150, 90 geht und somit im zweiten Chunk wäre müsste ich dann jedes mal alle Chunks durchgehen und dann jedes Entity und abfragen in welchem Chunk es sich befinden müsste und wenn es nötig ist den Chunk ändern ? Außerdem haben meine Entitys 2 Methoden Update und Render. Update verändert die Daten und Render zeichnet. Jetzt könnte ich alle Entitys eines Chunks nehmen in dem sich der Spieler befindet und nur die in der Umgebung rendern aber ich muss ja theoretisch alle Entitys updaten die sich in der ganzen Welt befinden ?

Oder gibt es noch andere Systeme die vllt. effizenter sind ?

Lg Alex


----------



## JuKu (1. Jun 2017)

Du musst bei den Bewegungen die Entities in andere Chucks verschieben, wenn es denn nötig ist.
Angenommen jeder Chuck ist 100*100 Blöcke groß, dann bekommst du den aktuellen Chuck so:

```
int chuckX = (int) xBlock / 100;
int chuckY = (int) yBlock / 100;
```

Deine Update Methode sollte den aktuellen Chuck kennen und evtl. einen Listener aufrufen:

```
//Move Entity in update method

if (currentChuckX != chuckX || currentChuckY != chuckY) {
    //call listener Ort move entity to new chuck
}
```

Entweder übernimmt die update Methode selbst das Verschieben, oder sie ruft einen Listener / Observer auf.


----------

