Referenzhandbuch
|
Kapitel 31
|
Blitting
Dieser Abschnitt enthält alle Befehle, die das Zeichnen von Shapes auf Bitmaps mittels des Amiga-Blitterchips emöglichen.
Befehl: Blit
Syntax: Blit Shapenummer,X,Y[,Excessonoff]
Modus: Amiga/Blitz
Blit ist der simpelste Weg, ein Shape Shapenummer auf der aktuellen Bitmap
an der Position X,Y zu blitten. Beachten Sie, daß der "Hotspot" (Handle) für die
Position entscheidend ist. Normalerweise befindet sich der "Hotspot" an der linken, oberen Ecke des Shapes. Der
Excessonoff-Parameter wird benötigt, wenn Sie ein Shape mit weniger Bitplanes (Farben), als die
zu benutzende Bitmap besitzt, blitten wollen. Excessonoff schaltet überschüssige Bitplanes
aus, um eine Shapeanpassung zu ermöglichen. Bit 0 von Excessonoff gibt einen an/aus Wert für
die erste überzählige Bitplane, Bit 1 für die zweite überzählige Bitmap und so weiter. Die Art, wie das Shape auf
die Bitplane geblittet wird, kann mit dem BlitMode-Befehl eingestellt werden.
Beispiel:
Screen 0,3
ScreensBitMap 0,0
Cls
Circlef 32,32,32,3
Circlef 32,32,16,2
GetaShape 0,0,0,64,64
Cls
Blit 0,160,100
MouseWait
siehe auch: BlitMode, QBlit, BBlit
Befehl: BlitMode
Syntax: BlitMode BLTCON0
Modus: Amiga/Blitz
Mit BlitMode legen Sie fest, wie der Blit-Befehl den Blitter benutzt, wenn Shapes
auf die Bitmaps gezeichnet werden. Hier nun einige BLTCON0-Parameter und deren Effekte:
BLTCON0-Modus |
Effekt |
CookieMode |
Shapes werden gezeichnet "wie sie sind" |
EraseMode |
Auf der Zielbitmap wird eine Fläche in der Größe des Shapes gelöscht |
InvMode |
Auf der Zielbitmap wird eine Fläche in der Größe des Shapes invers gezeichnet |
SolidMode |
Das Shapeobjekt wird als einfarbiger Block gezeichnet |
Obige Modi sind alles Funktionen, die einen benutzbaren Wert wiedergeben.
Für fortgeschrittene Programmierer:
Die Bits 0 bis 7 legen Blitter MINITERM fest, die Bits 8 bis 11 legen fest, wie die Bliterkanäle benutzt werden.
Kanaleinstellung für alle Blitterroutinen in AmiBlitz2:
Kanal |
Effekt |
A |
Zeiger auf das Shape Cookie Cut |
B |
Zeiger auf Shape Data |
C |
Zeiger auf Ziel |
D |
Zeiger auf Ziel |
Beispiel:
Screen 0,3 ;ein Intuition-Bildschirm
ScreensBitMap 0,0 ;benutze seine Bitmap
Cls ;lösche Bitmap
For k=7 To 1 Step -1 ;Schleifenstart
Circlef 32,32,k*4,k ;Kreise...
Next ;Schleifenende
GetaShape 0,0,0,64,64 ;Shape aufnehmen
Cls 2 ;Bitmap 2 mit Farbe 2 löschen
Circlef 160,100,120,90,6 ;einen Kreis malen
BlitMode CookieMode ;einen Blitmodus ausprobieren
Blit 0,0,0
BlitMode EraseMode ;ein anderer
Blit 0,160,0
BlitMode InvMode ;noch ein anderer...
Blit 0,0,100
BlitMode SolidMode ;und ein letzter
Blit 0,160,100
MouseWait
siehe auch: QBlitMode, BBlitMode, SBlitMode
Funktion: CookieMode
Syntax: CookieMode
Modus: Amiga/Blitz
Als Funktion angewendet, wird ein Wert übergeben, der in Beziehung zu Befehl und Blitmodus steht. Wird
CookieMode als Blitmodus benutzt, wird das Shape "so wie es ist" sauber auf die Bitmap geblitted.
siehe auch: BlitMode, BBlitMode, QBlitMode, EraseMode, InvMode, SolidMode
Funktion: EraseMode
Syntax: EraseMode
Modus: Amiga/Blitz
Als Funktion angewendet, wird ein Wert übergeben, der in Beziehung zu Befehl und Blitmodus steht. Wird
EraseMode als Blitmodus benutzt, löscht das Shape einen Bereich der Bitmap in Abhängigkeit von
den Außenrändern des zu blittenden Shapes.
Funktion: InvMode
Syntax: InvMode
Modus: Amiga/Blitz
Als Funktion angewendet, wird ein Wert übergeben, der in Beziehung zu Befehl und Blitmodus steht. Wird
InvMode als Blitmodus benutzt, "invertiert" das Shape einen Bereich der Bitmap in
Abhängigkeit von den Außenrändern des zu blittenden Shape.
Funktion: SolidMode
Syntax: SolidMode
Modus: Amiga/Blitz
Als Funktion angewendet, wird ein Wert übergeben, der in Beziehung zu Befehl und Blitmodus steht. Wird
SolidMode als Blitmodus benutzt, überschreibt das Shape einen Bereich der Bitmap in Abhängigkeit
von den Außenrändern des zu blittenden Shape.
Befehl: Queue
Syntax: Queue Queuenummer,maximale Anzahl
Modus: Amiga/Blitz
Das Queue-Kommando stellt ein Queueobjekt zur Benutzung durch die Befehle QBlit
und UnQueue her. In AmiBlitz2 werden Queues zur einfachen Nutzung von Mehrfach-Shape-Animationen verwendet.
Bevor wir näher auf die Queues eingehen, betrachten wir uns kurz die Grundlagen einer Animation.
Sagen wir, Sie möchten eine Gruppe von Shapes über den Bildschirm "fliegen" lassen. Um dies zu erreichen, müssen
Sie eine Schleife konstruieren, ähnlich der folgenden:
- Beginne mit dem ersten Objekt
- Lösche das Objekt vom Display
- Bewege das Objekt
- Zeichne das Objekt an der neuen Stelle auf dem Display
- Sollten weitere Objekte zu bewegen sein, benutze das nächste Objekt, dann gehe zu Schritt 2, andernfalls...
- gehe zu Schritt 1
Sehr wichtig ist Schritt 2. Sollten Sie diesen nicht durchführen, werden die Shapeobjekte nicht gelöscht, und beim Bewegen
bleiben Reste stehen. Dadurch werden "Schwänze" hinter Ihren Objekten gebildet. Meist ist es sehr lästig, jedes
einzelne Objekt zu löschen, bevor Sie es bewegen. Hierzu können Sie nun Queues benutzen.
Queue (gesprochen:kju) heißt Reihe oder Schlange und in etwa kann man sich Queues als Warteschlangen vorstellen. Queues
"erinnern" sich an die in einer Schleife gezeichneten Objekte und am Ende der Schleife (oder zu Beginn der nächsten
Schleife) werden ALLE Objekte der vorherigen Schleife, die sich die Queue "gemerkt" hat, gelöscht. Sehen wir uns den
Vorgang an:
- Lösche alle Objekte, die sich in der Queue befinden
- Beginne mit dem ersten Objekt
- Bewege das Objekt
- Zeichne das Objekt an der neuen Stelle und füge es an das Ende der Queue
- Sollen weitere Objekte bewegt werden gehe zum nächsten Objekt und dann zu Schritt 3, andernfalls...
- Gehe zu Schritt 1
Wenn Sie das schnelle BB2 Queuesystem anwenden, bedeutet dies:
Der UnQueue-Befehl stellt den Schritt 1 dar und der QBlit-Befehl Schritt 4.
Der Parameter maximale Anzahl legt die Anzahl der Shapes fest, die sich die Queue "merken"
kann.
Beispiel:
Screen 0,1 ;ein Intuition-Bildschirm
ScreensBitMap 0,0 ;benutze seine Bitmap
Cls ;lösche die Bitmap
Circlef 16,16,16,1 ;Kreis malen
GetaShape 0,0,0,32,32 ;in ein Shape wandeln
Cls ;Bildschirm wieder löschen
Queue 0,8 ;Queue initialisieren - maximal 8 Shapes
BLITZ ;Speed - im Blitz-Modus!
For y=0 To 160 ;Bitmap herunterschieben
VWait ;auf Anfang des Frames warten
UnQueue 0 ;alle vorher ge-"QBlittete" Shapes entfernen
For x=1 To 8 ;über die Bitmap bewegen
QBlit 0,0,x*32,y ;Objekt malen und es sich in Queue 0 merken
Next ;nochmal...
Next ;nochmal...
MouseWait
siehe auch: QBlit, UnQueue
Befehl: QBlit
Syntax: QBlit Queuenummer,Shapenummer,X,Y[,Excessonoff]
Modus: Amiga/Blitz
QBlit arbeitet wie Blit und wird benutzt, um ein Shape auf die aktuelle Bitmap zu
zeichnen. Im Gegensatz zu Blit wird bei QBlit (durch Benutzung von
Queue) die Position und die Größe des Shape festgehalten. Dadurch kann das Shape (oder die Shapes)
später schnell und einfach mit dem UnQueue-Befehl gelöscht werden.
Bitte lesen Sie auch den Text unter Queue.
Weitere Informationen zu den Parametern erhalten Sie unter Blit.
siehe auch: Blit, UnQueue, Queue
Befehl: UnQueue
Syntax: UnQueue Queuenummer[,Bitmapnummer]
Modus: Amiga/Blitz
UnQueue löscht alle "gemerkten" Teile einer Queue von der aktuellen Bitmap. Mit
Bitmapnummer kann auch eine andere Bitmap benutzt werden. Durch QBlit
werden die Teilstücke (Shapedaten) in die Queue übergeben.
Bitte lesen Sie auch unter Queue.
Beispiel:
Screen 0,1 ;ein Intuition-Bildschirm
ScreensBitMap 0,0 ;benutze seine Bitmap
Cls ;lösche Bitmap
Circlef 16,16,16,1 ;male einen Kreis
GetaShape 0,0,0,32,32 ;in ein Shape wandeln
Cls ;Bildschirm wieder löschen
For k=1 To 100
Circlef Rnd(320),Rnd(DispHeight),Rnd(50),1 ;ein paar Kreise malen
Next
CopyBitMap 0,1 ;ein Duplikat der Bitmap 0 erstellen
Queue 0,8 ;Queue erstellen - maximal 8 Einträge!
BLITZ ;Blitz-it!
For y=0 To 160 ;die Bitmap herunterfahren
VWait ;auf den Frameanfang warten
UnQueue 0,1 ;alle vorherigen Shapes löschen
For x=1 To 8 ;über die Bitmap bewegen
QBlit 0,0,x*32,y ;Objekt malen und es in Queue 0 merken
Next ;nochmal...
Next ;nochmal...
MouseWait
Befehl: FlushQueue
Syntax: FlushQueue Queuenummer
Modus: Amiga/Blitz
Entleert das gewählte Queueobjekt. Der nächste UnQueue-Befehl bleibt ohne Wirkung.
siehe auch: Queue, QBlit
Befehl: QBlitMode
Syntax: QBlitMode BLTCON0
Modus: Amiga/Blitz
Wie BlitMode, hier für das QBlitting. Bitte lesen Sie unter BlitMode.
siehe auch: BlitMode
Befehl: Buffer
Syntax: Buffer Buffernummer,Speicherlänge
Modus: Amiga/Blitz
Buffer stellt ein Bufferobjekt her. Bitte lesen Sie unbedingt unter Queue und
QBlit nach, da Buffer diese Grundlagen verwendet.
Buffer, BBlit und UnBuffer arbeiten wie die
Queuebefehle, zusätzlich wird aber noch die Hintergrundgrafik zwischengespeichert. Durch UnBuffer wird
das Shape von der Bitplane gelöscht und die Hintergrundgrafik wiederhergestellt. Diese Art des Blittens ist zwar sehr komfortabel,
aber auch sehr speicherintensiv. Eine Speicherlänge von 16384 Byte ist voreingestellt und sollte für die meisten Situationen
ausreichen. Sie ist aber abhängig von der Shapegröße und der Anzahl der Shapes, die zwischen
BBlit und UnBuffer erzeugt werden.
Sollte die Buffergröße nicht ausreichen, erhalten Sie eine "Buffer Overflow"-Fehlermeldung.
Beispiel:
BitMap 0,64,64,1
Boxf 0,0,63,63,1
GetaShape 0,0,0,64,64
FindScreen 0
ScreensBitMap 0,0
Buffer 0,16384 ;16384 Bytes zum Buffern
For x=0 To 600
VWait
UnBuffer 0
BBlit 0,0,x,192
Next
MouseWait
Befehl: BBlit
Syntax: BBlit Buffernummer,Shapenummer,X,Y[,Excessonoff]
Modus: Amiga/Blitz
Wie Blit/QBlit, zusätzlich wird die Hintergrundgrafik in einem Buffer (Puffer)
zwischengespeichert. Weitere Informationen erhalten Sie unter Buffer und Queue.
Die Parameter werden unter Blit erklärt.
Beispiel:
Screen 0,3 ;ein Intuition-Bildschirm
ScreensBitMap 0,0 ;benutze seine Bitmap
Cls ;Bitmap löschen
Circlef 8,8,8,7 ;Kreis malen
GetaShape 0,0,0,20,16 ;als Shape benutzen
Cls ;und Bitmap wieder löschen
For k=1 To 100 ;100 zufällige Vierecke zeichnen
Boxf Rnd(320),Rnd(200),Rnd(320),Rnd(200),Rnd(6)+1
Next
Buffer 0,16384 ;Bufferspeichergröße setzen
While Joyb(0)=0 ;Schleifenstart bis Maustastenklick
VWait ;auf Vertical Blank warten
UnBuffer 0 ;Bereiche in der Bitmap ersetzen
BBlit 0,0,SMouseX/2+80,SMouseY/2+50 ;Objekt blitten dem Puffer hinzufügen
Wend
siehe auch: Buffer, UnBuffer
Befehl: UnBuffer
Syntax: UnBuffer Buffernummer
Modus: Amiga/Blitz
Löscht mit BBlit gezeichnete Shapes von der Bitmap, und die Hintergrundgrafik wird wieder hergestellt.
Weitere Informationen erhalten Sie unter Buffer.
siehe auch: Buffer, BBlit
Befehl: FlushBuffer
Syntax: FlushBuffer Buffernummer
Modus: Amiga/Blitz
FlushBuffer entleert den Buffer. Der nächste UnBuffer-Befehl hat keine Wirkung.
siehe auch: Buffer, BBlit
Befehl: BBlitMode
Syntax: BBlitMode BLTCON0
Modus: Amiga/Blitz
Wie BlitMode, hier für BBlitting. Weitere Informationen unter BlitMode.
siehe auch: BlitMode
Befehl: Stencil
Syntax: Stencil Stencilnummer,Bitmapnummer
Modus: Amiga/Blitz
Der Stencil-Befehl erstellt ein Stencilobjekt basierend auf den Daten der zuvor erstellten Bitmap.
Stencil beinhaltet alle Grafikdaten der Bitmap und wird mit den SBlit- und
ShowStencil-Befehlen benutzt.
Beispiel:
For k=1 To 7 ;einige konzentrische Kreise zeichnen
Circle 160,115,k*10,k
Next
Stencil 0,0 ;ein Stencil aus Bitmap 0 machen
Buffer 0,16384 ;Puffer für BBlit setzen
BLITZ ;BLITZ!
For x=0 To 280 ;Shapes bewegen
VWait ;auf Vertical Blank warten
UnBuffer 0 ;BBlits erstezen
For y=50 To 150 Step 50
BBlit 0,0,x,y ;einige unserer Shapes BBlitten
Next
ShowStencil 0,0 ;Stencil
Next
MouseWait
Befehl: SBlit
Syntax: SBlit Stencilnummer,Shapenummer,X,Y[,Excessonoff]
Modus: Amiga/Blitz
SBlit arbeitet wie Blit, speichert aber die Stencildaten. Dies ist ein schneller
Weg, um eine "Vordergrundgrafik" auf der Bitmap auszugeben. Weitere Informationen erhalten Sie unter
Blit.
Beispiel:
Screen 0,3 ;ein Intuition-Bildschirm
ScreensBitMap 0,0 ;benutze seine Bitmap
Boxf 0,0,31,31,3 ;eine Box auf der Bitmap zeichnen
GetaShape 0,0,0,32,32 ;als Shape 0 aufnehmen
Cls ;Bitmap löschen
Boxf 0,0,15,15,4 ;eine andere Box malen
GetaShape 1,0,0,16,16 ;und sie als Shape 1 aufnehmen
Cls ;ein anderes CLS
Stencil 0,0 ;Stencil erzeugen
For k=7 To 1 Step -1 ;ein "Bullauge" im Hintergrund malen
Circlef 160,115,k*10,k
Next
For k=1 To 50 ;50 Zufalls-Vordergrund-Kästen zeichnen
SBlit 0,1,Rnd(320-16),Rnd(200-16)
Next
Buffer 0,16384 ;initialsiere Buffer
BLITZ ;ab in den BLITZ-Mode!
For x=0 To 280 ;Schleifenstart
VWait ;auf Vertical Blank warten
UnBuffer 0 ;Pufferinhalt ersetzen
For y=50 To 150 Step 50
BBlit 0,0,x,y ;unser Shape blitten
Next
ShowStencil 0,0
Next
MouseWait
Befehl: SBlitMode
Syntax: SBlitMode BLTCON0
Modus: Amiga/Blitz
Wie BlitMode, hier für SBlitting. Weitere Informationen erhalten Sie unter
BlitMode.
siehe auch: BlitMode
Befehl: ShowStencil
Syntax: ShowStencil Buffernummer,Stencilnummer
Modus: Amiga/Blitz
Mit den Stencil-Befehlen (SBlit, ShowStencil) erhalten Sie ungeahnte
Möglichkeiten. Allerdings ist es nicht einfach, das Prinzip zu erklären. Wenn Sie aber einmal die Zusammenhänge
verstanden haben (und das erreichen Sie, wie bei vielen anderen Befehlen auch, am besten durch Ausprobieren) werden Sie Effekte
anwenden können, die Sie kaum für möglich halten. Und Sie werden erkennen, daß viele Profispiele genau diese
Effekte nutzen.
Erst vor kurzer Zeit lag mir ein sehr gutes PD-Programm vor, worin sich der Autor etwa wie folgt in der Anleitung äußert:
"...leider können Stencils (was immer dies auch sein soll) nicht angezeigt werden..."
Damit Sie nicht ebenso dastehen, werde ich jetzt versuchen, Ihnen das Prinzip von Stencil zu erklären.
ShowStencil wird in Verbindung mit dem BBlit-Befehl benutzt, um bei
Stencilobjekten den "Stencileffekt" zu erzeugen. Na,ja. Jetzt sind Sie sicherlich genauso schlau wie zuvor. Das englische
Handbuch gibt hier nicht viel Schützenhilfe.
Ich probiere es mal mit einem Beispiel:
Stellen Sie sich vor, Sie möchten ein Spiel im Weltall programmieren. Hierzu benötigen Sie den Weltraum, also Planeten und
Sterne. Als Grafikvordergrund wählen Sie das Fenster Ihres Raumschiffes mit vielen kleinen Details (z.B.: Radarortung in der
Mitte des Fensters). Um nun einen Stencileffekt zu erzeugen, benötigen wir die komplette (also Vorder- und Hintergrundgrafik (oder
für unser Beispiel Weltall- und Raumschiffenster-Grafik, die wir als Bitmap anzeigen. Weiterhin benötigen wir ein Stencilobjekt,
das nur die Vordergrundgrafik (Fenster mit den Details) enthält und das wir später mit dem Stencil-
oder SBlit-Befehl verwenden.
Nun blitten wir mit dem BBlit-Befehl unsere Shapes auf die Bitmap. Natürlich werden dadurch alle
Grafikteile (Vorder- UND Hintergrund) überschrieben. Aber nachdem Sie alle Shapes geBBlittet haben und nun den
ShowStencil-Befehl ausführen, wird die überschriebene Vordergrundgrafik (Ihr Fenster mit den
Details) wieder hergestellt.
Somit erscheinen Ihre Shapes zwischen der "Hintergrund-" und der "Vordergrundgrafik". 3D läßt
grüßen.
Beachten Sie: Stencilobjekte beinhalten alle wichtigen Grafikdaten, aber keine Farbinformationen.
Beispiel:
Screen 0,3 ;ein Intuition-Bildschirm
ScreensBitMap 0,0 ;seine Bitmap - nun unsere!
Cls ;lösche Bitmap
Boxf 0,0,7,15,1 ;ein Shape malen
Boxf 8,6,15,11,2
GetaShape 0,0,0,16,16 ;und aufnehmen
Cls ;Bitmap wieder löschen
Boxf 80,50,240,150,3 ;irgendetwas malen
Boxf 90,60,230,140,0
Box 85,55,235,145,0
Stencil 0,0 ;aus der Bitmap ein Stencil machen
Cls ;Bitmap löschen
Circlef 160,100,90,4 ;Hintergrundgrafikem malen
Boxf 80,50,240,150,3 ;und (wieder!) Vordergrund
Boxf 90,60,230,140,4
Box 85,55,235,145,4
Buffer 0,16384 ;ein Puffer für BBlit einrichten
BLITZ ;kein Kommentar!
For x=0 To 300 ;Schleifenstart
VWait:UnBuffer 0 ;auf Frameanfang warten und Puffer ersetzen
For y=40 To 140 Step 50 ;Schleifenstart, um 3 Shapes zu zeichnen
BBlit 0,0,x,y ;ein Shape darstellen
Next
ShowStencil 0,0 ;Vordergrund ersetzen
Next
MouseWait
Befehl: Block
Syntax: Block Shapenummer,X,Y
Modus: Amiga/Blitz
Block ist eine extrem schnelle Version des Blit-Kommandos mit einigen
Einschränkungen. Block kann nur mit Shapes der Breite 16,32,48,64... (16er Schritte) Pixel benutzt
werden und diese dürfen nur an den entsprechenden X-Positionen (0,16, 32,48,64...) geblittet
werden. Mit Block können Map-Type-Bildschirme aufgebaut werden. Die Höhe und
Y-Position des Shape ist nicht begrenzt.
|