Mein Spiel verwendet ein Entity-Komponenten-Framework und verwendet Skripte, um Entities zu definieren (dies definiert das Verhalten nicht direkt, ich werde am Ende mehr darüber sprechen). Die Skripte definieren die tatsächlichen Komponenten, die zum Erstellen jeder Entität verwendet werden sollen. Es verwendet eine einfache Skriptsprache, die ich erstellt habe. Hier ist eine vereinfachte Version eines meiner Skripte:
ENTITY:"Goblin"
{
description="It's currently their age."
commonname="goblin"
pluralCommonName="goblins"
childname="gob'in"
pluralChildName="gob'ins"
active=Nocturnal
tags=Mobile
baseAttributes="OrganicMobileCreature"
[Model]{
meshname="Goblin"
texturename="GoblinTexture"
}
[Motion]{
maxvelocity=0.01:0.015
locomotion=Walk,Swim
}
[Skills]{
ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
}
[Inventory]{
maxItems=2
Allow=ALL
Disallow=NONE
}
}
Vieles davon ist selbsterklärend, aber hier sind einige Highlights:
- Der erste Abschnitt beschreibt die allgemeinen Informationen für die Entität. Dazu gehören eine Beschreibung und Anzeigenamen für verschiedene Aspekte der Entität.
- Das
baseAttributes
Tag verweist auf eine andere Skriptdatei, die allgemeine Komponenten definiert, die nicht mehrmals neu definiert werden müssen. Es enthält Komponenten wie position
, liferequirements
und so weiter. Wenn eine Komponente hier erneut definiert wird, überschreibt diese Komponente die gemeinsame Komponente.
- Jeder
[NAME] { }
Satz definiert eine neue Komponente, die diesen Entitäten hinzugefügt wird.
- Diese Beschreibung gilt nicht nur für eine einzelne Entität , sondern für alle erstellten Goblins. Sie werden sehen, dass einige der Werte Bereiche haben (dh
0.01:0.015
), wenn ein neuer Goblin erstellt wird, wird er mit einer Komponente erstellt, die einen zufälligen Wert in diesem Bereich hat. So wird jeder Goblin etwas andere Fähigkeiten und etwas andere Geschwindigkeiten haben. Dieses Setup definiert, dass alle Goblins mit wirklich guten Fähigkeiten beim Platzieren von Würfeln und beim Bergbau beginnen, was eigentlich nur für meine eigenen Testzwecke ist. Aber wie Sie sicher erraten können, ist es sehr einfach, die Werte in die von mir gewünschten Werte zu ändern.
Das Ganze beinhaltet die Erstellung eines benutzerdefinierten Parsers, einer Art Struktur für die Entitätsdefinitionen (ich nenne sie das Lexikon!) Und einer Factory für die Aufnahme dieser Entitätsdefinitionen und die Generierung neuer Entitäten. Für mich ist dieses System noch in den Anfängen, aber es entwickelt sich wirklich sehr, sehr gut. Es ist ein ziemlich leistungsfähiges System zum schnellen Definieren von Entitäten und ermöglicht es Ihnen, jede gewünschte Entität mit den von Ihnen erstellten Komponenten zu erstellen. Wenn Sie nicht gerne Ihren eigenen Parser erstellen, funktioniert XML meiner Meinung nach einwandfrei. Ich habe meinen von einem rekursiven Pushback-Parser konvertiert, den ich für eine kleine erfundene Programmiersprache geschrieben habe.
Wie Sie sehen, definiert dies die Entität. Ich erwähnte, dass es das Verhalten nicht direkt definiert. Es kann jedoch leicht Dinge wie gehasste Feinde definieren und wie aggressiv man auf diese Feinde reagiert. Dies ist so einfach wie die Definition der Komponenten, mit denen Sie dieses Verhalten steuern. Meine Entitäten haben auch eine Nachrichtenkomponente (nicht gezeigt), die Folgendes definiert:
- Wie sie den Weg finden (einfache Sichtlinienbewegung, einfaches A *, voraussagendes A * usw.)
- Wie aggressiv / defensiv sie sind. Entitäten können Heimatzonen haben, die verteidigt werden, aber außerhalb dieser Zonen möglicherweise nicht aggressiv sind.
- Technologiebewusstsein (Türen öffnen, Geräte verwenden, Fallen meiden usw.)
- Und mehr...
Wie auch immer Ihre definiert ist, es ist Ihr System, das die Daten in dieser Komponente steuert, was sich wiederum auf das Verhalten Ihrer Entitäten auswirkt.