Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.06.2012, 21:22

Erweiterbares Entity System

Hallo da ich nun einige einfache Spiele wie Pong und Pacman geschrieben habe wollte ich mich mal an etwas größeres setzen, man wächsed schlieslich mit der Herausforderung. Ich habe mir vorgenommen ein Entity System zu schreiben, welches möglichst wiederverwendbar sein soll um später andere Spiele damit schreiben zu können. Ziel-Genre ist erstmal ein 2D-RPG. Dabei möchte ich das alle Spiel Elemente von der Basis Entity Klasse erben. Soweit so gut ich möchte das System aber möglichst so halten das ich neue Entity Arten hinzufügen kann ohne für jeden neuen Typ eine eigene Klasse zu schreiben. Ich hab mir gedacht das Entity´s per XML oder durch reine Text Datein definiert werden und dann per Skript gesteuert werden. Mal ein kleines Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
<Entity typ="Mensch">
<var name="age" typ="int"/>
<var name="name" typ="string"/>
</Entity>

<Entity typ="Drache">
<var name="health" typ="int"/>
<var name="speed" typ="int"/>
<var name="attackpower" typ="int"/>
</Entity>


Und mal ein Lua-Skript welches dann das verhalten des Drachen steuern könnte. (ich bin momentan etwas aus der Übung was Lua angeht daher ist das eher Pseudocode)

Quellcode

1
2
3
function Drache.OnUpdate()
if Drache.canSeePlayer() then Drache.attackPlayer();
end


Wie ich Lua in C++ einbinden kann weis ich dank des Buches das ich momentan lese ("Game Coding Complete" in der 3. Auflage). Jetzt frage ich mich aber ob es sinnvoll ist der Entity Klasse nur eine Update Methode zu geben. Da ich später Events benutzen möchte um die Entitys zu steuern. Zum Beispiel möchte ich das NPC ein OnPlayerInteraction Event bekommt welches dann für einen Händler das Handelfenster öffnet und bei einem "normalen" NPC dann ein Text angezeigt wird.

Kann man in C++ den auch wie in C# Reflection nutzen um so der Entity Klasse wie oben beschrieben verschiedene Variablen zuordnen zu können? Ich stehe ein bisschen auf dem Schlauch ob das ganze so hinterher überhaupt funktionieren kann. Nochmal mein Ziel besteht darin ein Entity System zu schreiben mit dem ich dann später in Lua/XML das Spiel bzw. die Story zusammen setzen kann.
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.06.2012, 21:51

Hallo da ich nun einige einfache Spiele wie Pong und Pacman geschrieben habe wollte ich mich mal an etwas größeres setzen, man wächsed schlieslich mit der Herausforderung. Ich habe mir vorgenommen ein Entity System zu schreiben, welches möglichst wiederverwendbar sein soll um später andere Spiele damit schreiben zu können. Ziel-Genre ist erstmal ein 2D-RPG. Dabei möchte ich das alle Spiel Elemente von der Basis Entity Klasse erben. Soweit so gut ich möchte das System aber möglichst so halten das ich neue Entity Arten hinzufügen kann ohne für jeden neuen Typ eine eigene Klasse zu schreiben.

Ich würde dir raten, nicht einfach nur irgendein allgemeines Entity System zu schreiben. Schreib stattdessen einfach so ein 2D RPG wie du es dir vorstellst ;)

Kann man in C++ den auch wie in C# Reflection nutzen um so der Entity Klasse wie oben beschrieben verschiedene Variablen zuordnen zu können?

Nein, C++ bietet keine Reflection. Wofür genau meinst du denn Reflection zu brauchen?

3

03.06.2012, 22:09


Ich würde dir raten, nicht einfach nur irgendein allgemeines Entity System zu schreiben. Schreib stattdessen einfach so ein 2D RPG wie du es dir vorstellst ;)

Hehe genau so stelle ich mir das 2D-RPG vor einfach eine neue Goblin.xml und Goblin.lua Datei in den Entity Ordner packen und in der Story Datei dann ein einfaches add Goblin at x,y. So oder soähnlich hab ich mir das vorgestellt :D
Nein, C++ bietet keine Reflection. Wofür genau meinst du denn Reflection zu brauchen?

Wenn ich die Entitys so verwalten möchte würde ich ja Klassen zur laufzeit erzeugen und dafür braucht man doch Reflection oder irre ich mich da?
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

03.06.2012, 22:33

Du kannst in C++ keine Klassen zur Laufzeit erzeugen. Auch in vielen Sprachen die tatsächlich Reflection bieten, geht das nicht einfach so.

idontknow

unregistriert

5

04.06.2012, 00:01

Bei dem was du vorhast musst du alle Attirbute die eine Entity haben kann in nem primitiven Datentyp oder einem Interface abstrahieren und dann so zusammensetzen. Ist vermutlich gar nicht so einfach, wenn man das mit nem schönen, sauberen Design lösen will.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

04.06.2012, 00:02

Darum würde ich dazu raten, erstmal ohne Skripting etc. einfach nur ein entsprechendes RPG in C++ zu programmieren, einfach um mal zu sehen, wie das Design dabei aussehen könnte...

idontknow

unregistriert

7

04.06.2012, 00:19

Hab ja nichts darüber gesagt :P. Hard coden ist in dem Fall natürlich kurzfristig die effektivere Lösung und einfach und mit hoher Wahrscheinlichkeit deutlich sauberer was den Code angeht. Aber der Reiz, dass man sich per Skription quasi "alles" zusammenbauen kann ist halt doch relativ groß ..

FSA

Community-Fossil

  • Private Nachricht senden

8

04.06.2012, 07:20

Ich habe bei mir selbst so ein Entity Projekt am laufen. Aber irgendwie verstehe ich dein Problem nicht. Du kannst doch beim Laden alle Objekte hinzufügen. Oder musst du Objekte während dem Spiel laden? Bei mit ist es zumindest so, dass ich eine Map habe, die die Welt lädt und das Script(Anglecode) wird "auf" der Welt ausgeführt.
MfG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

04.06.2012, 07:29

Kann man in C++ den auch wie in C# Reflection nutzen um so der Entity Klasse wie oben beschrieben verschiedene Variablen zuordnen zu können?

Nö. Aber es gibt da ein schönes Konstrukt:

C-/C++-Quelltext

1
2
3
4
5
class Entity {
public:
string name;
map<string,void*> values;
}

Das frisst alle Properties, die Du willst ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige