# Component System Java 2D Game LibGDX



## GentleXD (4. Apr 2017)

Hallo liebe Community,

ich melde mich mal wieder zurück, ich hab in den letzten Monaten an einem 2D Spiel programmiert. Nun sitzte ich mal wieder daran verschiedene Guis zu implementieren. Und mir fällt auf das sich vieles wiederholt. Als ein Beispiel ich habe Buttons die geklickt werden können und Notifications die einsliden und dann geklickt werden können. Nun das ist jetzt nicht mehr ganz so das Problem. Mein Problem ist nun ein ganz anderes. Mein Compoennt System was ich jetzt programmieren will soll nun diese Funktionen in einzelnen Components unterteilt sein. Und in einer Klasse werden dann verschiedene Gui Elemente etc. zusammen gebastelt mithilfe der Component diese sind dann Entitys diese Entitys sollen eine Liste mit Components haben und dann können sie geupdatet werden. Aber mein eigentliches Problem liegt jetzt hier: Ich habe meinen Button nun in der Klasse mit seinen Components zusammen gebastelt und habe ihm feste Werte übergeben aber wie erstelle ich jetzt einen zweiten mit unterschiedlichen Werten ohne gleich das ganze nochmal zu machen. Oder vllt. gibt es ja noch ein besseres System für die Guis.

Hier ein paar Beispiele (die sind nur aus meiner Planung) habe das System noch nicht programmiert:


```
Entity button = new Entity();
button.addComponent(0, new MoveComponent(100, 100)); <-- Wie erstelle ich einen zweiten Button ohne das ganze hier mit Entity button2 etc. nochmal zu machen.
button.addComponent(1, new SpriteComponent(TextureManager.instance.buttonSprite), button.getComponent(0));
```

Also wenn ich nun einen zweiten Button erstellen will mit anderer Position und anderer Texture ich aber nicht wieder alles neu schreiben will wie in meinem Code beispiel wie mache das am besten? Genauso wie bei Zombies wie kopiere ich die und ändere einfahc nur die Position ?

Lg GentleXD


----------



## tommysenf (4. Apr 2017)

Entity button2 = button.clone();

Und dann noch die clone() Methode in der Klasse Entity sinnvoll überschreiben...


----------



## GentleXD (9. Apr 2017)

Danke aber das löst mein Problem nicht so ganz.
Wenn ich den Button kopiere mit der clone methode, übernimmt der ja jede Komponente des bisherigen buttons aber es soll angepasst zum Beispiel immer ein anderer Text stehen. Also ich würde gerne ein Template haben einen Button denn ich zum Beispiel im Main Menu 4* kopiere aber immer den Text und die Action ändern aber das ohne das ich nochmal das Template aufschreiben muss.


----------



## JuKu (9. Apr 2017)

Entweder baust du dir dafür eine Factory, oder du erstellst die Components immer wieder neu.
Mal ein Beispiel aus dem SpaceChaos Spiel.

So wird der Spieler Shuttle erstellt:
https://github.com/opensourcegamede...haos/game/entities/factory/PlayerFactory.java

Und so ein feindliches Shuttle:
https://github.com/opensourcegamede...chaos/game/entities/factory/EnemyFactory.java

Und wenn du solch ein GUI Widget erstellst, sollten diese Components eben "unter der Haube" so automatisch mit erstellt werden, dass man von außen nichts von den Components mitbekommt.
Immerhin muss der GUI Programmierer nicht unbedingt wissen, wie die GUI intern funktioniert.


----------



## JuKu (9. Apr 2017)

Aber noch eine Anmerkung:
Ein Entity-Component-System halte ich für eine GUI etwas over-engineered (Overhead).
Theoretisch brauchst du nur eine ordentliche Widget Klasse mit allen wichtigen Sachen, die jedes Widget braucht und jedes Widget erweitert dann diese Widget Klasse.

Noch ein Beispiel von einem anderem Projekt:
https://github.com/JuKu/libgdx-test.../main/java/com/jukusoft/libgdx/rpg/engine/hud


----------



## GentleXD (9. Apr 2017)

Ich habe nochmal ne Frage zu meinem Entity Component System, (ich plane es immer noch ;D).
Mein Spieler besteht aus 6 Textures die auch immer anders verändert werden müssen (zum Beispiel ,bei Rüstungen), soll ich jetzt einfach meinem Spieler 6 mal ein Texture Component geben mit jeweils einer anderen Texture ?


----------



## JuKu (11. Apr 2017)

Eig. sollte jede Component innerhalb eines Entities unique sein, allerdings kommt es drauf an, wie dein ECS Konzept aussieht.

Am einfachsten wäre es wahrscheinlich wirklich, die selbe Component mehrmals hinzuzufügen oder aber eine Component anzulegen, die alle 6 Bilder drawt.
Oder eine Component, die modularisiert ist, also 6 Sub-Components beinhaltet (gibt es sowas überhaupt?) und dann bei denen nacheinander die draw Calls ausführt.
Oder ein Entity unterstützt Child Entities, dann könnte man die als Child Entity einhängen.
Letzteres würde aber vermutlich nur mehr Overhead erzeugen.


----------

