Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 7 von 7
  1. Beiträge anzeigen #1 Zitieren
    Schwertmeister Avatar von TheBigLeBRUCEky
    Registriert seit
    Apr 2014
    Beiträge
    997
     
    TheBigLeBRUCEky ist offline

    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)

  2. Beiträge anzeigen #2 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    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.

  3. Beiträge anzeigen #3 Zitieren
    Schwertmeister Avatar von TheBigLeBRUCEky
    Registriert seit
    Apr 2014
    Beiträge
    997
     
    TheBigLeBRUCEky ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    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

  4. Beiträge anzeigen #4 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    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

  5. Beiträge anzeigen #5 Zitieren
    Schwertmeister Avatar von TheBigLeBRUCEky
    Registriert seit
    Apr 2014
    Beiträge
    997
     
    TheBigLeBRUCEky ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    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
    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)

  6. Beiträge anzeigen #6 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    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.

  7. Beiträge anzeigen #7 Zitieren
    Schwertmeister Avatar von TheBigLeBRUCEky
    Registriert seit
    Apr 2014
    Beiträge
    997
     
    TheBigLeBRUCEky ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    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
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide