[Anmerkung: Thomas hat uns den Kurs zur Verfügung gestellt, ich habe inhaltlich kaum etwas geändert. Ansonsten stehen meine Kommentare in eckigen Klammern, wobei ich nur Vermutungen anstellen kann, was Blitz-Basic angeht. Red.CC]
Blitz-Basic 2 ist eine der wenigen Sprachen, die noch auf dem Amiga weiterentwickelt werden. Durch den Library-Aufbau der Sprache ist es leicht möglich, neue Befehle zu integrieren und somit auch OS-fremde Strukturen zu nutzen. Auch die systemnahe Library-Programmierung ist gut möglich und einfach, da nicht erst die Library aufgerufen, Adressen herausgefunden und Strukturen angelegt werden müssen.
Leider ist die Dokumentation des Compilers sehr mißverständlich und unstrukturiert, so das es leicht zu Frustration kommt, wenn man etwas Komplizierteres vorhat, als ein Window zu öffnen.
Um ein wenig Hilfestellung zu geben und etwas Mut, für den Amiga zu programmieren, habe ich diesen Kurs ins Leben gerufen. Er soll vor allen Dingen auf die Wünsche und Fragen der Leser eingehen und sich mit den konkreten Problemen der User beschäftigen.
Um einen Anfang zu bekommen, werden sich die Teile 1-6 mit Intuition befassen, was jeden früher oder später mal beschäftigen wird.
Die Datenstrukturen sollen helfen, die Möglichkeiten der Library zu nutzen und eine große Kontrolle über sein Programm zu haben.
Dieser Kurs ist kein Ersatz für das Handbuch, sondern eine Ergänzung zu den Dokumenten, die Sie für BB2 haben. Mit den vielen Beispielen hoffe ich einfache und schnelle Lösungen zu geben und diese auch verständlich an den Benutzer zu bringen.
Da der Kurs von der Teilnahme lebt, bitte ich alle aufkommenden Bemerkungen und Fragen an mich zu senden. Auch Themenvorschläge sind erwünscht.
Viel Spaß beim Lesen!
Hier werden jetzt Grundlagen besprochen, die später im Kurs nicht mehr weiterbehandelt werden.
- Starten von der Workbench
Um ein Programm über die Workbench, daß heißt mit Hilfe eines Icons starten zu können, benötigt es Informationen, die es an die WB weitergeben kann. Was das genauer ist, braucht uns nicht zu interessieren. Wichtig ist nur: Wie bekommt mein Programm diese Informationen?
In BB2 geschieht das mit dem Befehl:- WBStartup
Dieser Befehl muß am Anfang eines jeden Programms stehen, das von der WB aus startbar sein soll.
Ich habe es mir zu Gewohnheit gemacht, diesen Befehl immer in mein Programm aufzunehmen, um so keine Überraschungen zu erleben.
- Newtype
Newtypes sind eine wunderbare Sache in BB2. Mit Ihrer Hilfe kann man große Datenmengen leicht und übersichtlich verwalten. Auch für die Programmierung des Systems sind diese Felder wichtig, da manche schon fest in der AmigaLib.res eingebunden sind.
Mit Newtype weise ich einer Variable einen variablen Stamm zu, um somit wie bei einem Verzeichnis auf der Festplatte in die Unterverzeichnisse zu gelangen. Wenn Sie nicht mit der NewType-Funktion vertraut sind, lesen Sie bitte im BB2 Handbuch nach.
Besonders wichtig für diesen Kurs sind die BB2-Objekte, die mit NewType strukturiert werden. Diese stehen ebenfalls im Anhang. Wenn wir sie im Kurs benötigen, werde ich Sie beschreiben.
NewTypes sollten immer als dritte große Struktur in Ihrem BB2-Programm stehen.
- Pointer
Auch dieses sollten Sie sich im Handbuch einmal anschauen, wenn sie systemfreundliche Programme entwickeln wollen.
Um auf Systemdaten zurückzugreifen, benötigen wir die Adresse dieser Daten und das liefert uns der Pointer, der eigentlich nur eine Variable ist, die auf einen Speicherbereich zeigt.
Mit Hilfe der-Peek Anweisung kann man aber leicht alle wichtigen Systemdaten finden und sein Programm darauf einstellen.
- Peek
Der Peek-Befehl liefert den Inhalt einer Speicherstelle. Vor diesem Befehl braucht man keine Angst zu haben, er kann das System nicht zum Absturz führen, im Gegensatz zu Poke [mit dem man in den Speicher schreibt].
Das war es dann auch schon an Grundlagen, die man im Vorfeld klären kann.
Abschließend sei gesagt, daß es immer Sinn macht in das Handbuch zweimal hineinzuschauen und zu experimentieren, kaputt kann man mit BB2 eigentlich nichts machen.
In diesem Teil geht es nun zur Sache.
Als erstes werden wir den Workbench-Screen klonen und zu unserem eigenen Screen erklären. Danach werden wir einen Screen öffnen und die dazugehörige Bitmap. Wenn das alles geschafft ist, werden wir einen Screen mit Hilfe des ScreenTag, also des Screenrequesters öffnen.
Und nun gehts los:
Ein Screen ist ein sogenannter virtueller Bildschirm, der sich wie jeder andere Bildschirm verhält. Der Amiga ist in der Lage, soviel Screens zu öffnen, wie Speicherplatz zu Verfügung steht. Ohne einen Screen kann der Benutzer also nichts sehen: kein Window, keinen Mauszeiger - nichts.
Für uns heißt das, daß wir für alle Programme, die eine sichtbare Ausgabe machen, einen Screen öffnen müssen (ausgenommen File-Erzeugung). [Das oben genannte "Klonen" des Screens bedeutet nicht, eine Kopie des Workbench- Screens zu öffnen. Stattdessen ist nur gemeint, daß der Workbench-Screen jetzt unter Blitz-Basic angesprochen werden kann.]
Dieses gibt auch die Bedeutung der Screen-Programmierung wieder, die aber unter BB2 ganz einfach ist.
Ein Beispiel:
- Worbench Screen benutzen
WBStartup
WBenchToFront_
WbToScreen 0
MouseWait
End
Das ist schon alles. Die erste Zeile kennen wir von Kurs 1.
In der zweiten Zeile holen wir den Workbench-Screen nach vorne, so ist er für den Benutzer sichtbar.
In der dritten Zeile klonen wir den Workbench-Screen und machen diesen zu unserem Screen 0, damit haben wir auch alle Attribute und Flags dieses Screens übernommen. Das heißt, sollte es sich hierbei um einen Screen mit der Breite von 800 Pixeln handeln, so ist unser Screen 0 ebenfalls 800 Pixel breit.
- Eigenen Screen mit Bitmap
WBStartup
Screen 0,3,"Eigenen Screen"
ScreensBitMap 0,0
MouseWait
End
In diesem Fall öffnen wir einen eigenen Lores Screen.
Die benutzte Bitmap gleichen wir an den offenen Screen an. Dieses geht auch in dem Beispiel mit dem Klonen des Workbench-Screens, ist jedoch nicht empfehlenswert, da es dort leicht zu Schwierigkeiten kommen kann. Doch dazu spãter mehr.
Die hier verwendete Form, um einen Screen zu öffnen, ist die Kurzform. Mit dieser habe ich nur wenig Einfluß auf den geöffneten Screen.
Versuchen wir es mal mit etwas Komplexerem.
- Screen Langversion
Screen 0,0,0,320,255,2,0,"Eigenen Screen",1,2
ScreensBitMap 0,0
MouseWait
End
Dieses kleine Programm macht nichts anderes, als das vorherige Programm. Es ist aber hier möglich die Screenbreite, -höhe oder den Beginn des Screens zu beeinflussen. Experimentieren Sie einfach mit dem Flag und bald wird Ihnen die Struktur klar sein.
Die Parameter des Screen-Befehls:
Screen Nummer,X-Beginn,Y-Beginn,X-Ende,Y-Ende,Tiefe,Mode,Name,Dpen,Bpen,Bitmap
Nummer:
Die Nummer unter dem wir den Screen ansprechen.
X-Beginn und Y-Beginn:
Die linke obere Ecke des Screens. Meistens werden diese Werte 0 sein, da
der Screen dann links oben am Bildschirm zu sehen ist.
X-Ende und Y-Ende:
Die rechte untere Ecke des Screens und somit die Größenangabe in Pixel.
Tiefe:
Anzahl der Bitplanes des Screens. Diese bestimmen, wieviele Farben der
Screen darstellen kann. Sollte mit der Bitmap koordiniert werden, aber
auch hierzu später mehr.
Mode:
Der Screen-Mode wird hier eingestellt, da dieses kein Raupkopiererkurs ist,
bitte ich Sie, im BB2-Handbuch die Screen-Modes unter Screen-Viewmode
nachzulesen.
Dieser Wert bestimmt die Frequenz und die Darstellung des Screens. In der Praxis kommt das folgendermaßen zur Geltung: Sie öffnen einen Screen der Größe 640x512, im LoRes-Modus kann der Screen aber nur 320x255 darstellen. Also sehen Sie nicht den kompletten Screen.
Dieses ist wichtig zu wissen, wenn der Benutzer seinen Screen selber aussuchen darf und das ist ja was wir wollen. Es ist also auf den Mode immer zu achten, da er uns über den tatsächlich sichtbaren Screen Aufschluß gibt.
Name:
Hier kommt der Name des Screens hin.
Dpen und Bpen:
Sind die Licht- und Schattenfarben des Screens.
Bitmap:
Muß nicht angegeben werden. Hier können wir dem Screen eine bereits
bestehende Bitmap zuweisen. Diese Bitmap kann völlig andere
Größenverhãltnisse haben oder weniger Bitplanes benutzen.
-ScreenTags
Nachdem wir den Screen-Befehl kennen und die Struktur verstanden haben, können wir daran gehen, etwas abstrakter zu werden.
Der ScreenTags-Befehl erlaubt uns nun die Möglichkeiten, die der individuelle Rechner zu Verfügung stellt, zu nutzen. Er ist die Weiterentwicklung des Screen-Befehles.
Um das zu verstehen, schauen wir uns den Befehl einmal an:
ScreenTags Nummer,Name,TagList oder Tag,Daten
Nummer:
Ist wieder die Nummer unter dem wir unseren Screen finden.
Name:
Der Name des Screens.
TagList:
Ist eine Adresse, die die spezifischen Daten des Screen enthält.
Tag,Daten:
Hier gebe ich die TagList einzeln ein.
Die TagList und Tag,Daten dürfen nicht gemeinsam angegeben werden!
Doch kommen wir zu einem Beispiel:
-Der Screen-Requester
Hier zeigt sich am deutlichsten, wozu man den TagScreen-Befehl benötigt.
Bevor Sie allerdings das Programm starten und ausprobieren können, müssen Sie in den Optionen des BB2 die residenten AmigaLibs.res einladen. Dieses geben Sie einfach unter Compiler-Option Resident ein.
Blitz2:Blitzlibs/AmigaLibs.res
Das Programm:WBStartup NEWTYPE.screeninfo id.l width.l height.l _depth.w overscan.w autoscroll.w bmapwidth.l bmapheight.l End NEWTYPE NEWTYPE.WS _screen.l End NEWTYPE WbenchToFront_ WBtoscreen 0 FindScreen 0 *sc.screeninfo=ASLScreenRequest(31) If *sc Dim scrtags.TagItem(8) col.w=-1 scrtags(0)\ti_Tag=#SA_Left,0 scrtags(1)\ti_Tag=#SA_Top,0 scrtags(2)\ti_Tag=#SA_Width,*sc\width scrtags(3)\ti_Tag=#SA_Height,*sc\height scrtags(4)\ti_Tag=#SA_Depth,*sc\_depth scrtags(5)\ti_Tag=#SA_Overscan,*sc\overscan scrtags(6)\ti_Tag=#SA_AutoScroll,*sc\autoscroll scrtags(7)\ti_Tag=#SA_DisplayID,*sc\id scrtags(8)\ti_Tag=#SA_Pens,&col ScreenTags 0,"Benutzer Screen",&scrtags(0) End If MouseWait End
[Dieses Beispiel ist in der Datei ex1.bb2 zu finden.]
Als erstes finden wir wie immer die WBstartup, danach werden per NewType Strukturen für die Benutzereingaben definiert (.screeninfo). Dann wird eine Struktur für den Screen definiert (.WS).
Nun holen wir den Worbench-Screen nach vorne und machen ihn zum Screen 0, das ist nichts Neues für uns.
Den Pointer *sc.screeninfo setzen wir auf den ASL-Screenrequester, der damit auch gleichzeitig aufgerufen wird und nach dem Schließen die Informationen des eingestellten Screens enthält.
Wir fragen, ob *sc überhaupt einen Wert hat und gehen dann weiter in die Schleife. [Der andere Fall tritt ein, wenn der ASL-Screenrequester mit "Abbruch" statt "Okay" beendet wird.]
Jetzt dimensionieren wir unsere TagList, die dann zugewiesen wird.
TagItem und #SA_ dürfen nicht von uns dimensioniert werden, sie sind in der AmigLibs.res eingebunden. In ihr sind diese Variablen schon zugewiesen und brauchen nur abgerufen zu werden.
Nun weisen wir noch dem Screen 0 alle Informationen über den ausgewählten Screen zu und schon öffnet sich das Ganze.
Ausgaben von Text oder Grafik können nicht direkt auf einen Screen gelegt werden, sondern nur auf die Bitmap des Screens. Diesen Vorgang beschreibt das nächste Beispiel.
NEWTYPE.pt
x.w
y.w
End NEWTYPE
Dim p.pt(20)
Screen 1,3,"Eigenen Screen"
ScreensBitMap 1,0
BitMapOutput 0
For q = 0 To 19
p(q)\x=(ScreenWidth/2)+Sin(2*q*Pi/20)*((ScreenWidth/2)-1)
p(q)\y=(ScreenHeight/2)+Cos(2*q*Pi/20)*((ScreenHeight/2)-1)
Next q
For q = 0 To 18
For w = q+1 To 19
Line p(q)\x,p(q)\y,p(w)\x,p(w)\y,1
Next w
Next q
MouseWait
End
[Als Datei unter ex2.bb2 verfügbar.]
Es erzeugt eine Grafik auf der Bitmap des Screen. Das Beispiel steht auch im BB2-Handbuch, ich habe es nur etwas abgeãndert, um es auf den nächsten Teil des Kurses vorzubereiten.
Was dort passiert, ist wohl jetzt jedem klar. Wie es zu der Grafikform kommt, werde ich nicht erklären, das ist Mathematik.
Am besten versucht man mit diesem Beispiel einmal verschiedene Auflösungen einzugeben, die Parameter des Screens zu ändern und so weiter. Das Beispiel verwendet keine statischen Werte für die Größe der Grafik. Dieses erkennt man am ScreenWidth- und ScreenHeight-Befehl, die die Breite und Höhe des aktuellen Screens ausgeben (WAS NICHT IMMER FUNKTIONIERT).
So, das war der Teil 2 unseres kleinen Kurses.
[und hier ist erstmal Schluß für diese AmZeiger-Ausgabe...]![]() |
Inhaltsverzeichnis | ![]() |
| ©`98 Der AmZeiger | ||