Scripte:Eigenschaften speichern
Aus Clonk Wiki
| Eigenschaften speichern | |
|---|---|
| Kategorie: | Script |
| Autor: | Mot |
| Behandelt: | {{{Behandelt}}} |
| Empfohlenes Vorwissen: | {{{Vorwissen}}} |
| Benötigt Objektpacks: | {{{Packs}}} |
| Stufe: | |
Inhaltsverzeichnis |
Allgemein
Im folgenden Artikel werde ich erklären, was Bits sind, und wie die zugehörigen Bit-Operatoren funktionieren.
Es ist oft nötig, dass für ein Objekt gewisse Eigenschaften gespeichert werden müssen.
Folgende Möglichkeiten gäbe es dazu:
local
mag_tomaten;
local
mag_pizza;
local
mag_fleisch;
local
mag_bananen;
local
mag_eier;
protected
func
Initialize()
{
mag_tomaten
=
true;
mag_pizza
=
false;
//Nah, keine Pizza
mag_fleisch
=
false;
//Nah, keine armen Tiere :(
mag_bananen
=
true;
mag_eier
=
true;
//Die dann aber schon :D
}
if(mag_tomaten)
Log("Ich esse Tomaten");Eine andere Möglichkeit ist:
eigenschaften
=
CreateArray(5);
eigenschaften[0]
=
true;
//wir moegen Tomaten
eigenschaften[1]
=
false;
//pizza nicht
eigenschaften[2]
=
false;
//arme Tiere
eigenschaften[3]
=
true;
//Bananen sind fein
eigenschaften[4]
=
true;
//das Ei auch
<c4script>
Der
Zugriff
erfolgt
nun
über
<c4script>if(eigenschaften[0])
Log("Ich esse Tomaten");Ich möchte jedoch noch eine dritte Möglichkeit einführen.
Mehrere Eigenschaften in einer Zahl speichern
Bevor wir mit Code hantieren müssen wir wissen was wir tun, und wieso es funktioniert. Eine Zahl besteht aus Bytes und Bits. In Clonk hat eine Zahl 32 Bit, also 4 Bytes. Interessant für uns sind jedoch nur die Bits. Ein Bit kann entweder 0 oder 1 sein. Das heisst, wir können in einer einzigen Zahl 32 Eigenschaften speichern. Ist Bit 0 auf 1 gesetzt, wissen wir zum Beispiel, dass das Objekt Tomaten mag. Ist Bit 2 auf 0, wissen wir, dass das Objekt offensichtlich vegetarisch lebt.
Um mit den Bits einer Zahl zu hantieren, benötigen wir spezielle Operatoren. +,-,* und / können wir nicht dafür benutzen. Genau gesagt benötigen wie die Operatoren mit dem Stichwort 'bitweise'.
Der Oder-Operator
Der Oder-Operator sieht so aus: "|".
1
|
0
=
1;
1
|
1
=
1;
0
|
1
=
1;
0
|
0
=
1;
Beim Oder gilt folgende Regel: Ist ein Wert 1 (WAHR) so ist das Ergebnis 1 (WAHR).
Der Und-Operator
Der Und-Operator sieht so aus: "&".
1
&
0
=
0;
1
&
1
=
1;
0
&
1
=
0;
0
&
0
=
0;
Beim Und gilt folgende Regel: Sind beide Werte 1 (WAHR) so ist das Ergebnis 1 (WAHR). Alles andere ergibt 0 (FALSCH).
Der Exklusives-Oder-Operator
Abgekürzt spricht man hier von XOr. Dieser Operator sieht so aus: "^";
1
^
1
=
0;
1
^
0
=
1;
0
^
1
=
1
0
^
0
=
0;
Das Interessante an diesem Operator ist, dass er umkehrbar ist. So ergibt
x
^
y
=
z;
z
^
y
=
xDieser Operator findet beispielsweise in Verschlüsselungen eine Verwendung, ist für unseren Zweck jedoch nicht Wichtig.
Die Bitshift-Operatoren
Diese Operatoren ("<<","">>") dienen dazu, alle Bits entweder nach links oder nach rechts zu verschieben. Aufgefüllt wird dabei mit Nullen.
111
<<
1
=
1110;
111
<<
2
=
11100;
111
>>
1
=
11;
111
>>
2
=
1;
n
<<
5;(1 << 5 = 100000)
Los geht's
Damit wissen wir nun genug und wir können mit dem Scripten anfangen.
/* Erstmal alle Werte definieren */
static
const
MAG_TOMATEN
=
(1
<<
0);
static
const
MAG_PIZZA
=
(1
<<
1);
static
const
MAG_FLEISCH
=
(1
<<
2);
static
const
MAG_BANANEN
=
(1
<<
3);
static
const
MAG_EIER
=
(1
<<
4);
/* Gut, dann brauchen wir einen Wert in dem wir die Sachen speichern */
local
Eigenschaften;
/* Hier definieren wir einige Hilfsfunktionen */
/* Benoetigt man nicht zwangsweise, siehe unten */
global
func
AddFlag(&value,flag)
{
value
=
(value
|
(1
<<
flag));
}
global
func
CheckFlag(value,flag)
{
if((value
&
(1
<<
flag))
==
(1
<<
flag))
return
true;
else
return
false;
}
protected
func
Initialize()
{
Eigenschaften
=
Eigenschaften
|
MAG_TOMATEN;
//Wir mögen doch Tomaten?
Eigenschaften
=
Eigenschaften
|
MAG_BANANEN;
Eigenschaften
=
Eigenschaften
|
MAG_EIER;
//So, das mögen wir auch
/* Anstatt obigen Code wäre auch folgendes möglich
AddFlag(Eigenschaften,0); //0 sind Tomaten
AddFlag(Eigenschaften,3); //3 sind Bananen
AddFlag(Eigenschafetn,4); //4 sind Eier
*/
}
/* Überprüfen geht nun so */
public
func
EatPizza()
{
//Moment, Mag ICH Pizza?
if((Eigenschaften
&
MAG_PIZZA)==MAG_PIZZA)
//Da Clonk alles ungleich 0 umwandelt ginge auch if(EIGENSCHAFTEN & MAG_PIZZA)
DoEnergy(+10);
//Wir essen Pizza
else
Message("NAAAH! Keine Pizza!",this);
//Wir essen keine Pizza
/* Folgendes wäre auch möglich
if(CheckFlag(Eigenschaften,2)) [...] //2 ist die Pizza
*/
}
| Scripte des Scripte-Projekts | |
| Bonbon · Context-Eintrag · EliminateTeam · Flint:Partikelschleuder · Hüpfbonbon · TeamMessage | |
| Flint:HitCounter · Flint:Partikelkreis · Flint:Partikelschleuder2 · Is-Funktionen · Menü:Beim Start der Runde · Normaler Flint · Partikel-Linie in den Himmel · Rakete · Random · Relaunch · Return · Sichtweite · Spawn · Startposition | |
| Clantag · Gift-Effekt · Unverwundbarkeit · Scoreboard · Zufallsgespräch | |
| Lebensbalken · Nachrichten bei Sichtkontakt · Object2Overlay · SHA1 | |
| Dieser Artikel wurde gemäß der Scriptrichtlinien veröffentlicht. |
