Aufgrund einer akuten Spamwelle ist das Editieren für nicht angemeldete Benutzer zur Zeit deaktiviert. Wir bitten um Verständnis.

Scripte:Eigenschaften speichern

Aus Clonk Wiki

Wechseln zu: Navigation, Suche
  Eigenschaften speichern
Kategorie: Script
Autor: Mot
Behandelt: {{{Behandelt}}}
Empfohlenes Vorwissen: {{{Vorwissen}}}
Benötigt Objektpacks: {{{Packs}}}
Stufe: Profi Profi Profi

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:

C4Script
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
}
Die Eigenschaften können nun einfach via
C4Script
if(mag_tomaten)
 
Log("Ich esse Tomaten");
überprüft werden.

Eine andere Möglichkeit ist:

C4Script
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: "|".

C4Script
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: "&".

C4Script
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: "^";

C4Script
1
 
^
 
1
 
=
 
0;
1
 
^
 
0
 
=
 
1;
0
 
^
 
1
 
=
 
1
0
 
^
 
0
 
=
 
0;

Das Interessante an diesem Operator ist, dass er umkehrbar ist. So ergibt

C4Script
x
 
^
 
y
 
=
 
z;
 
z
 
^
 
y
 
=
 
x

Dieser 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.

C4Script
111
 
<<
 
1
 
=
 
1110;
111
 
<<
 
2
 
=
 
11100;
111
 
>>
 
1
 
=
 
11;
111
 
>>
 
2
 
=
 
1;
Wenn wir nun
C4Script
n
 
<<
 
5;
schreiben wissen wir, dass das fünfte Bit auf 1 ist und alle anderen 0.

(1 << 5 = 100000)

Los geht's

Damit wissen wir nun genug und wir können mit dem Scripten anfangen.

C4Script
/* 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
AnfängerBonbon · Context-Eintrag · EliminateTeam · Flint:Partikelschleuder · Hüpfbonbon · TeamMessage
Fortgeschrittene FortgeschritteneFlint: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
Profi Profi ProfiClantag · Gift-Effekt · Unverwundbarkeit · Scoreboard · Zufallsgespräch
Experte Experte Experte ExperteLebensbalken · Nachrichten bei Sichtkontakt · Object2Overlay · SHA1


Wipfhunt.png Dieser Artikel wurde gemäß der Scriptrichtlinien veröffentlicht.
extern