|
Benutzerhandbuch |
|
|
Kapitel 9
Beispiele für den Blitzmodus
·Das Blitten von Teilfiguren
·Dual-Playfield Slice
·Doppelte Pufferung
·Weiches Scrollen
Das Blitten von Teilfiguren
Soll eine Shape auf eine Bitmap mit einem Blit-Befehl abgebildet werden, so muß die Shape vollständig auf die Bitmap passen. Ist dies nicht der Fall, tritt ein Fehler auf. Um eine Shape halb innerhalb und halb außerhalb einer Bitmap erschienen zu lassen, muß eine größere Bitmap verwendet und die Anzeige innerhalb der Bitmap positioniert werden. Die Größe des äußeren Rahmens hängt von der Größe der Shapes ab, die dargestellt werden sollen.
Im folgenden Beispiel wird eine Shape mit 32x32 Pixeln verwendet und infolgedessen werden weitere 32 Pixel um die Bitmap herum benötigt. Mit dem befehl Show 0,32,32 wird das Bild in der vergrößerten Bitmap zentriert.
Außerdem wird die erweiterte Form des Slice Befehls verwendet, da eine Bitmap dargestellt wird, die größer als die Anzeige ist.
Die Funktion RectsHit(x,y,1,1,0,0,320+32,256+32) liefert den Wert "wahr" zurück, wenn sich die Shape innerhalb der vergrößerten Bitmap befindet und ge-blittet werden kann. Für eine größere Shape oder eine Shape mit zentrierter 'Handle', müssen die Parameter entsprechend verändert werden.
Die Routine .makeshape erzeugt eine temporäre Bitmap, die dazu benutzt wird, ein Muster zu generieren, das dann mit GetaShape in ein Shape-Objekt gewandelt wird.
BLITZ
Gosub makeshape
BitMap 0,320+64,256+64,3
Slice 0,44,320,256,$fff8,3,8,8,320+64,320+64
Show 0,32,32
While Joyb(0)=0
x.w=Rnd(1024)-512
y.w=Rnd(1024)-512
If RectsHit(x,y,1,1,0,0,320+32,256+32)
Blit 0,x,y
EndIf
Wend
.makeshape:
BitMap 1,32,32,3
For i=1 To 15:Circle 16,16,i,i:Next
GetaShape 0,0,0,32,32
Free BitMap 1
Return
Dual-Playfield Slice
Das folgende Programm demonstriert die Verwendung von Dual-Playfield Displays. Wie zuvor beschrieben wurde, dienen Dual-Playfields dazu, zwei Bitmaps gleichzeitig darzustellen. Hierzu dienen die beiden Befehle ShowF und ShowB.
Das Makro rndpt fügt einfach nur den Code Rnd(640),Rnd(512) in den Quellcode ein. So wird z.B. das Kommando Line!rndpt,!rndpt,Rnd(7) vom Compiler zu folgender Zeile erweitert:
Line Rnd(640),Rnd(512),Rnd(640),Rnd(512),Rnd(7)
Wiederum muß die erweiterte Form des Slice Befehls verwendet werden und die Flags auf $fffa gesetzt werden, um eine niedrigauflösende (lores), scrollbare Dual-Playfield Anzeige zu erhalten.
Man kann sich das Dual-Playfield als zwei getrennte Displays vorstellen: mit dem ShowF-Befehl wird der Vordergrund in Bitmap 1 positioniert, mit ShowB wird der Hintergrund in Bitmap 0 positioniert. Dabei muß die x-Position des jeweils anderen Displays an die Befehle ShowF und ShowB übergeben werden, sodaß Blitz2 intern die Positionen korrekt berechnen kann.
BLITZ
Macro rndpt Rnd(640),Rnd(512):End Macro
BitMap 0,640,512,3
For i=0 To 255
Line !rndpt,!rndpt,Rnd(7)
Next
BitMap 1,640,512,3
For i=0 To 255
Circlef !rndpt,Rnd(15),Rnd(7)
Next
Slice 0,44,320,256,$fffa,6,8,16,640,640
While Joyb(0)=0
VWait
x1=160+Sin(r)*160
y1=128+Cos(r)*128
x2=160-Sin(r)*160
y2=128-Cos(r)*128
ShowF 1,x1,y1,x2
ShowB 0,x2,y2,x1
r+.05
Wend
Doppelte Pufferung
Im folgenden Beispiel wird erläutert, wie ein doppelt gepuffertes Display verwendet wird, mit dem Graphiken flimmerfrei bewegt werden können. Der Trick besteht darin, die eine Bitmap zu bearbeiten, während die andere Bitmap dargestellt wird, sodaß keine Störungen zu sehen sind.
Mit dem VWait-Befehl wird der Zeitpunkt abgepasst, an dem der vertikale Strahl oben am Bildschirm ist. Das ist der Moment, an dem die Bitmaps ausgetauscht werden müssen, ohne daß Störungen auftreten.
Mit der Anweisung db=1-db wird der Wert von db mit jeder Bildschirmfüllung zwischen 0 und 1 gewechselt. Die Bitmap db wird angezeigt mit Show db, db wird gewechselt (db=1-db) und anschließend wird mit UseBitmap db diese zur aktuellen Bitmap gemacht. Darin besteht die Methode der doppelten Pufferung, die eine Bitmap anzeigt, während die andere bearbeitet wird.
Da zwei Bitmaps verwendet werden, werden auch zwei Queues (Warteschlangen) benötigt, um QBlit verwenden zu können. Der Befehl QBlit führt ein normales Blit durch und speichert die Position des Objekts in einer Queue. Bei einem erneuten Aufruf von QBlit wird dann zunächst das Objekt von der vorherigen Position (die in der Queue gespeichert wurde) gelöscht und dann an der neuen Position dargestellt. Mit dem Befehl UnQueue können alle in der Queue gespeicherten Teile einer Screen gelöscht werden. So können in unserem Beispiel die Bälle in der neuen Position gezeichnet werden, ohne daß sie Schlieren von ihrer alten Position hinterlassen.
Mit der Anweisung move#1,$dff180 wird die Hintergrundfarbe auf weiß gesetzt, sodaß deutlich wird, wieviel des Frames (Bildschirmfüllung) seit dem letzten VWait verstrichen ist, bedingt durch die Ausführung des Codes. Wenn die Anzahl der Bälle erhöht wird, so verlangsamt sich die Ausführung der Schleife (in der gezeichnet und positioniert wird) soweit, daß sie länger als ein Frame (1/50 Sekunde) dauert, und der Bildschirm beginnt zu blinken. In Kapitel 10 wird die Thematik der Frame-Raten noch näher erläutert.
Was noch zu erwähnen wäre, ist das Abprallen der Bälle, wenn sie an den Rand der Bitmap kommen. Die Richtung wird umgekehrt und zusätzlich wird die Richtung auch noch zu der Position der Bälle addiert, sodaß es nie dazu kommt, daß außerhalb der Bitmap ge-blittet wird.
BLITZ
n=25
NEWTYPE .ball
x.w:y:xa:ya
End NEWTYPE
Dim List b.ball(n-1)
While AddItem(b())
b()\x=Rnd(320-32),Rnd(256-32),Rnd(4)-2,Rnd(4)-2
Wend
Gosub getshape
BitMap 0,320,256,3
BitMap 1,320,256,3
Queue 0,n
Queue 1,n
Slice 0,44,3
While Joyb(0)=0
VWait
Show db
db=1-db
Use BitMap db
UnQueue db
ResetList b()
USEPATH b()
While NextItem(b())
\x+\xa:\y+\ya
If NOT RectsHit(\x,\y,1,1,0,0,320-32,256-32)
\xa=-\xa:\ya=-\ya
\x+\xa:\y+\ya
EndIf
QBlit db,0,\x,\y
Wend
MOVE #-1,$dff180
Wend
End
.getshape:
BitMap 1,32,32,3
For i=1 To 15:Circle 16,16,i,i:Next
GetaShape 0,0,0,32,32
Free BitMap 1
Return
Weiches Scrollen
In diesem letzten Beispiel wird das weiches Scrollen erläutert, wie es im letzten Kapitel beschrieben wurde.
Mit dem Befehl Scroll wird die linke Seite der Bitmap nach rechts und die obere Hälfte nach unten kopiert. Dadurch wird die Bitmap vierfach so groß und enthält das selbe Bild in jedem Quadranten.
Dies ermöglicht es, die Bitmap durch den Bildschirm scrollen zu lassen und wenn der rechte Rand erreicht ist, wieder zum linken Rand zurück zu springen, ohne daß ein Bruch sichtbar wird, da das Bild links und rechts gleich ist. Das gleiche gilt für das auf- und abscrollen.
Um die Maus-Bewegungen des Benutzers zu ermitteln, muß zunächst der Befehl Mouse On abgesetzt werden. Anschließend wird ermittelt, um welchen Betrag sich die Maus bewegt hat, und dieser Wert wird zu der Geschwindigkeit hinzuaddiert, mit der das Display verschoben wird.
Mit dem Befehl QLimit(xa+MouseXSpeed,-20,20) wird sichergestellt, daß die Variable xa (x_add) immer im gültigen Bereich von -20 bis 20 bleibt.
Der Übergang von einem zum anderen Rand wird durch die Anweisung x=QWrap(xa+MouseSpeed,-20,20) erreicht.
BLITZ
Mouse On
n=25
BitMap 0,640,512,3
For i=0 To 150
Circlef Rnd(320-32)+16,Rnd(256-32)+16,Rnd(16),Rnd(8)
Next
Scroll 0,0,320,256,320,0
Scroll 0,0,640,256,0,256
Slice 0,44,320,256,$fff8,3,8,8,640,640
While Joyb(0)=0
VWait
Show db,x,y
xa=QLimit(xa+MouseXSpeed,-20,20)
ya=QLimit(ya+MouseYSpeed,-20,20)
x=QWrap(x+xa,0,320)
y=QWrap(y+ya,0,256)
Wend
|
|
|
|
|