Der Wechselschalter: Eine erste Kontrollstruktur

Mit einem Wechselschalter lernen wir ein weiteres Grundelement kennen, das es in dieser oder sehr ähnlicher Form in jeder Programmiersprache gibt: Eine auf Bedingungen aufgebaute Kontrollstruktur.

Erinnern wir uns noch einmal an das Kochrezept, in dem es heißt:

Die Selleriewürfel in Olivenöl unter ständigem Rühren in einem Topf goldgelb andünsten.

Man könnte es auch anders sagen: Dünste die Selleriewürfel so lange in Olivenöl, bis sie goldgelb sind. Erst wenn diese Bedingung erfüllt ist, geht es weiter im Rezept.

In LSL gibt es mehrere Möglichkeiten, Kontrollstrukturen in ein Script einzubauen. Beginnen wir mit einer if-else-Bedingung. Wenn die Bedingung wahr ist, dann verfahre wie im folgenden Klammerblock angegeben. Ansonsten mache das, was mit zweiten Klammerblock steht.

Die Bedingung ist in diesem Fall eine ganzzahlige Variable integer schalter = 0;, die wir unserer Sammlung globaler Variablen hinzufügen. Eigentlich würde es sogar ausreichen, sie als integer schalter; zu deklarieren, denn auch dann würde sie stillschweigend den Wert 0 zugeordnet bekommen. Aus Gründen einfacherer Lesbarkeit werden wir aber die Langfassung erst einmal so stehenlassen.

Die if-else-Bedingung wird im Event touch_start untergebracht. Man beachte dabei, dass beide Teilbedingungen kein Semikolon aufweisen, sondern wie ein State oder ein Event geschweifte Klammern: Von hier bis dort gilt die eingangs definierte Bedingung. Ein Abprüfen einer Bedingung findet allerdings hier nur im if-Teil statt:

if (schalter == 0)

Das doppelte Gleichheitszeichen ist keine Zuweisung, sondern ein Vergleichsoperator "ist gleich". Dementsprechend liest sich diese Bedingung: Wenn schalter genau den Wert 0 hat, dann führe alles aus, was zwischen den Klammern dahinter steht.

Der else-Teil gilt hingegen für alle Fälle, in denen die Schaltvariable ungleich 0 ist. In LSL ausgeschrieben wäre es schalter != 0. Doch ein solch unnötiger Vergleich würde nur Zeit und Rechenleistung kosten, so dass man darauf verzichten kann.

Da aber ein Schalten nur funktionieren kann, wenn man auch die Bedingung ändert, geschieht das immer als letztes im jeweiligen Bedingungsblock: Wird im if-Teil schalter = 1;, wechselt der Wert im else-Teil wieder zurück auf 0.

Die restlichen Anpassungen am Hovertext-Script sind mit unserem inzwischen erworbenen Vorwissen eigentlich nur noch Fleißarbeit, so dass sich diese aus dem nachfolgenden Screenshot schon selbst erklären dürften:

Wechselschalter

Was man mit so einem Wechselschalter noch anfangen kann, werden wir in der nächsten Lektion beim Skripten eines Sitzscripts für zwei Animationen kennenlernen.

Exkurs: Der schlanke Toggle des Mr. Boole

Als ich meiner programmiererfahrenen Freundin Elke von dem Wechselschalter erzählt habe, meinte sie nur lakonisch: "Aber das ist doch nur eine Zeile Code! Es wird auf TRUE und FALSE geprüft und fertig ist der Schalter."

Recht hat sie, denn so eine logische Prüfung ist noch einfacher zu machen als die in unserem Beispiel. Zwar gibt es in LSL die besagten, immer groß geschrieben Konstanten für "wahr" oder "falsch", sie bilden aber nicht wie in anderen Programmiersprachen einen eigenen Datentyp. Diese logischen Konstanten werden durch die integer-Werte 0 und 1 nachgebildet. So sieht dieser Boolesche Wechselschalter als LSL-Code aus, in dem allerdings interessanter TRUE und FALSE gar nicht ausgeschrieben, sondern gewissermaßen nur hinter den Zeilen vorhanden sind:

Boolescher Wechselschalter

Schlüssel zur Kürze ist die logische Operation schalter = !schalter, die noch vor dem if-else-Teil den in der Variable gespeicherten Wert in sein Gegenteil verkehrt. So wird die anfängliche 0 (als Boolesche Konstante: FALSE) in das Gegenteil 1 (= TRUE) verkehrt. Die folgende if-Bedingung wird erfüllt, beim nächsten Durchlauf des Events aber nicht mehr, beim übernächsten wieder usw. Dabei kann in den Bedingungsblöcken selbst die Zuweisung eines neuen Wertes für schalter entfallen.

Probiert das Script einfach mal aus. Die llOwnerSay-Funktionen geben die aktuellen Schaltwerte als 0 oder 1 an, so dass man klar sehen kann, wie der Schalter arbeitet.

Einen kleinen Nachteil hat dieser Wechselschalter gegenüber unserer Langfassung aber doch: Auf diese Weise kann wirklich nur zwischen zwei Zuständen hin- und hergewechselt werden. Eine spätere Erweiterung auf drei oder mehr Zustände kann so nicht realisiert werden.

Namenspatron ist übrigens der britische Mathematiker George Boole (1815-1864), der den Grundstein für die formale Logik und die Rechentechnik gelegt hat (siehe auch Wikipedia-Artikel).

© 2012 ff. Almut Brunswick. Nur für den persönlichen Gebrauch! Aus rechtlichen Gründen distanziere ich mich von allen externen Links.