Wenn ich das jetzt richtig sehe, dann dauert es ab jetzt nicht mehr
lange und
ein neues Skript wird geboren :-)
Viel Spaß
Ich gehe mal davon aus, daß, wer auch immer dies jetzt liest schon
mal ein Skript mit Monzoom verwendet hat.
Daher kann ich mir es wohl sparen, zu erzählen, daß man
doch einiges damit anstellen kann.Objekte erstellen,
Objekte vernichten, Objekte bearbeiten, Szenen laden, Szenen
speichern, Szenen wieder schließen,
Animationen erstellen, neue Funktionen und Effekte
schreiben.Wenn einer von euch mal
ein bisschen Zeit hat, dann kann er diese Liste ja weiterführen.
Im Allgemeinen gilt:
Je mehr ihr euch ausdenken könnt, desto mehr ist realisierbar
und desto
weiter entwickelt sich Monzoom - auch ohne Oberland.
Los geht's:
Ein Monzoom-Skript ist eine normale Textdatei. Nur hat sie nicht die
Endung *.txt, sondern:
*.men, *.afx, *.tol, *.skr
"*.men"-Skripts werden in das Verzeichnis \monzoom\Skripts\ gespeichert.
Ich persönlich schreibe immer im Editor (notepad). Um die Datei
mit der einer dieser Endungen zu
speichern muß man Dateinamen und Dateiendung in Anführungsstrichen
schreiben. (z.B.: "hallowelt.men")
In diesem Tutorial werde ich, da es sich ja um einen Einstieg in die
Monzoom-Skriptsprache handelt, nur auf
die Skripts mit der Endung men eingehen. Dies sind die Skripts, die
normalerweise über das 'S' im Monzoom-
Fenster aufgerufen werden. (Oder über das Skript-Starter Plugin
von Thomas Kunert)
Genug erzählt: Kommen wir nun zum ersten Skript mit Monzoom.
In den Quelltext-Beispielen in diesem Tutorial verwende ich verschieden
Farben, um Veränderungen
deutlich zu machen. Die Farben bedeuten folgendes:
(schwarz) -alter Text (war auch schon vorher da)
(grün) -neuer Text (ist erst in diesem Schritt
dazugekommen)
(rot) -veränderter Text (Die Zeile wurde
in diesem Schritte verändert)
Monzoom erkennt eine Datei erst dann als Skript an, wenn es hinten eine
der oben genannten Endungen hat, und
wenn in der ersten Zeile das Wort : REFSKRIPT steht. Daraufhin
weiß Monzoom, daß es eine Skriptdatei vor
sich hat, die jetzt ausgeführt werden soll.
REFSKRIPT |
REFSKRIPT
RETURN 1 |
REFSKRIPT
Anweisungen/Befehle RETURN 1 |
REFSKRIPT
print Hallo Welt RETURN 1 |
Nun speichern wir die Datei unter dem Namen "meinskript.men" in das
Verzeichnis "...\monzoom\Skripts\" und
starten Monzoom. Wenn wir das Skript ausführen, dann erscheint
unten der Text "Hallo Welt". Dieser Befehl
macht zwar nichts weltbewegendes, aber man kann ihn gut gebrauchen,
um Informationen (z.B. über den
Fortschritt bei komplizierteren Berechnungen) auszugeben.
Nun wollen wir aber dazu kommen, uns ein 'wirklich sinnvolles' Skript
zu schreiben. ;-)
Das Skript soll einen Quader erstellen - und zwar anhand der Angaben
des Benutzers.
Dazu brauchen wir als erstes die Angaben des Benutzers.Wir müssen
Monzoom also dazu bringen, den Benutzer
nach den Werten zu fragen, die wir später brauchen.
Als erstes wollen wir einen Namen für den Quader erfragen. Wir
könnten im Skript auch selber einen Namen für das
neue Objekt wählen, aber dieser könnte dem Benutzer nicht
gefallen, und wir wollen ja benutzerfreundlich bleiben ;-))
Um diese Abfrage zu starten benutzen wir den Befehl: GET_STRING
Dieser Befehl, der ja soviel heißt, wie "Hole einen String",
läßt ein Fenster erscheinen, in das der Benutzer einen String
eingeben
kann. Ein String ist in Programmiersprachen ein Text
(Also bei uns das Wort, das als Name dienen soll - ein String kann
natürlich auch Zahlen enthalten).
Für das Fenster können wir uns auch noch eine Frage
überlegen, damit der Benutzer überhaupt weiß, was er eintragen
soll.
REFSKRIPT
GET_STRING Wie soll der Quader heißen ? RETURN 1 |
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
RETURN 1 |
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung? RETURN 1 |
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
RETURN 1 |
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
RETURN 1 |
DREI_QUADER <name> <dx> <dy>
<dz>
Beschreibung: Erzeugt einen Quader aus Dreiecken.
|
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
DREI_QUADER quadername x y z RETURN 1 |
Wir klicken also auf das S-Symbol im Hauptfenster und wählen das Skript
aus (oder starten das Skript mit dem Skriptstarter-Plugin).
Dann geben wir den Namen und die anderen Werte ein. Wenn wir fertig sind,
dann: - sehen wir nichts ! - das macht aber nichts.
Das neue Objekt ist nur nicht in der aktuellen PKL (Plotkörperliste).
Wenn man das Objekt in der PKL aufnimmt, dann sieht man
sofort den fertigen Quader. - unglaublich - es hat geklappt.
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
DREI_QUADER quadername x y z PKL_ADD quadername RETURN 1 |
Das Skript funktioniert jetzt - man darf sich hier also getrost auf die Schulter
klopfen.Nun folgt der zweite Teil des Tutorials. Hier wird
noch einiges an dem Skript verändert. Ein paar Dinge, die noch ausgelassen
wurden, werden hier richtiggestellt und manches wird ausgedehnt.
Desweiteren gibt es noch eine kurze Hilfe, zum Auffinden der richtigen Befehle
in der offiziellen Monzoom-Skript-Doku..
TEIL ZWEI
Und es geht weiter....
Oben haben wir gelesen, daß der Befehl DREI_QUADER keinen Wert
zurückliefert - das ist nicht ganz korrekt. In Wirklichkeit liefert
der Befehl sogar einen sehr wichtigen Wert zurück.
Wenn wir das Skript zweimal ausführen und in beiden Fällen den gleichen
Namen für den Quader eingeben, (z.B. 'klotz'), dann funktioniert
beim ersten Mal alles ganz normal. Das Objekt wird erstellt und und unter
dem Namen 'klotz' in die PKL aufgenommen. Wenn wir das Skript
zum zweitem Mal aufrufen und wieder den Namen 'klotz' angeben, dann wird das
Objekt nicht in die PKL aufgenommen und heißt auch nicht
'klotz' sondern 'klotz1'. Das liegt daran, daß zwei Objekte in Monzoom
nicht den gleichen Namen haben dürfen. In der Skriptzeile:
PKL_ADD quadername
soll nun das Objekt mit dem Namen, der in der Variable quadername gespeichert
ist in die PKL aufgenommen werden. In der Variable ist der
Wert 'klotz' gespeichert. Das Objekt hat allerdings den Namen 'klotz1' (weil
es 'klotz' ja schon gibt).
Das Problem wird durch dem Wert(String) gelöst, den DREI_QUADER zurückliefert.
Dieser String enthält den Namen, den das
Objekt wirklich bekommen hat - in unserem Fall wäre dies 'klotz1'. Den
String können wir (wie immer) mit GET_RESULT abfragen.
Hinter GET_RESULT müssen wir natürlich auch wieder eine Variable
angeben, in der der Rückgabewert (in diesem Fall der 'echte' Name
der Objekts= 'klotz1') gespeichert wird. Als Variable verwende ich hier einfach
mal 'echter_name'.
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
DREI_QUADER quadername x y z
PKL_ADD quadername RETURN 1 |
PKL_ADD quadername
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
DREI_QUADER quadername x y z
PKL_ADD echter_name RETURN 1 |
Besonders aufmerksamen Lesern dieses Tutorials ist es möglicherweise
schon aufgefallen:
Das was das Skript macht, kann Monzoom schon vorher.
DREI_QUADER quadername
x y z
GET_RESULT echter_name PKL_ADD echter_name |
REFSKRIPT
GOTO dahinter print Hallo Welt >dahinter: RETURN 1 |
IF_EQUAL_GOTO IF_GREATER_GOTO IF_LESS_GOTO IF_NOT_EQUAL_GOTO IF_STR_EQUAL_GOTO IF_STR_NOT_EQUAL_GOTO (IF_ABBRUCH_GOTO) |
Um herauszufinden, was die jeweilige 'IF-Konstruktionen' genau macht, sollte
man sie am besten übersetzen - oder man sieht
einfach in der Skriptdokumentation nach ;-)
Als kurzer Tipp: Ich habe die obere Liste nach Funktion eingefärbt.
(blau) Vergleich von Zahlen
(gelb) Vergleich von Strings
(grün) Abbruch Ja oder Nein
REFSKRIPT
GET_REAL Bitte geben Sie eine 5 ein ? IF_EQUAL_GOTO zahl 5 ok >ok: >ende: |
Dieses Skript bittet den Benutzer eine 5 einzugeben. (Zeile 2)
Das, was der Benutzer eingibt wird in die Variable 'zahl' gespeichert. (Zeile
3)
Jetzt wird der Vergleich mit IF_EQUAL_GOTO durchgeführt.
Es wird geprüft, ob
zahl gleich 5 ist - wenn dies zutrifft, dann springt das Skript an die Sprungmarke
>ok:.
Das bedeutet, daß die Meldung*:
"Eine 5 !!! Sie sind ein guter Mensch. Danke :-)"
ausgegeben wird.Dann wird das Skript durch RETURN 1 beendet.
Wenn zahl nicht gleich 5 ist, dann wird das Skript hinter
IF_EQUAL_GOTO zahl 5 ok
normal weiterausgeführt. Das bedeutet, daß die Meldung :
"Sie haben keine 5 eingegeben !!! Das war nicht nett."
ausgegeben wird. Dann springt das Skript wegen der Zeile goto
ende an die Sprungmarke
>ende: und das Skript wird durch RETURN 1 beendet.
Dieses Skript zeigt deutlich, daß das Skript bei verschiedenen Benutzereingaben
verschieden abläuft.
Alle IF-Vergleiche funktionieren nach diesem Prinzip. Wer Skrips, wie das
obrige lustig findet, kann
jetzt gerne ein bisschen experimentieren. :-)
*Meldung: Meldung ist ein Befehl, der ein Fenster erscheinen
läßt in dem ein Text eine Zahl oder eine
Variable angezeigt wird. Erst wenn der Benutzer das Meldungs-Fenster schließt,
wird mit der Ausführung des
Skripts fortgefahren. Wenn das Skript während des Anzeigens einer Meldung
weiter ablaufen soll, dann sollte
man anstelle von MELDUNG den Befehl PRINT verwenden. Er gibt den Text allerdings
nur in der Monzoom-
Statuszeile aus. (siehe auch (weiter oben): "HalloWelt.men")
REFSKRIPT
FUNCTION 1+1
RETURN 1 |
- Zahlen
- numerische Variablen - Winkelfunktionen: sin(), cos(), tan(), asin(), acos(), atan() - Funktionsausdrücke: sqrt(), abs(), log(), log10(), exp() - Operatoren: +, -, *, /, ^ - Klammern: (, ) |
... und weiter geht's !
Mit dem neuen Wissen über GOTO, IF und FUNCTION können
wir nun das Quader-Skript so modifizieren, daß automatisch so viele
Quader erstellt werden, wie es der Benutzer wünscht.
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
GET_INT Anzahl der Quader ?
DREI_QUADER quadername x y z
PKL_ADD echter_name RETURN 1 |
Die Schleife wird folgendermaßen funktionieren:
Der Benutzer wird gefragt, wie viele Quader er erstellen möchte (das
haben wir eben schon in das Skript eingefügt).
Immer, wenn ein Quader erstellt wurde, dann springt das Skript wieder nach
vorne und der nächste Quader wird
erstellt. Das wird solange wiederholt, bis die gewünschte Anzahl erreicht
ist.
REFSKRIPT
GET_STRING Wie soll der Quader heißen ?
GET_REAL Welche x-Ausdehnung?
GET_REAL Welche y-Ausdehnung?
GET_REAL Welche z-Ausdehnung?
GET_INT Anzahl der Quader ?
>erstelle:
FUNCTION anzahl-1
IF_GREATER_GOTO anzahl 0 erstelle RETURN 1 |
Das Skript ist fertig. Es funktioniert.
Natürlich ist das Skript nicht wirklich genial, aber es kann als Beispiel
und Grundstock für weitere
Skripts dienen. Im letzten Teil dieses Tutorials will ich nun darauf eingehen,
wie man recht gut mit der
Skriptdokumentation arbeiten kann. Das wichtigste ist, die Möglichkeitenzu
kennen.
Auch ich kenne kaum Befehle auswendig. Man muß nur wissen, was möglich
ist, und wo man in der Doku
suchen muß. Und das ist gar nicht so schwer.
Die Skriptdokumentation
Erst muß man sich fragen: Was habe ich vor - was soll der Befehl können,
den ich suche ?
Nehmen wir an, wir wollen wissen, in welchem Verzeichnis Monzoom auf dem aktuellen
Rechner
installiert wurde.Wir wollen also einen Wert holen. Das weist darauf
hin, daß wir einen Befehl suchen,
der mit GET_ beginnt. Nun suchen wir in der Skriptdokumentation
unter INDEX bei den GET_-
Befehlen nach einem Befehl, der uns richtig erscheint: Nach kurzem
Suchen finden wir:
GET_REFLECTIONS_DIR
Durch klicken auf den Befehl erhalten wir weitere Infos über die Funktionsweise und die Anwendung.
Wenn wir Informationen nicht abfragen, sondern setzen wollen, dann müssen
wir unter der *_SET_*-Befehlen
suchen.
Jenachdem, was wir wo setzen wollen müssen wir hierzu wieder in der richtigen
Kategorie suchen:
GEO_SET_ORIENT
Dieser Befehl ist ein Geometrieobjekt-Befehl, der die Orientierung
eines Geometrieobjektes setzt (festlegt).
MAT_SET_COLOR
Dieser Befehl ist ein Materialobjekt-Befehl, der die Farbe (color)
eines Materialobjektes setzt (festlegt).
PRT_SET_SIZE
Dieser Befehl ist ein Partikelobjekt-Befehl, der die Größe(size)
und Dichte eines Partikelobjektes setzt (festlegt).
Kommentare
Was man wirklich mal ausprobieren sollte, ist das durchsehen von Skripts,
die andere geschrieben haben. Das
ist manchmal verwirrend (besonders bei meinen Skripts - da blicke ich dann
oft selbst nicht mehr durch), doch
man kann da manchmal tatsächlich etwas lernen.
Zum Glück enthalten viele Skripts 'interne Anleitungen', die erklären,
was an der betreffenden Stelle im Quelltext
gerade passiert. Diese Anmerkungen heißen Kommentare. Kommentare
sind Zeilen im Quelltext, die von Mon-
zoom nicht beachtet werden. Diese Zeilen werden einfach überlesen. Man
kann aus jeder Zeile einen Kommentar
machen. Das ist ganz besonders einfach. Man muß einfach nur ein ';'
vor die Zeile schreiben.
REFSKRIPT
Meldung Zeile 1
RETURN 1 |
REFSKRIPT
;Meldung Zeile 1
RETURN 1 |
REFSKRIPT
;Die nächste Zeile wurde auskommentiert.
Nur das zweite
RETURN 1 |
REFSKRIPT
;#################################################### ;# Dies ist das Demoskript, das im Skript-Tutorial (von mir) erstellt # ;# und erklärt wird. 26.August 2001 (Ich bin jetzt fast fertig :-) # ;#################################################### ; Frage nach dem Namen des zu erstellenden Quaders:
;Ermitteln der Quaderausdehnungen (x,y,z)
;Wie viele Quader sollen erstellt werden ?
>erstelle:
;vermindern des Wertes von anzahl um 1
;Wenn anzahl größer ist, als 0, dann
gehe zur Sprungmarke >erstelle:
;Beendet das Skript (und gibt die Zahl 1 zurück)
|
Das ist dann auch das Ende des Skript-Tutorials. Ich hoffe, daß
es einen brauchbaren Einstieg in die Monzoom
Skriptsprache bietet. Viel Spaß beim Erstellen eigener Skripts.
Bis denn
Helge
e-mail: Helge@Grimhardt.de
homepage: www.ivory-3d.de.lv