home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Inside Multimedia 1995 August
/
IMM0895.ISO01.iso
/
magazin
/
optix
/
disk2
/
optxfpac.set
/
STRUKTUR.INF
< prev
next >
Wrap
Text File
|
1995-04-05
|
19KB
|
480 lines
1. Einmaleins
2. Interaktion
3. Interne Programmstruktur
4. Programmablauf
5. Die erste Linie
---------------------------------------------
1. Einmaleins
---------------------------------------------
Das wohl einfachste - und daher auch sinnloseste - OPTIX-'FREE'-Programm sieht
folgendermassen aus:
BEGIN
END
Dieses Programm, mit [F9] gestartet, schaltet Ihre SuperVGA in den Grafikmodus
und löscht den Bildschirm (ein freundliches Schwarz). Hiernach wird wieder in
den Textmodus umgeschaltet und der eben verlassene OPTIX-Texteditor erscheint
wieder.
Trotz der Kürze ist dem Programm folgendes zu entnehmen:
O Jedes OPTIX-Programm muß die Befehle BEGIN (am
Anfang des Hauptprogrammteiles) und END (als
Textendemarkierung) enthalten. Alles, was hinter END
kommt, wird vom Compiler, bzw. dem RUN-Modus ignoriert.
Vor BEGIN werden nur bestimmte Befehle akzeptiert, z.B.
Variablen-Definitionen, Prozeduren und der INCLUDE-
Befehl.
O Nach dem Start schaltet die VGA in den Grafikmodus
(640x480, 800x600 bzw. 320x200 mit 256 Farben) und
löscht den Bildschirm, d.h. füllt den Bildschirmspeicher
mit der Farbe 0 aus der aktuellen Farbpalette. Zum Start
eines Programmes ist immer die Standard-DOS-Palette
(s. SETPSTD) voreingestellt.
O Nach Erreichen von END schaltet die VGA wieder in den
Textmodus des Editors zurück und das Programm kann
weiter bearbeitet werden.
Wir fügen die Zeile Pause(0) ein:
BEGIN
Pause(0)
END
O Damit der augenblickliche Zustand des Bildschirms
erhalten bleibt, wird hier der Befehl PAUSE eingesetzt.
Z.B. hält PAUSE(4000) das Programm um 4000
Millisekunden (das sind 4 Sekunden) an. Diese Pause
kann durch einen Tastendruck vorzeitig beendet werden.
Als Sonderfall unterbricht PAUSE(0) - wie oben gezeigt -
den Programmablauf bis zum nächsten Tastendruck oder
Mausklick.
O Es ist gleichgültig, ob die Befehle in Groß- oder
Kleinbuchstaben oder gemischt geschrieben werden.
Damit haben wir die grundlegenden Voraussetzungen für ein OPTIX-Programm
bereits geschaffen.
Um uns die bei Programmstart verfügbare Farbpalette anzeigen zu lassen, setzen
wir statt Pause den Befehl Showpalette ein:
BEGIN
Showpalette
END
Auch dieses Programm wartet auf einen Tastendruck, zeigt jedoch währenddessen
die Farbpalette an.
Womit wir bei der entscheidenden Fähigkeit von OPTIX wären:
die 256-Farbdarstellung in hoher Auflösung
(SVGA in 640x480; OPTIX-'PRO' bis 1280x1024).
Die 8Bit-Farbverarbeitung (8Bit = 1 Byte = Werte von 0 bis 255) stellt die
unterste Stufe der sogenannten 'Realbildverarbeitung' dar, d.h. es sind
Grafiken in einer Farbqualität und Feinkörnigkeit möglich, die den Begriff
'Fotorealität' erlauben. Steigert man die Bildschirmauflösung auf 800x600 oder
gar auf 1280x1024 (-> OPTIX 'PRO'), so können Bilder dargestellt werden, die
von einem normalempfindlichen menschlichen Auge nur aus allernächster Nähe
(kleiner 50cm) von einem optophysikalisch hergestellten Foto unterschieden
werden können.
Um nun unter Beweis zu stellen, daß OPTIX-'FREE' spielend in der Lage ist, eine
Diashow zu präsentieren, folgt das erste Programm (Listing) einer
Bilddarstellung:
Begin
Readpic('C:\Bilder\Meinbild.BMP')
Loadpic(0,0)
Pause(5000)
End
Dieses Programm setzt voraus, daß auf der Partition C: Ihrer Festplatte im
Verzeichnis 'Bilder' ein Vollbild der Größe 640x480 in 256 Farben mit dem
Namen 'Meinbild.BMP' enthalten ist. Besitzen Sie kein Bild, können Sie es
sich zum Beispiel durch das Programm PAINTBRUSH unter WINDOWS oder durch
irgendein anderes Grafikprogramm für 256Farben-Verarbeitung erstellen und
im BMP-Format abspeichern.
Soll es ein Realbild sein, benötigen Sie einen Scanner oder eine sonstige
Möglichkeit der Grafik-Digitalisierung (Video-Grabber etc.), die Ihnen ein
256Farben-Realbild liefert. Auf dem freien Markt werden auch Disketten und
CD's mit lizenzsfreien Bildern, Grafiken und Hintergründen angeboten.
Nachdem das Bild in den sog. Hintergrundpuffer geladen wurde, wird es durch
LOADPIC sichtbar gemacht, wobei die beiden Parameter bewirken, daß das Bild
in höchstmöglicher Geschwindigkeit mit gleichzeitiger Paletteninstallation
aufgebaut wird (s. unter LOADPIC). Um das Bild kurze Zeit zu betrachten,
wird eine Fünfsekunden-Pause verfügt, die jedoch durch Tastendruck vorzeitig
unterbrochen werden könnte. Um ein Unterbrechung zu unterdrücken, kann
stattdessen der Befehl WAIT verwendet werden.
Eine einfache Diashow kann zusammengestellt werden, indem man einfach diese
drei Zeilen mehrfach aneinanderhängt:
Begin
Readpic('C:\Bilder\Bild1.BMP')
Loadpic(0,0)
Pause(5000)
Readpic('C:\Bilder\Bild2.BMP')
Loadpic(0,0)
Pause(5000)
Readpic('C:\Bilder\Bild3.BMP')
Loadpic(0,0)
Pause(5000)
End
So einfach ist das!
Um den Ablauf zu vertonen, benötigen Sie eine Musik-, Sprach- oder Geräusch-
Sequenz von - in diesem Fall - ca. 16 Sekunden (3x5 Sekunden Pause plus ca.
1 Sekunde Lade- und Transferzeit). Besitzen Sie eine WAV- oder VOC-Sounddatei,
so können Sie sie einfach parallel zum Ablauf starten:
Begin
Readsound('C:\Sounds\Musik.WAV')
Startsound
...
weiteres wie oben
...
End
In diesem Fall wird die Sounddatei 'Musik.WAV'aus dem Verzeichnis 'Sounds'
der C:-Partition in den XMS-Synchronsoundspeicher geladen und - ohne das Sie
der interne Ablauf interessieren müßte - absolut störungsfrei parallel zum
Vorgang des Bildladens und des Bildschirmaufbaus gestartet. Diese völlige
Synchronizität beliebiger Dauer (nur abhängig von der aktuellen Speichergröße)
ohne jede Rücksicht auf Bildschirm- oder Festplattenzugriffe darf als ein
besonderer Leckerbissen des OPTIX-Systems bezeichnet werden.
2. Interaktion
Ein realgrafisches Animationssystem darf sich jedoch nicht darin erschöpfen,
nur eine Reihe von Bildern aneinanderzuhängen und ein wenig Musik dazu
abzuspielen. Das Prädikat 'interaktiv' muß es sich ebenfalls verdienen. Um
Interaktion (also das Wechselspiel zwischen Programmablauf, Strukturvorgaben
des Produzenten und dem Variationsbedürfnis des Bedieners) zu ermöglichen,
sind sogenannten 'Strukturbefehle' vonnöten.
OPTIX200 verfügt über zwei Klassen von Strukturbefehlen. Die eine bezieht sich
auf die Möglichkeit, dem Benutzer die verschiedensten Wahlmöglichkeiten zur
Verfügung zu stellen und die andere darauf, das Programm intern in seinem
Ablauf zu strukturieren.
Zur ersten Klasse gehören Befehle wie DEFBUTTON / CHECKBUTTON, GOTOENV,
CHECKDATE oder TIMEOUT, die eine Definiton von Schaltflächen erlauben,
anhand derer der Benutzer den Ablauf des Programms von außen steuern kann
und die implizit eine Programmverzweigung zu dem gewünschten Ziel angeben:
Begin
Sysfont(3,1)
Setcolor(3)
Printat(100,100,'Ist heute Sonntag?')
Defbutton(100,120,70,28,0,1,0,1,#74,'Marke1')
Defbutton(100,160,70,28,0,1,0,1,#78,'Marke2')
Setcolor(4)
Printat(110,125,' (J)a')
Printat(110,165,'(N)ein')
Setcolor(12)
Checkbutton('exit',30,0)
:Marke1
Printat(100,200,'Hurra')
Goto('exit')
:Marke2
Printat(100,200,'Schade')
Goto('exit')
:exit
Pause(5000)
End
Dieses kleine Programm gibt eine Textzeile auf dem Bildschirm aus (mit der
linken oberen Textbox-Ecke an Pos. 100/100), erzeugt zwei Buttons (Tastenobjekte
durch DEFBUTTON), weist diesen Objekten feste Sprungmarken zu (s. unter Lables),
beschriftet diese und wartet dann bei CHECKBUTTON so lange auf einen Tastendruck
oder Mausklick, bis die - als zweiter Parameter - angegebene Zeit von 30
Sekunden verstrichen ist. Wird zwischenzeitlich die Taste [ J ] (ASCII-Wert
74 s. anhängende ASCII-Code-Tabelle) gedrückt, verzweigt OPTIX200 automatisch zu
dem bei DEFBUTTON definierten - Programmlabel 'Marke1'. Wird dagegen die Taste
[ N ] für 'Nein' gedrückt, wird zum Label 'Marke2' gesprungen. Das Programm
fährt dann - direkt im Anschluß an CHECKBUTTON - an dieser Einsprungstelle
fort. An diesen Stellen wird hier verbal auf die Eingabe reagiert, anschließend
5 Sekunden (5000 Millisekunden) gewartet und dann das Programm beendet.
CHECKBUTTON reagiert ausschließlich auf den Druck der vorher durch DEFBUTTON
angegebenen Tasten. Alle anderen Tasten werden ignoriert. Ist der CHECKBUTTON-
Befehl abgearbeitet - also eine Taste bedient bzw. die angegebene Zeit
abgelaufen - werden alle vorher angemeldeten DEFBUTTON-Objekte intern gelöscht,
sodaß also für jede CHECKBUTTON-Abfrage die konkrete DEFBUTTON-Deklaration (en)
vorgenommen werden muß (müssen).
Eine weitere Möglichkeit, die Tasten zu bedienen, ist, wenn mit der - vorher
durch CURSON aktivierten - Maus auf den entsprechenden Button (Auswahlknopf)
geklickt wird. Bei Einsatz von berührungsempfindlichen Bildschirmen mit SVGA-
Mausemulation kann ein Button auch regelrecht mit dem Finger auf dem
Bildschirm'gedrückt' werden. OPTIX200 tut dann so, als wäre die Tastaturtaste mit
dem jeweiligen ASCII-Wert bedient worden.
Wurde innerhalb der 30 Sekunden kein Bediener-Ereignis festgestellt, springt
OPTIX200 von CHECKBUTTON aus direkt zum Label 'Exit', wodurch in diesem Fall das
Programm beendet wird.
Über die Maus- oder Touchscreen-Steuerung lassen sich im weitesten Sinne
'interaktive' Strukturen verwirklichen, die dann so komplex auf Bediener-
Einflüsse reagieren können, daß ein reine Button-Verwaltung mit automatischer
Sprungverteilung überfordert wäre (mehr dazu bei der Beschreibung der
Mausbefehle). Ebenso sei es routinierten OPTIX-Programmierern vorbehalten,
durch Befehle wie READKEY, KEYPRESSED, ASC oder CHR eine eigene Tastatur-
verwaltung zu realisieren, die dann auch erheblich komplexer ausfallen kann,
als die vorgegebenen Konventionen einer CHECKBUTTON-Abfrage.
Dagegen ist eine CHECKBUTTON-Verteilung immer vorzuziehen, wenn es um die
Übersichtlichkeit von Bediener-Menüs geht, da eine einfachere Strukturierung
eines Programmablaufs als durch den DEFBUTTON-Befehl kaum denkbar sein dürfte.
3. Interne Programmstruktur
OPTIX200 ist eine strukturorientierte Programmiersprache.
Das heißt zuallererst, daß es nicht möglich ist, mehrere Befehle einfach in
eine Zeile zu schreiben, sondern daß jedem Befehl (bzw. jeder Aktion) sozusagen
eine eigene Zeile 'zusteht'. Das erfordert zwar eine verschwindende Kleinigkeit
mehr an Speicherplatz auf Ihrer Festplatte, hat aber den unschätzbaren Vorteil,
daß Sie Ihre eigenen Programme 'verstehen' lernen, da die Einrichtung einer
optischen Struktur erheblich dazu beiträgt, auch die Ablaufstruktur eines
Programmes besser zu visualisieren. Das erhöht die Qualität und die Effizienz
eines Programmes ungemein. Fragen Sie einen professionellen Programmierer, ob
er auf seine Programmstruktur verzichten würde. Sie dürften ihm alles wegnehmen
- sogar das Frühstücksbrötchen - aber nie seine Programmstrukturierung.
Die zweite Konsequenz einer strukturorientierten Programmiersprache ist die
Verwendung bestimmter Befehle, die immer paarweise verwendet werden und ganz
speziell dafür zuständig sind, Ordnung zu schaffen, bzw. bestimmte
Programmteilen je nach ihrer Gültigkeit auszuführen - oder es eben auch zu
lassen.
OPTIX200 kennt z.B.:
PROCEDURE FOR DO IF REPEAT
....... .... .... .... ....
RETURN NEXT LOOP ELSE UNTIL
....
ENDIF
Keiner dieser Befehle kann für sich allein verwendet werden. So gibt es immer
einen strukturöffnenden Befehl (oben) mit einem dazugehörigen struktur-
schließenden Befehl (unten). Eine Ausnahme bildet die ELSE-Anweisung
('sonst' / 'anderenfalls'), die automatisch den unter ihr folgenden
Programmteil dann ausführt, wenn die unter IF gestellte Bedingung nicht
zutreffend war. ELSE ist für die Verwendung von IF/ENDIF nicht unbedingt
erforderlich, kann allerdings auch nicht alleinstehend verwendet werden.
IF und ENDIF sind dagegen - wie die anderen Strukturbefehle - aufeinander
angewiesen.
Eine wichtige Fähigkeit von OPTIX ist es, daß sämtliche Strukturen beliebig
ineinander 'verschachtelt' werden können. So sind z.B. folgende Konstruktionen
durchaus denkbar:
PROCEDURE ...
IF Bedingung
...
ELSE
IF Bedingung
FOR I...
DO
...
LOOP
IF Bedingung
...
IF Bedingung
...
ENDIF
ELSE
...
ENDIF
FOR J...
REPEAT
...
UNTIL Bedingung
...
NEXT(J)
NEXT(I)
ENDIF
ENDIF
RETURN
Werden diese Befehle sinnvoll eingesetzt, ist es immer wieder erstaunlich,
wieweit es damit möglich ist, einem Programm 'Intelligenz' beizubringen.
4. Programmablauf
Ein Programm ist in erster Linie die sinnvolle Aneinanderreihung von einzelnen
Befehlen, die genau in der Reihenfolge Stück für Stück abgearbeitet werden,
wie sie dem Compiler/Encoder erscheinen. Nur durch die eben genannten Struktur-
Befehle (CHECKBUTTON, TIMEOUT, GOTO, IF, DO, FOR, REPEAT und Prozeduraufrufe
etc.) läßt sich diese Ablauffolge - unabhängig von ihrem optischen Erscheinen
im Programmlisting - nach Bedarf beliebig steuern.
Versuchen wir uns nun ein wenig an der Grafik.
REM gelbes Kreuz
BEGIN
CLEARSCREEN(8)
PAUSE(1000)
SETCOLOR(14)
LINE(0,0,639,479,0)
LINE(639,0,0,479,0)
PAUSE(0)
END
Das Programm zeichnet zwei diagonale Linien auf einen grauen Hintergrund. Die
Hintergrundfarbe wird mit CLEARSCREEN(8) festgelegt. SETCOLOR bestimmt die
Zeichenfarbe für eine Reihe grafischer Funktionen. In diesem Falle die Farbe
der beiden Linien. Die Lage einer Linie auf dem Bildschirm wird durch die
Koordinaten ihres Anfangs- und Endpunktes bestimmt.
5. Die erste Linie
LINE(0,0,639,479,2)
beginnt demnach auf dem Punkt X = 0 und Y = 0, d.h. in der linken oberen Ecke
des Bildschirms. Der Endpunkt liegt auf den Koordinaten X = 639 und Y = 479,
das ist die rechte untere Ecke. Der fünfte Parameter, der hier mit 2 angegeben
ist, erzeugt eine Zeitverzögerung beim Zeichnen der Linie; je größer der Wert,
umso langsamer wird die Linie gezeichnet. Die Angabe einer Null bewirkt das
Zeichnen mit höchstem Tempo. Es lassen sich damit sehr effektvolle dynamische
Abläufe erzeugen. Wenn wir für die Zeitverzögerung eine 100 einsetzen, kann
die Linie beim Entstehen gut verfolgt werden:
LINE(0,0,639,479,100)
Die Zeichengeschwindigkeit ist unter anderem auch von der Taktfrequenz des
Computers abhängig; es wäre praktisch, wenn sich die Zeitverzögerung für
beide Linien gemeinsam einstellen liesse. Dieses Problem lässt sich durch
die Einführung von Variablen lösen.
Fortschrittliche Programmiersprachen haben selbstverständlich auch ein
reichhaltiges Angebot an grafischen Befehlen. Das ist ganz und garnicht
so selbstverständlich, wie es auf den ersten Blick erscheint. Vor nur
wenigen Jahren mussten die ALGORITHMEN dazu noch per Hand geschrieben werden -
und wer weiß schon aus dem Stehgreif, wie ein Kreis oder eine Ellipse
konstruiert wird.
Unter OPTIX haben Sie es da einfacher. In der Befehlsliste im Anhang finden
Sie eine Fülle von Grafikbefehlen, deren Bedienung denkbar einfach ist. Unser
Bildschirm ist im Normalfall in der SVGA-Auflösung in 640 Bildpunkte horizontal
und 480 Bildpunkte vertikal eingeteilt. Der Bildpunkt mit der Koordinate 0/0
liegt dabei in der äußersten Bildschirmecke linksoben. Durch dieses Wissen läßt
sich nun jeder einzelne Bildschirmpunkt auch einzeln benennen. Sie brauchen
sich also nur zu entscheiden, an welcher Bildschirmposition Sie ein Grafik-
Objekt sehen möchten, übergeben dem Befehl, bzw. vorher dem VIEWPORT die
entsprechenden Koordinaten und schon erscheint das Objekt.
Die folgende Zeile zeichnet einen Ellipsenumriss mit der Farbe 9, deren
Zentrum genau in der Mitte des Bildschirms liegt.
ELLIPSE(XMAX/2,YMAX/2,120,80,9)
Die ersten beiden Parameter bestimmen die Position, der dritte den horizontalen,
der vierte den vertikalen Radius sowie der fünfte die Farbe der Ellipse. Mit
diesen Informationen und den Beschreibungen der Befehle werden Sie sicherlich
keine größeren Probleme mit der Grafik haben.
Malen Sie doch mal ein kleines Bild mit dem folgenden Programm.
def(flag)
def(x)
def(y)
def(xx)
def(yy)
procedure vbox(xl,yo,xr,yu)
vline(xl,yo,xr,yo,0)
vline(xl,yo+1,xl,yu-1,0)
vline(xr,yo+1,xr,yu-1,0)
vline(xl,yu,xr,yu,0)
return
begin
setcolor(9) Text- und Linienfarbe
printat(10,10,'Bitte Maustaste drücken')
:ever Hauptschleifenstart
repeat 1. REPEATSchleife ---.
until mousek<>0 wartet auf Mausklick ---'
x:=mousex Mauskoordinaten in x,y
y:=mousey Mauskoordinaten in x,y
repeat 2. REPEAT-Schleife --.
xx:=mousex neue X-Maus in xx |
yy:=mousey neue Y-Maus in yy |
if mousek=1 linke Maustaste ? |
line(X,Y,Xx,Yy,0) dann Linie zeichnen |
x:=xx neue Koord. werden.. |
y:=yy ...alte Koordinaten |
endif |
if mousek=2 rechte Maustaste ? |
flag:=true merken |
vbox(x,y,xx,yy) virtuelle Box zeichnen |
vbox(x,y,xx,yy) virtuelle Box löschen |
endif |
if mousek=3 beide Maustasten ? |
flag:=false Merker löschen |
viewport(x,y,xx,yy) Box definieren |
cbox(8,9,0) Vollbox zeichnen |
setcolor(12) andere Farbe |
rectangle Rahmen zeichnen |
setcolor(9) Farbe zurücksetzen |
endif |
until mousek=0 Taste losgelassen? --'
if flag=true Merker für Maustaste 2 an ?
flag:=false dann Merker löschen
viewport(x,y,xx,yy) Boxkoordinaten definieren
rectangle Box nochmal zeichnen
endif
goto('ever') zum Hauptschleifenstart
end
Hier finden Sie gleich ein Beispiel für den Einsatz von Flags.
'Flag' ist hier eine völlig beliebige Variable, die die Aufgabe hat, sich zu
merken, ob in der 2. REPEAT-Schleife die rechte Maustaste gedrückt wurde.
Wurde sie das, wird im virtuellen (XOR-) Modus zweimal eine Box auf dieselbe
Stelle gezeichnet. Dieses hat den Effekt, daß die Box bei jedem Durchlauf nur
für einen kurzen Moment zu sehen ist. Wird die rechte Maustaste wieder
losgelassen, wird anschließend die Box nocheinmal im Standard- (Replace-)
Modus gezeichnet.
Bei diesem Programm wird eine Eigenart einiger Maustreiber deutlich. Sobald
beide Maustasten gleichzeitig gedrückt, schaltet der Maustreiber zwischen zwei
Arbeitsmodi hin und her. Wobei der eine Modus die 'merkwürdige' Angewohnheit
hat, abhängig von der Geschwindigkeit der Mausbewegung die aktuellen Maus-
koordinaten langsam oder schnell zurückzugeben. Diese 'rechteckige' Arbeits-
weise läßt sich bei diesem Programm sehr gut beobachten.