-
Frage zu Bitmasken
Da bei mir alle Aivars belegt sind, habe ich mich endlich mal an Bitmasken herangewagt.
Habe eine recht gute Erläuterung von Lehona in einem Thread gefunden.
Trotzdem hätte ich ein paar kurze Fragen dazu, nur zur Sicherheit.
1)
Wenn man eine Aivar gleich im Npc-Script setzt, kann man ja normalerweise das "self" weglassen.
Bsp:
Code:
//original
aivar[99] = True;
//Vorlage
self.aivar[AIV_CONTAINER] = AddContainerAivar(self.aivar[AIV_CONTAINER], AIV_CONT_xxx);
//so siehts bei mir aus
aivar[AIV_CONTAINER] = AddContainerAivar(self.aivar[AIV_CONTAINER], AIV_CONT_xxx);
//kann man das auch komplett ohne "self" schreiben, also so
aivar[AIV_CONTAINER] = AddContainerAivar(aivar[AIV_CONTAINER], AIV_CONT_xxx);
2)
Kann man mehrere Bitcontainer erstellen?
3)
Wenn man Aivars in den Container verschiebt, müssen die verbleibenden dann durchgängig nummeriert sein, ober kann ich beispielsweise von aivar[60] zu aivar[70] springen?
Vielen Dank, im Voraus.
Edit: zur Info...der Parser hat meine jetzige Variante zumindest nicht beanstandet.
MfG
Geändert von TheBigLeBRUCEky (10.05.2018 um 21:06 Uhr)
-
Für die Fragen wäre es wohl hilfreich, wenn du die entsprechenden Funktionen postest, die du da aufrufst
Zu 3.: Aivars kannst du wie belieben benutzen, auch mit Lücken.
-
Zitat von Lehona
Für die Fragen wäre es wohl hilfreich, wenn du die entsprechenden Funktionen postest, die du da aufrufst
Zu 3.: Aivars kannst du wie belieben benutzen, auch mit Lücken.
Danke, schonmal, für die Antwort.
Sorry, ich dachte, dass das unnötig ist, da ich die Funktionen deinem Post entnommen habe.
Eigentlich hätte mir klar sein müssen, dass du nicht nur diesen einen Post verfasst hast.^^
Code:
//Auslesen
func int HasContainerAivar(var int container, var int aivar)
{
return (container & aivar);
};
//auf True setzen
func int AddContainerAivar(var int container, var int aivar)
{
return (container | aivar);
};
//auf False setzen
func int DelContainerAivar(var int container, var int aivar)
{
return (container &~aivar);
};
Denke mal, die Bitmaske der Aivars, musst du nicht sehen.
MfG
-
Wow, der Post ist ja schon ein Stück älter, an den konnte ich mich tatsächlich kaum erinnern
Zu 1.: Das 'self' solltest du in NPC-Instanzen komplett weglassen können. Aber lieber kurz selber ausprobieren, geht ja ganz schnell.
Zu 2.: Das Wort "Container" ist ein ganz kleines Stück irreführend. Hier wird einfach nur ausgenutzt, dass viele AIVars nur zwei Zustände darstellen (True/False), ein Integer aber 232 Zustände darstellen kann. Anstatt tatsächlich 232 Zustände zu benutzen, kann man in einem Integer auch 32 voneinander unabhängige Zustände speichern (Ein Zustandspaar pro Bit). Kurz gesagt: Wenn du mehr Platz brauchst, wirst du einfach noch eine zweite AIVar als "Container" missbrauchen müssen (für insgesamt 64 unabhängige Zustandspaare).
Du solltest dich einfach ein bisschen mit den verwendeten Bitoperatoren (|, & und ~) auseinandersetzen, dann sollte es eigentlich sehr schnell klar werden, wie und warum das funktioniert. Dann kannst du bestimmt auch noch eigene Funktionen definieren, mit denen du größere AIVars (d.h. mehr als 2 Zustände) in diesem Container unterbringen kannst. Wird dann allerdings noch ein ganzes Stück unhandlicher
-
Zitat von Lehona
Wow, der Post ist ja schon ein Stück älter, an den konnte ich mich tatsächlich kaum erinnern
Zu 1.: Das 'self' solltest du in NPC-Instanzen komplett weglassen können. Aber lieber kurz selber ausprobieren, geht ja ganz schnell.
Zu 2.: Das Wort "Container" ist ein ganz kleines Stück irreführend. Hier wird einfach nur ausgenutzt, dass viele AIVars nur zwei Zustände darstellen (True/False), ein Integer aber 2 32 Zustände darstellen kann. Anstatt tatsächlich 2 32 Zustände zu benutzen, kann man in einem Integer auch 32 voneinander unabhängige Zustände speichern (Ein Zustandspaar pro Bit). Kurz gesagt: Wenn du mehr Platz brauchst, wirst du einfach noch eine zweite AIVar als "Container" missbrauchen müssen (für insgesamt 64 unabhängige Zustandspaare).
Du solltest dich einfach ein bisschen mit den verwendeten Bitoperatoren (|, & und ~) auseinandersetzen, dann sollte es eigentlich sehr schnell klar werden, wie und warum das funktioniert. Dann kannst du bestimmt auch noch eigene Funktionen definieren, mit denen du größere AIVars (d.h. mehr als 2 Zustände) in diesem Container unterbringen kannst. Wird dann allerdings noch ein ganzes Stück unhandlicher
Nochmals danke.
Ich denke, das mit den Zuständen True/False habe ich verstanden.
Hab nur Aivars in den Container geschoben, die nur diese Zustände annehmen.
Dadurch werden ja einige Aivars frei, welche ich dann für Features nutzen kann, bei denen eine Aivar auch andere Werte annimmt.
Die Frage nach mehreren Containern diente nur zur Klarstellung, ob ich noch einen erstellen kann, falls später nochmals Platzmangel herrscht.
Mit den Operatoren habe ich mich schon mal ein Wenig beschäftigt, allerdings fehlen mir die Programmierkenntnisse, um richtig zu verstehen, wann und wie man sie richtig verwendet.
Soviel ich weiß, sind es bitweise Operatoren, die beispielsweise bei Flags genutzt werden.
Eine Frage noch:
Gibt es eine Auflistung, der Aivars, die von der Engine verwendet werden?
Damit ich keinen davon in den Container schiebe.
MfG
Geändert von TheBigLeBRUCEky (11.05.2018 um 16:45 Uhr)
-
Ich glaube Nico hat mal gesagt, dass die Engine nur AIV_Invincible (oder wie auch immer der heißt - der eine halt, der öfter Probleme mit Dialogen macht ) kennt.
Die Bitoperatoren heißen so, weil sie die Operanden nicht als Zahlen (Integer) interpretieren sondern als die binäre Darstellung dieser Zahl. Das heißt dass die Operatoren |, & und ~ sozusagen 32 Mal angewendet werden: Einmal für jedes Bit (bei | und & gilt das natürlich für jeweils ein Bit der linken und rechten Seite, an der gleichen Position).
Im Folgenden ein paar Beispiele, alle Zahlen sind binär dargestellt (und auf 8bit gekürzt).
Code:
Der |-Operator wird auch "binäres Oder" genannt. Ist mindestens eines der beiden Bits 1, ist auch das Ergebnis 1.
01010001
|01011010
=01011011
Der &-Operator heißt dementsprechend "binäres Und". Sind beide Bits auf 1, ist auch das Ergebnis 1 (sonst 0).
01010001
&01011010
=01010000
Der ~-Operator ist ein unärer Operator (nur ein Operand), vergleichbar mit dem unären Minus. Alle Bits werden umgedreht.
~01010001
=10101110
Der Trick ist jetzt, dass die AIVar-Bitmasken einfach nur ein einziges Bit an der richtigen Stelle gesetzt haben. Zum Beispiel:
const int AIV_Cont_xxx = 00000100; // Binär dargestellt - kann man so natürlich nicht schreiben in Daedalus
Wendet man jetzt die Funktion zum Setzen dieses AIVars auf einen unbekannten Zustand an:
xxxxxxxx
|00000100
=xxxxx1xx
Hier hat sich also der Zustand nur an der gewünschten Stelle verändert.
Die anderen Funktionen sollten ebenfalls klar werden, wenn du das einfach mal wie im Beispiel aufschreibst.
-
Zitat von Lehona
Ich glaube Nico hat mal gesagt, dass die Engine nur AIV_Invincible (oder wie auch immer der heißt - der eine halt, der öfter Probleme mit Dialogen macht ) kennt.
Die Bitoperatoren heißen so, weil sie die Operanden nicht als Zahlen (Integer) interpretieren sondern als die binäre Darstellung dieser Zahl. Das heißt dass die Operatoren |, & und ~ sozusagen 32 Mal angewendet werden: Einmal für jedes Bit (bei | und & gilt das natürlich für jeweils ein Bit der linken und rechten Seite, an der gleichen Position).
Im Folgenden ein paar Beispiele, alle Zahlen sind binär dargestellt (und auf 8bit gekürzt).
Code:
Der |-Operator wird auch "binäres Oder" genannt. Ist mindestens eines der beiden Bits 1, ist auch das Ergebnis 1.
01010001
|01011010
=01011011
Der &-Operator heißt dementsprechend "binäres Und". Sind beide Bits auf 1, ist auch das Ergebnis 1 (sonst 0).
01010001
&01011010
=01010000
Der ~-Operator ist ein unärer Operator (nur ein Operand), vergleichbar mit dem unären Minus. Alle Bits werden umgedreht.
~01010001
=10101110
Der Trick ist jetzt, dass die AIVar-Bitmasken einfach nur ein einziges Bit an der richtigen Stelle gesetzt haben. Zum Beispiel:
const int AIV_Cont_xxx = 00000100; // Binär dargestellt - kann man so natürlich nicht schreiben in Daedalus
Wendet man jetzt die Funktion zum Setzen dieses AIVars auf einen unbekannten Zustand an:
xxxxxxxx
|00000100
=xxxxx1xx
Hier hat sich also der Zustand nur an der gewünschten Stelle verändert.
Die anderen Funktionen sollten ebenfalls klar werden, wenn du das einfach mal wie im Beispiel aufschreibst.
Sehr gute Erklärung...danke.
Hatte mir gerade nochmal die Ausdrücke im Editing-Wiki angesehen und dann nach "Informatik Operatoren" gegoogelt.
Auf der Seite, die ich mir angesehen habe, stand es nicht so gut erklärt, aber man konnte trotzdem erkennen, was z.B. (|, &, <<, >>) mit dem Bits machen.
MfG
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|