home *** CD-ROM | disk | FTP | other *** search
- Anleitung zum Programmieren von Modulen für BlitzBlank 2.50
- ===========================================================
-
- 0. Vorwort
- 1. Anforderungen an Module
- 2. Einleitung
- 3. Aufbau der GUI
- 4. Beschreibung der GUI-Objekte
- 5. Kommunikation mit BlitzBlank/BlitzBlankPrefs
- 6. Erklärung der Flags
- 7. Beschreibung der BlitzBlank-Strukturen und Flags
- 8. Beschreibung der globalen Definitionen eines Moduls (Beispiel)
- 9. Genaue Beschreibung des Hauptprogramms (Beispiel)
- 10. Genaue Beschreibung von blank()
- 11. Hinweise zur Unterstützung der locale.library
- 12. AmigaGuide-Anleitung für die Module
- 13. Tips & Tricks
-
-
- 0. Vorwort
- ----------
-
- Da ich nicht alles selbst programmieren kann, habe ich versucht, das
- Programmieren von Modulen so einfach, wie möglich zu machen. Ich bitte
- allerdings die potentiellen Modulprogrammierer darum, mir mitzuteilen, wenn
- sie an einem Modul anfangen, damit nicht 2 Leute das gleiche programmieren.
- Desweiteren bekommen sie von mir ja auch die Nummern der Locale-Strings
- zugeteilt. Wenn ein Modul fertig ist, dann möchte ich nicht, daß der
- Programmierer es auf eigene Faust veröffentlicht, sondern es mir schickt.
- Ich baue dann seine gewünschten Texte in BlitzBlank.catalog ein und seine
- Anleitung in BlitzBlank.guide, um es dann zusammen mit BlitzBlank
- oder als Update für die letzte BlitzBlank-Version zu releasen.
-
- Da BlitzBlank selbst keine Shareware ist, können auch die Module
- keine Shareware sein. Sie können höchstens zu Card- oder Giftware
- deklariert werden.
-
- Was ein Modul-Autor in seinen Info-Requester schreibt (zB Adresse etc.)
- bleibt ihm selbst überlassen, sollte aber etwa die Form meiner Module
- haben.
-
- Ich hätte (mindestens ;-) ) noch gerne folgende Module:
- - Flying irgendwas (Toaster etc)
- - irgendwas mit 3D-Grafik
- - Maze (Labyrinth)
- - Starfield
- - ASwarm
- - Fraktale
- - sonstige Gags
-
- Viel Spaß,
- Thomas Börkel
-
-
- 1. Anforderungen an Module
- --------------------------
-
- - OS 2.x/3.x kompatibel
- - Minimal-OS: V2.04
- - keine Abschaltung des Multitaskings
- - AGA-kompatibel
- - kompatibel zu Grafikkarten, wenn möglich
- - möglichst Auflösungs- und Farbanzahlunabhängig
- - Einhaltung der beschriebenen Richtlinien
- - zum Doublebuffering nur EINEN Screen verwenden, aber mehrere BitMaps
- - möglichst keinen eigenen Screen öffnen, sondern einen von BB geben lassen
- - Benutzung der blitzblank.library
- - wenn das Modul Grafikdaten, oder ähnliches braucht, dann sollte es diese
- von Platte nachladen (mittels Read() oder der iff.library), sodass das
- Modul selbst möglichst klein bleibt (beim Konfigurieren zB braucht man
- nämlich diese Grafikdaten nicht)
-
-
- 2. Einleitung
- -------------
-
- Module für BlitzBlank sind relativ leicht zu programmieren, da BlitzBlank
- vieles für die Module zur Verfügung stellt. Somit kann sich der
- Modul-Programmierer auf das eigentliche Modul konzentrieren.
-
- BlitzBlank/BlitzBlankPrefs verwalten die GUI, die Konfigdaten und den
- Screen für das Modul.
-
- Modulnamen beginnen mit "BB." und haben keinen weiteren "." im Namen.
- Datenfiles für die Module (wenn es welche braucht) müssen das Format
- "BB.Modulname.*" haben.
-
- BlitzBlank-Module sind zunächst einmal normale CLI-Programme, die von
- BlitzBlank oder BlitzBlankPrefs gestartet und im BLANK-Fall mit CTRL-C
- beendet werden.
-
- Ein Modul besteht mindestens aus 2 Funktionen:
- - Hauptroutine (entscheidet den Programmablauf anhand des 1. Arguments)
- - blank()-Routine (die eigentliche Blank-Routine)
-
- Die Module kommunizieren mittels der blitzblank.library mit BlitzBlank
- und BlitzBlankPrefs. Die Befehle der Library fangen alle mit "BBL_"
- an.
-
- Die Module bekommen beim Start bis zu 3 Kommandozeilen-Parameter:
- - Aktionsschlüsselwort (BLANK|CONFIG|INFO)
- - Name der Ports, mit dem das Modul kommunizieren soll
- - Adresse der BlitzBlank Screeninfo-Struktur
-
- Das Schlüsselwort legt fest, was das Modul zu tun hat. Beispiel einer
- Abfrage dafür in C:
-
- if (strcmp (argv[1],"BLANK")==0)
- {
- StrToLong (argv[3],(long *) &screeninfo);
- BBL_SendMessage (&message,argv[2]);
- if (screeninfo->bbscreen)
- blank ();
- BBL_ModuleDone ();
- }
- else
- if (strcmp (argv[1],"CONFIG")==0)
- {
- BBL_SendMessage (&message,argv[2]);
- }
- else
- {
- message.first=NULL;
- BBL_SendMessage (&message,argv[2]);
- }
-
- Das erste Argument wird auf BLANK|CONFIG|INFO überprüft und entsprechend
- folgendermaßen verfahren:
-
- BLANK:
- Argument 3 wird mit der OS-Routine StrToLong() in eine Zahl verwandelt und
- einem Zeiger auf eine BB_Screeninfo-Struktur zugewiesen. Dann wird
- BBL_SendMessage (&message,argv[2]) aufgerufen. Anschließend wird die
- blank()-Funktion aufgerufen, die die eigentlichen Modul-Routinen enthält.
- Falls ein Screen angefordert wurde, muß vor diesem Aufruf noch überprüft
- werden, ob screeninfo->bbscreen nicht NULL ist (könnte durch Speichermangel
- passieren). Direkt vor der Hauptschleife in der blank()-Funktion wird
- auf CTRL-C abgefragt und dann BBL_ModuleRunning() aufgerufen.
- Nach dem Blanken muss auf JEDEN Fall BBL_ModuleDone() aufgerufen werden.
-
- CONFIG:
- Argument 3 kann mit der OS-Routine StrToLong() in eine Zahl verwandelt und
- einem Zeiger auf eine BB_Screeninfo-Struktur zugewiesen werden.
- BBL_SendMessage (&message,argv[2]) wird aufgerufen.
- Wenn ein Modul BBF_Screenmode setzt und BBF_Colors nicht und im
- Screeninfo die depth setzt, dann zeigt der Screenmoderequester in BBPrefs
- auch nur die Modes an, die über mindestens diese Tiefe verfügen.
-
- INFO:
- Der Zeiger auf das erste GUI-Objekt wird auf NULL gesetzt. Dann wird
- BBL_SendMessage (&message,argv[2]) aufgerufen.
-
-
- 3. Aufbau der GUI
- -----------------
-
- Die grafische Oberfläche eines BB-Moduls wird durch GUI-Objekte
- beschrieben. Das Verwalten der Oberfläche und das Speichern und Laden der
- Konfiguration übernimmt BlitzBlank bzw BlitzBlankPrefs. Das Modul braucht
- sich darum nicht zu kümmern. GUI-Objekte beschreiben also einerseits
- den Aufbau der GUI und sind andererseits auch gleich der Speicher
- für die Parameter (Konfiguration des Moduls).
-
- An GUI-Objekten gibt es Checkmark, Stringgadget, Filegadget, Slider,
- Cycle-Gadget, VGroup und PGroup.
-
- Die GUI-Objekte werden in VGroups und evt. in PGroups zusammengefaßt. Eine
- VGroup startet durch ein GUI-Objekt des Typs BB_VGroup und endet durch
- BB_VGroup_End. VGroups können nochmal zu PGroups zusammengefaßt werden.
- Eine Modul-GUI enthält mindestens eine VGroup. VGroups und PGroups dürfen
- sich NICHT(!) in Gruppen des jeweils gleichen Typs befinden.
-
- Die GUI-Objekte (BB_Object) sind eine einfach verkettete, NULL-terminierte
- Liste. Da zur Zeit alle GUI-Objekte gleich groß sind, kann man zu diesem
- Zweck einfach ein Array vom Typ BB_Object anlegen und die Array-Elemente
- entsprechend verketten (Feld <next> zeigt auf das nächste Objekt oder NULL
- beim letzten).
-
- Die einzelnen Felder der Objekte (zB <set>, <contents>...) müssen vom
- Modul vorbelegt werden mit Standardeinstellungen, bevor die Message
- abgeschickt wird. Wenn im BLANK-Fall die Message zurückkommt, kann
- das Modul aus den GUI-Objekten die tatsächlich gewählten Parameter
- auslesen.
-
- Eine VGroup ist eine vertikale Gruppe von Gadgets. Die Gadgets werden in
- der GUI untereinander dargestellt. Wenn eine Modul-GUI mehrere VGroups
- besitzt, dann werden die vertikalen Gruppen nebeneinander dargestellt.
-
- Eine PGroup enthält mehrere VGroups. Diese können mit einem Cycle-Gadget
- oder einem Register-Gadget (je nachdem, wie MUI eingestellt ist),
- umgeschaltet werden.
-
- Eine Oberfläche könnte beispielsweise so aufgebaut sein:
- BB_VGroup->BB_Slider->BB_Slider->BB_VGroup_End->BB_VGroup->BB_Check->
- BB_Check->BB_VGroup_End
-
- Diese GUI hätte 2 Spalten. In der linken Spalte wären 2 Slider, in der
- rechten Spalte 2 Checkmarks. Mehr Beispiele findet man bei den beigelegten
- Modul-Sourcecodes.
-
-
- 4. Beschreibung der GUI-Objekte
- -------------------------------
-
- Man kann bei den Labels der GUI-Objekte einen Unterstrich "_" vor einen
- Buchstaben stellen, um diesen zur Taste für die Tastatursteuerung zu
- machen. Allerdings dürfen die Buchstaben A, C, I, P, S, T nicht benutzt
- werden, da diese für die unteren Buttons benötigt werden. Die Labels
- werden im Sourcecode in englisch definiert.
-
- Es folgt die Beschreibung der möglichen GUI-Objekte. Namen in <> sind
- Konstanten oder Felder in BB_Object.
-
- Pagegroup:
- Start durch <BB_PGroup>, Ende durch <BB_PGroup_End>.
- In <set> steht die voreingestellte Page-Nummer, <label> zeigt auf ein
- NULL-terminiertes Stringsarray mit den Überschriften für die Pages.
-
- Verticalgroup:
- Start durch <BB_VGroup>, Ende durch <BB_VGroup_End>.
- Falls <label> nicht NULL ist, muß <label> auf einen String zeigen. In
- diesem Fall hat die VGroup eine Überschrift und einen Rahmen.
-
- Checkmark-Gadget:
- Erkennung durch <BB_Check>.
- <set> kennzeichnet den Status, <label> zeigt auf den Labeltext.
-
- Stringgadget:
- Erkennung durch <BB_String>.
- <max> ist die maximale Anzahl Zeichen, die das Stringgadget zulassen soll,
- <contents> zeigt auf einen String-Buffer dafür, den DAS MODUL allokieren
- muß, <label> zeigt auf den Labeltext.
-
- Filegadget:
- Erkennung durch <BB_File>.
- <max> ist die maximale Anzahl Zeichen, die das Stringgadget zulassen soll,
- <contents> zeigt auf einen String-Buffer dafür, den DAS MODUL allokieren
- muß, <label> zeigt auf den Labeltext. Neben dem Stringgadget ist
- ein Popbutton für einen Filerequester.
-
- Directorygadget:
- Erkennung durch <BB_Dir>.
- Entspricht BB_File, erlaubt aber nur Selektion von Directories.
-
- Fontgadget:
- Erkennung durch <BB_Font>.
- <max> ist die maximale Anzahl Zeichen, die das Stringgadget zulassen soll,
- <contents> zeigt auf einen String-Buffer dafür, den DAS MODUL allokieren
- muß, <label> zeigt auf den Labeltext. Neben dem Stringgadget ist
- ein Popbutton für einen Fontrequester.
-
- Slider:
- Erkennung durch <BB_Slider>.
- <min> und <max> sind die Grenzen des Sliders, <set> der voreingestellte
- Wert, <label> zeigt auf den Labeltext.
-
- Cyclegadget:
- Erkennung durch <BB_Cycle>.
- <set> kennzeichnet die angewählte Option, <contents> zeigt auf ein
- NULL-terminiertes Stringarray mit den Optionen, <label> zeigt auf den
- Labeltext.
-
- Dummyobjekt:
- Erkennung durch <BB_Dummy>.
- Dieses Objekt wird als einziges verwendet, wenn das Modul keinerlei
- Einstellungsmöglichkeiten durch GUI-Objekte anbieten will.
-
-
- 5. Kommunikation mit BlitzBlank/BlitzBlankPrefs
- -----------------------------------------------
-
- Wenn das Modul gestartet wird, erhält es auch
- einen Zeiger auf die BlitzBlank-Screeninfo-Struktur. Hier kann das Modul
- abweichende Screenparameter festlegen. ZB könnte ein Modul <width> auf 100
- setzen. Dadurch bekäme es einen 100 Pixel breiteren Screen, als der
- Benutzer eingestellt hat. In der Screeninfo-Struktur kann das Modul <xpos>,
- <ypos>, <width> und <height> vorbelegen. Dieser Werte addiert BlitzBlank
- dann zu den vom Benutzer ausgewählten Werten. Im NORMALfall wird ein Modul
- nichts in diese Struktur hineinschreiben müssen, es sei denn, es will
- zB einen Screen von BlitzBlank haben, aber die Tiefe immer selbst
- festlegen (BBF_Colors wäre dann nicht gesetzt). In dem Fall würde
- das Modul VOR dem Aufruf von BBL_SendMessage() die Tiefe nach
- screeninfo->depth schreiben. Außerdem kann das Modul in <mindepth>
- und <maxdepth> die Tiefe des Screens eingrenzen, wenn es will. BlitzBlank,
- sowie der Screenmode-Requester von BBPrefs halten sich dann an diese
- Grenzen.
-
- Das Modul sendet durch BBL_SendMessage() dann eine Message an
- BlitzBlank/BlitzBlankPrefs, nachdem es die Flags in <flags>, den Infotext
- in <infotext> und (wenn Schlüsselwort!=INFO) in <first> den Zeiger auf das
- erste GUI-Objekt gesetzt hat.
- Die GUI-Objekte müssen mit den voreingestellten Parametern gefüllt sein.
- Wenn die Funktion zurückkommt, sind die Felder <modpri> und <path>
- gefüllt. <modpri> ist die eingestellte Modul-Taskpriorität (wird später in
- blank() gesetzt) und <path> ist der Pfad zu den Modulen, falls ein Modul
- noch eigene Daten nachladen will findet es diese dort (Namensmuster für
- extra Moduldaten: "BB.Modulname.*"). Auch ist nach BBL_SendMessage()
- die Screeninfo-Struktur ausgefüllt und ein Screen ist für das Modul
- bereitgestellt worden (außer, es wollte keinen). Die GUI-Objekte sind
- dann mit den vom Benutzer eingestellten Werten gefüllt und können
- ausgelesen werden.
-
- Folgendes passiert dann alles in blank():
- Das Modul sollte sodann sämtliche Vorberechnungen ausführen, evt. Daten
- nachladen, evt. Speicher allokieren etc. Dann bringt es seinen Screen
- mit ScreenToFront (screeninfo->bbscreen) in den Vordergrund, prüft
- ob mittlerweile ein CTRL-C ankam und ruft dann BBL_ModuleRunning() auf.
- Schließlich kann die Hauptaktion des Modules starten. Hier werden
- die eingestellten Parameter aus den GUI-Objekten ausgelesen. Das Modul muß
- auf einen Abbruch durch CTRL-C reagieren können. In diesem Fall gibt das
- Modul alles wieder frei (außer dem Screen, wenn es kein eigener war) und
- ruft dann BBL_ModuleDone() auf. Damit ist das Modul dann beendet.
- Falls das Modul von BlitzBlank keinen Screen bekommt, obwohl es einen
- möchte (screeninfo->bbscreen==NULL), oder aus Speicherplatzmangel
- keine Variablen anlegen kann, dann sollte das Modul sofort BBL_ModuleDone()
- aufrufen und sich danach beenden.
-
-
- 6. Erklärung der Flags
- ----------------------
-
- BBF_Screenmode : Das Modul erlaubt Screenmode-Auswahl
- BBF_Colors : Das Modul erlaubt Farbanzahl-Auswahl
- BBF_Sample : Noch nicht implementiert
- BBF_NoWatch : Das Modul verbraucht keine(!) CPU-Zeit
- BBF_NoScreen : Das Modul will von BlitzBlank keinen Screen
- BBF_FirstScreen : Das Modul will die Daten der vordersten Screens
- BBF_CloneScreen : Das Modul will eine Kopie des vordersten Screens
- BBF_AmigaOnly : Das Modul ist NICHT kompatibel mit Grafikkarten
- BBF_NoMouseBlank : Das Modul will nicht, daß die Maus geblankt wird
- BBF_NoKeyPass : Das Modul benutzt keinen Screen und aktiviert auch kein Window
- BBF_BigWindow : Das Blankwindow füllt den ganzen Screen aus
- BBF_Interleaved : BlitzBlank vesucht, einen Screen mit Interleaved BitMap zu öffnen
-
- Wenn ein Modul einen eigenen Screen will, (wie zB BB.Pyro), dann wird es die
- Flags BBF_Screenmode und BBF_Colors setzen.
-
- Wenn ein Modul am vordersten Screen DIREKT manipuliert (wie zB BB.Fade),
- wird es das Flag BBF_FirstScreen setzen. Diese Art von Modulen ist mit
- großer Vorsicht zu genießen.
-
- Wenn ein Modul Effekte auf einer exakten Kopie des vordersten Screens
- ausführt (wie zB BB.Melt), dann wird es das Flag BBF_CloneScreen setzen.
-
- Wenn BBF_NoMouseBlank NICHT gesetzt ist, öffnet BlitzBlank ein Window
- auf dem jeweiligen Screen, setzt darauf einen leeren Mauszeiger
- (SetPointer()) und aktiviert dieses.
-
- Hinweise:
- ---------
- Wenn ein Modul seinen Screen selbst öffnen und verwalten will
- (BBF_NoScreen), sollte es die Funktionen BBL_BlankMouse() und
- BBL_UnBlankMouse zum Mausblanken auf diesem Screen benutzen.
-
- Zum Schließen des Screens sollte es BBL_CloseScreenSafe () benutzen.
-
- Der Screen sollte mit dem Tag "SA_Behind,TRUE" geöffnet werden und
- erst kurz vor BBL_ModuleRunning() mit ScreenToFront() in den
- Vordergrund gebracht werden.
-
- Außerdem sollte es mit
- VideoControlTags(screen->ViewPort.ColorMap,VTAG_BORDERBLANK_SET,-1,TAG_DONE);
- den Border seines Screens auf schwarz schalten.
-
- Desweiteren MUSS das Modul seinen selbst geöffneten Screen in
- screeninfo->bbscreen eintragen!
-
- Module, die eine Kopie des vordersten Screens anfordern (BBF_CloneScreen),
- können einen Screen mit mehr Planes, als der Originalscreen anfordern,
- wenn sie in screeninfo->depth die Differenz eintragen.
-
-
- 7. Beschreibung der BlitzBlank-Strukturen und Flags
- ---------------------------------------------------
-
- #ifndef BLITZBLANK_H
- #define BLITZBLANK_H
-
- #include <exec/ports.h>
- #include <exec/tasks.h>
-
-
- /****************************************/
- /* $VER: BlitzBlank.h 2.50 (01.03.95) */
- /****************************************/
-
- /********************************/
- /* Stuff for blitzblank.library */
- /********************************/
-
- #define BLITZBLANKLIB_VER 6
-
- extern struct BitMap *BBL_AllocBitMap (ULONG width,ULONG height,ULONG depth,ULONG flags);
- extern struct BitMap *BBL_AllocDBufBitMap (struct Screen *screen);
- extern struct RastPort *BBL_AllocRastPort (ULONG width,ULONG height,ULONG depth,ULONG flags);
- extern void BBL_BlankDone (void);
- extern struct Window *BBL_BlankMouse (struct Screen *screen,UBYTE mode);
- extern void BBL_CloseScreenSafe (struct Screen *screen);
- extern BOOL BBL_CopyOriginalColors (struct Screen *screen);
- extern BOOL BBL_CopyOriginalScreen (struct Screen *screen);
- extern void BBL_EndDBuf (ULONG handle);
- extern BOOL BBL_FadeDown (struct Screen *screen,UBYTE final,UBYTE delay);
- extern void BBL_FreeBitMap (struct BitMap *bitmap);
- extern void BBL_FreeRastPort (struct RastPort *rastport);
- extern long BBL_GetDarkestPen (struct Screen *screen);
- extern char* BBL_GetString (UWORD num,char *text);
- extern ULONG BBL_InitDBuf (struct Screen *screen,struct BitMap *bitmap);
- extern void BBL_ModuleRunning (void);
- extern BOOL BBL_ScreenAvailable (struct Screen *screen);
- extern BOOL BBL_SendMessage (struct BB_Message *bbmessage,char *portname);
- extern void BBL_ShowBitMap (struct Screen *screen,struct BitMap *bitmap,ULONG handle);
- extern void BBL_UnBlankMouse (struct Window *window);
-
-
- /*******************************************************************/
- /* The different kinds of GUI-objects for a module's config-window */
- /*******************************************************************/
-
- #define BB_PGroup 1 /* Indicates the start of a new page group */
- #define BB_PGroup_End 2 /* Indicates the end of the page group */
- #define BB_VGroup 3 /* Indicates the start of a new vertical group */
- #define BB_VGroup_End 4 /* Indicates the end of the vertical group */
- #define BB_Check 5 /* Checkmark, uses set field in BB_Object */
- #define BB_String 6 /* Textgadget, uses max/contents fields in BB_Object */
- #define BB_File 7 /* Stringgadget with attached filerequester */
- #define BB_Slider 8 /* Slidergadget, uses min/max/set fields in BB_Object */
- #define BB_Cycle 9 /* Cyclegadget, uses set/contents in BB_Object */
- #define BB_Dummy 10 /* Dummy, if you want no gadgets at all */
- #define BB_Font 11 /* Stringgadget with attached fontrequester */
- #define BB_Dir 12 /* Stringgadget with attached filerequester, Dirs only */
-
- /*****************************************/
- /* Flags used in BB_Message's flag-field */
- /*****************************************/
-
- #define BBF_Screenmode (1L << 0) /* Allows screenmode-selection */
- #define BBF_Colors (1L << 1) /* Allows screendepth-selection */
- #define BBF_Sample (1L << 2) /* Not supported yet */
- #define BBF_NoWatch (1L << 3) /* Eats no CPU-time, so needs no checking */
- #define BBF_NoScreen (1L << 4) /* Wants no screen from BlitzBlank */
- #define BBF_FirstScreen (1L << 5) /* Wants pointer to screen in front, be CAREFUL with this! */
- #define BBF_CloneScreen (1L << 6) /* Wants a clone from the FrontScreen */
- #define BBF_AmigaOnly (1L << 7) /* Not supported yet */
- #define BBF_NoMouseBlank (1L << 8) /* No mouseblanking from BlitzBlank wanted */
- #define BBF_NoKeyPass (1L << 9) /* No keypassing necessary (no mouseblanking, no own active window */
- #define BBF_BigWindow (1L << 10) /* The blankwindow fills the whole screen */
- #define BBF_Interleaved (1L << 11) /* BlitzBlank TRIES to give you a screen with an Interleaved BitMap */
-
-
- /*****************************************/
- /* The structure, that holds config-data */
- /*****************************************/
-
- struct BB_Object
- {
- struct BB_Object* next; /* Pointer to next object or NULL if last object */
- WORD type; /* What kind of GUI-object this is */
- long min; /* Minimum value for BB_Slider */
- long max; /* Maximum value for BB_Slider, max length of BB_String */
- long set; /* Value of BB_Slider, state of BB_Checkmark, BB_Cycle */
- char *contents; /* Pointer to buffer for BB_String, pointer to stringarray for BB_Cycle */
- char *label; /* Label for ALL objects */
- };
-
-
- /*****************************************************/
- /* The message to send to BlitzBlank/BlitzBlankPrefs */
- /*****************************************************/
-
- struct BB_Message
- {
- struct Message msg; /* Normal Exec-Message-structure */
- long flags; /* Flags for this module */
- char *infotext; /* Pointer to infotext for this module */
- struct BB_Object *first; /* Pointer to first BB_Object or NULL for Info-action */
- WORD modpri; /* not of use, if you use the library */
- char *path; /* Path to directory for module-data */
- struct Task *blitzblank; /* not of use, if you use the library */
- };
-
-
- /***************************************/
- /* The BlitzBlank-Screeninfo-structure */
- /***************************************/
-
- struct BB_Screeninfo
- {
- WORD xpos; /* should be 0 */
- WORD ypos; /* should be 0 */
- WORD width; /* User-selected screen-width */
- WORD height; /* User-selected screen-height */
- WORD depth; /* User-selected screen-depth */
- long mode; /* User-selected screen-mode */
- struct Screen *bbscreen; /* module screen */
- struct Window *bbwindow; /* blank window */
- WORD mindepth; /* desired minimum depth or 0 */
- WORD maxdepth; /* desired maximum depth or 0 */
- };
-
-
- /************************************************************/
- /* Flag-definition for BBL_AllocBitMap()/BBL_AllocRastPort, */
- /* if you don't have the V39-includes */
- /************************************************************/
-
- #ifndef BMB_CLEAR
- #define BMB_CLEAR 0
- #define BMB_DISPLAYABLE 1
- #define BMB_INTERLEAVED 2
- #define BMF_CLEAR (1l<<BMB_CLEAR)
- #define BMF_DISPLAYABLE (1l<<BMB_DISPLAYABLE)
- #define BMF_INTERLEAVED (1l<<BMB_INTERLEAVED)
- #endif
-
- #endif
-
-
- 8. Beschreibung der globalen Definitionen eines Moduls (Beispiel)
- -----------------------------------------------------------------
-
- /* Einbindung der BlitzBlank-Definitionen */
-
- #include <pragmas/blitzblank_pragmas.h>
- #include <BlitzBlank.h>
-
- /* Definition der BlitzBlankBase */
-
- struct Library *BlitzBlankBase;
-
- /* Versionstring */
-
- static const char version[]="$VER: BB.Melt 2.50 (26.12.94)";
-
- /* Definition der Texte (in englisch) */
-
- char *text[]={"\33c\33uMelt\33n\n\nModule for BlitzBlank\n\nCopyright1994\nby\nThomas Börkel",
- "_Speed:",
- "S_ize:"};
-
- /* Definition der GUI-Objekte mit den Voreinstellungsparametern */
-
- struct BB_Object object[]={ {&object[1],BB_VGroup ,0, 0, 0,NULL,NULL},
- {&object[2],BB_Slider ,1,150,100,NULL,NULL},
- {&object[3],BB_Slider ,1,100, 30,NULL,NULL},
- {NULL ,BB_VGroup_End,0, 0, 0,NULL,NULL} };
-
-
- /* Definiton der BB_Message */
-
- struct BB_Message message;
-
- /* Definition des Zeigers auf BB_Screeninfo */
-
- struct BB_Screeninfo *screeninfo;
-
-
- 9. Genaue Beschreibung des Hauptprogramms (Beispiel)
- ----------------------------------------------------
-
- Das Hauptprogramm sollte folgendermaßen aussehen (Beispiel in C):
-
- void main (int argc,char **argv)
- {
- int i;
-
- /* Öffnen der blitzblank.library */
-
- if (!(BlitzBlankBase=OpenLibrary ("blitzblank.library",BLITZBLANKLIB_VER)))
- exit (0);
-
- /* Flags setzen */
-
- message.flags=BBF_CloneScreen;
- message.first=&object[0];
-
- /* BLANK/CONFIG/INFO? */
-
- if (strcmp (argv[1],"BLANK")==0)
- {
-
- /* screeninfo holen */
-
- StrToLong (argv[3],(long *) &screeninfo);
-
- /* Message und GUI-Objekte ausfüllen lassen */
-
- BBL_SendMessage (&message,argv[2]);
-
- /* Screen offen? */
-
- if (screeninfo->bbscreen)
-
- /* Blanken */
-
- blank ();
-
- /* Blankroutine beendet */
-
- BBL_BlankDone ();
- }
- else
- {
-
- /* Locale-Texte holen (200=Zahl, die vom BB-Autor zugewiesen wird) */
-
- message.infotext=BBL_GetString (200,text[0]);
-
- for (i=1;i<=5;i++)
- object[i].label=BBL_GetString (200+i,text[i]);
-
- if (strcmp (argv[1],"CONFIG")==0)
- {
- BBL_SendMessage (&message,argv[2]);
- }
- else
- {
- message.first=NULL;
- BBL_SendMessage (&message,argv[2]);
- }
- }
-
- /* Library schließen */
-
- CloseLibrary (BlitzBlankBase);
- exit (0);
- }
-
-
- 10. Genaue Beschreibung von blank()
- -----------------------------------
-
- void blank (void)
- {
-
- /* Vorbereitungen treffen (Speicher allokieren etc) */
-
- /* Wenn das Modul seinen Screen selbst öffnete, muß es ihn jetzt in */
- /* screeninfo->bbscreen eintragen */
-
- if (!CheckSignal (SIGBREAKF_CTRL_C))
- {
-
- /* Screen nach vorne holen */
-
- ScreenToFront (screeninfo->bbscreen);
-
- BBL_ModuleRunning (); /* Screen muß hier bereits vorne sein */
-
- /* Hauptschleife mit Abbruchmöglichkeit durch SIGBREAKF_CTRL_C */
- /* Eingestellte Parameter aus den GUI-Objekten auslesen */
-
- }
-
- /* Aufräumen */
-
- return;
- }
-
-
- 11. Hinweise zur Unterstützung der locale.library
- -------------------------------------------------
-
- BlitzBlank/BlitzBlankPrefs verwenden EINEN Catalog "blitzblank.catalog".
- Hier drin stehen die lokalisierten Strings für BlitzBlank, BlitzBlankPrefs
- und alle Module. Welche Strings zu dem jeweiligen Modulen gehören, legt der
- BlitzBlank-Autor fest. Die Modul-Programmierer sollten in ihren Programmen
- die englischen Texte einbauen und die passenden deutschen dazu dem Autor
- mitteilen. Dieser baut die Texte dann in den Catalog ein.
- Zur Zeit sind folgende Nummern für Texte vergeben:
-
- 001-199: BlitzBlank/BlitzBlankPrefs
- 200-209: BB.Melt
- 210-219: BB.Fade
- 220-229: BB.Pyro
- 230-239: BB.Crumble
- 240-249: BB.Mosaic
- 250-259: BB.Aquarium
- 260-269: BB.Flash
- 270-279: BB.Lines
- 280-289: BB.Butterfly
- 290-299: BB.Slideshow
- 300-309: BB.Starfield
- 310-319: BB.Splines
- 320-329: BB.AmigaSign
- 330-339: BB.PatternCycling
- 340-349: BB.Execute
- 350-359: BB.Worms
- 360-379: BB.Tiles
- 380-399: BB.Clock
- 400-409: BB.Mandel
- 410-419: BB.Electric
- 420-429: BB.Fountain
- 430-439: BB.Guru
- 440-449: BB.Noise
- 450-459: BB.Radar
- 460-469: BB.Snow
- 470-479: BB.Worms2
- 480-499: BB.Spot
- 500-509: BB.Life
- 510-519: BB.Dissolve
- 520-539: BB.Tunnel
- 540-549: BB.Gravity
- 550-559: BB.Skyline
- 560-589: BB.Text
- 590-599: BB.FlyingToaster
- 600-629: BB.Plasma
- 630-639: BB.TicTacToe
- 640-649: BB.Maze
- 650-659: BB.ARose
- 660-669: BB.Fractal
- 670-699: Reserved
- 700-709: BB.Goats
- 710-729: BB.ASwarm
-
-
- 12. AmigaGuide-Anleitung für die Module
- ---------------------------------------
-
- Die Anleitung für die Module wird in das globale AmigaGuide-Dokument
- BlitzBlank.Guide mit eingebunden und wird dann beim Druck auf die
- HELP-Taste im jeweiligen Prefs-Window eines Moduls für dieses Modul von
- BlitzBlankPrefs angezeigt. Die Modul-Anleitung mit Copyright-Hinweis
- und Anschrift des Autors sollte dem BlitzBlank-Autor möglichst in
- englisch und deutsch gegeben werden, damit sie in das Guide einkopiert
- werden kann.
-
-
- 13. Tips & Tricks
- -----------------
-
- - Wenn BlitzBlank von der Shell aus gestartet wird, erscheinen auch alle
- CON-Ausgaben der Module in dieser Shell (nützlich zu Debug-Zwecken). Wird
- BlitzBlank von der WB aus gestartet und das Modul macht CON-Ausgaben,
- dann wirft das Modul Enforcer-Hits. Das ist normal, da die Module
- beim WB-Start keinen Ausgabe-Kanal bekommen. Die Module dürfen
- nur zu Debug-Zwecken CON-Ausgaben machen.
-
- - Der ARexx-Befehl DEBUG erlaubt es, ein Modul zu starten, das dann NUR
- durch den ARexx-Befehl UNBLANK oder das Beenden von BlitzBlank
- gestoppt wird. Man kann also in Ruhe das Modul austesten etc.
-
- - Am besten wird die Vorgehensweise verständlich, wenn man sich die
- mitgelieferten Source-Codes anschaut.
-
- - Module, die externe Daten brauchen, müssen diese so benennen:
- "BB.Modulname.xyz".
-
- - In der blitzblank.library befinden sich nicht nur die unbedingt
- notwendigen Funktionen, sondern auch ein paar nützliche (zB auch
- für Double-Buffering!).
-
- - Man sollte bei Modulen, die Zufallsfunktionen gebrauchen, nicht
- vergessen, den Seed zu setzen (zB mit der aktuellen Uhrzeit, siehe
- zB BB.Lines).
-
- - Normalerweise zeichnet man in &screeninfo->bbscreen->RastPort, was recht
- schnell ist. Allerdings hat man dann kein Clipping. Um Clipping zu
- benutzen, setzt man das Flag BBF_BigWindow und zeichnet dann in
- screeninfo->bbwindow->RPort.
-