Startseite
Amiforce 2.1     Amiforce-News Amiforce-News Amiforce-Forum Amiforce-Forum Amiforce-Chat/IRC-Chat Amiforce-Chat/IRC-Chat Gästebuch Gästebuch Kontakt mit dem Webmaster aufnehmen Kontakt mit dem Webmaster aufnehmen

Amiblitz3
Amiblitz2(alt)
Storm Wizard
Abakus-Design
Helpguide
Toolsguide
Tipps&Tricks
Gamesfun
Links
Download
Musik

Bugfixes am Forum
Subdomains aktiviert
Counterscript entfernt
  Navigation:   Index /  Amiblitz /  Amiblitz Lesematerial /  Blitz2 Benutzerhandbuch (Index) /  Blitz2 Benutzerhandbuch (Kapitel 9) / 

Benutzerhandbuch


Kapitel 9




Beispiele für den Blitzmodus

·Das Blitten von Teilfiguren
·Dual-Playfield Slice
·Doppelte Pufferung
·Weiches Scrollen




Index 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 



Index 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 



Index 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 



Index 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 





Index



Impressum
Copyright © 2001-2007 by Cj-Stroker. Alle Rechte vorbehalten (Legal Info)
AMIGA und zugehörige Logos sind eingetragene Warenzeichen von Amiga, Inc.