Sollte der Schild eine eigene Entität sein, die den Standort des Spielers verfolgt? Dies könnte es schwierig machen, die Schadensfilterung zu implementieren. Außerdem verwischen die Linien zwischen angehängten Komponenten und Entitäten.
Edit: Ich denke, es gibt nicht genug "autonomes Verhalten" für eine getrennte Einheit. In diesem speziellen Fall folgt ein Schild dem Ziel, arbeitet für das Ziel und überlebt das Ziel nicht. Während ich der Meinung bin, dass das Konzept eines "Schildobjekts" nichts auszusetzen hat, handelt es sich in diesem Fall um ein Verhalten, das in eine Komponente passt. Ich bin aber auch ein Verfechter rein logischer Entitäten (im Gegensatz zu vollständigen Entitätssystemen, in denen Transform- und Rendering-Komponenten zu finden sind).
Sollte der Schild eine Komponente sein, die andere Komponenten beherbergt? Ich habe so etwas noch nie gesehen oder gehört, aber vielleicht ist es üblich und ich bin einfach noch nicht tief genug.
Sehen Sie es aus einer anderen Perspektive; Durch Hinzufügen einer Komponente werden auch andere Komponenten hinzugefügt, und beim Entfernen werden auch die zusätzlichen Komponenten entfernt.
Sollte der Schild nur eine Reihe von Komponenten sein, die dem Player hinzugefügt werden? Möglicherweise mit einer zusätzlichen Komponente, um die anderen zu verwalten, z. B. damit alle als Gruppe entfernt werden können. (Lassen Sie aus Versehen die Schadensreduzierungskomponente hinter sich, das würde Spaß machen).
Dies könnte eine Lösung sein, würde die Wiederverwendung fördern, ist jedoch auch fehleranfälliger (z. B. für das von Ihnen erwähnte Problem). Es ist nicht unbedingt schlecht. Vielleicht findest du neue Zauberkombinationen mit Versuch und Irrtum :)
Noch etwas, das für jemanden mit mehr Erfahrung mit Komponenten offensichtlich ist?
Ich werde etwas näher darauf eingehen.
Ich glaube, Sie haben bemerkt, wie einige Komponenten Vorrang haben sollten, unabhängig davon, wann sie zu einer Entität hinzugefügt wurden (dies würde auch Ihre andere Frage beantworten).
Ich gehe auch davon aus, dass wir eine nachrichtenbasierte Kommunikation verwenden (aus Diskussionsgründen handelt es sich derzeit nur um eine Abstraktion über einen Methodenaufruf).
Immer wenn eine Schildkomponente "installiert" wird, werden die Meldungsbehandlungsroutinen für Schildkomponenten mit einer bestimmten (höheren) Reihenfolge verkettet.
Handler Stage Handler Level Handler Priority
In Pre System High
Out Invariant High
Post AboveNormal
Normal
BelowNormal
Low
System Low
In - incoming messages
Out - outgoing messages
Index = ((int)Level | (int)Priority)
Die "Statistik" -Komponente installiert einen "Schadens" -Meldungshandler im In / Invariant / Normal-Index. Verringern Sie die HP jedes Mal, wenn eine Schadensmeldung eingeht, um den entsprechenden Wert.
Ziemlich normales Verhalten (setzen Sie natürliche Schadensresistenz und / oder Rassenmerkmale ein, was auch immer).
Die Schildkomponente installiert einen "Schadens" -Meldungshandler im In / Pre / High-Index.
Every time a "damage" message is received, deplete the shield energy and substract
the shield energy from the damage value, so that the damage down the message
handler pipeline is reduced.
damage -> stats
stats
stats.hp -= damage.value
damage -> shield -> stats
shield
if(shield.energy) {
remove_me();
return;
}
damage.value -= shield.energyquantum
shield.energy -= shield.energyquantum;
stats
stats.hp -= damage.value
Sie sehen, dass dies ziemlich flexibel ist, obwohl dies eine sorgfältige Planung beim Entwerfen der Komponenteninteraktion erfordern würde, da Sie bestimmen müssen, in welchem Teil der Nachrichtenbehandlungspipeline Komponenten-Ereignishandler für Nachrichten installiert sind.
Macht Sinn? Lassen Sie mich wissen, ob ich weitere Details hinzufügen kann.
Bearbeiten: In Bezug auf Instanzen mit mehreren Komponenten (zwei Rüstungskomponenten). Sie können entweder die Gesamtzahl der Instanzen in nur einer Entitätsinstanz nachverfolgen (dies beendet jedoch den Status pro Komponente) und einfach weitere Ereignishandler hinzufügen oder sicherstellen, dass Ihre Komponentencontainer im Voraus doppelte Komponententypen zulassen.