SelectBGPic(id[, mode, combomode])
id
angegebene Hintergrundbild
als aktuelles Ausgabeziel. Dieser Befehl kann in verschiedenen
Modi verwendet werden. Der übliche Modus ist der Ebenenmodus
(#SELMODE_LAYERS
), der auch der Standardmodus ist. Ebenenmodus
bedeutet, alle Grafikdatenausgaben von Hollywood werden als
Ebenen diesem Hintergrundbild hinzugefügt werden. Daher müssen
Sie Ebenen aktivieren, bevor Sie diesen Befehl im Ebenenmodus
benutzen. Ihr Hintergrundbild wird nie im Ebenenmodus geändert
werden, es erhält nur mehr und mehr Ebenen.
Alternativ können Sie auch die Modi #SELMODE_NORMAL
oder #SELMODE_COMBO
verwenden. Diese Modi werden Ihre Daten des BGPic ändern. Sie
können nur auf BGPics verwendet werden, die derzeit nicht einem
Display zugewiesen sind. #SELMODE_NORMAL
bedeutet, dass
nur die Farbkanäle des BGPic geändert werden, wenn Sie reinzeichnen.
Der Transparenzkanal des BGPic (kann entweder eine Maske oder
ein Alpha-Kanal sein) wird nie verändert werden. Sie können
dies ändern, indem Sie #SELMODE_COMBO
im optionalen Argument
mode
angeben. Wenn Sie diesen Modus verwenden, werden alle
Befehle für Hollywoodgrafiken, die nach SelectBGPic()
aufgerufen
werden. die Farbe und den Transparenzkanal des BGPic ändern.
Wenn das BGPic keinen Transparenzkanal hat, verhält sich #SELMODE_COMBO
gleich wie #SELMODE_NORMAL
.
Ab Hollywood 5.0 können Sie das optionale Argument combomode
verwenden, um festzulegen, wie sich #SELMODE_COMBO
verhalten
soll. Ist combomode
auf 0 gesetzt, werden die Farb- und
Transparenzinformation aller Pixel in dem Quellenbild in jedem
Fall zu dem Zielbild kopiert, selbst wenn die Pixel unsichtbar
sind. Dies ist das Standardverhalten. Wenn combomode
auf 1
gesetzt ist, werden nur die sichtbaren Pixel in das Zielbild
kopiert. Dies bedeutet, wenn der Alphawert eines Pixels in
dem Quellenbild 0 ist (unsichtbar), wird es nicht in das Zielbild
kopiert werden.
Hollywood 6.0 stellt den neuen combomode
2 zur Verfügung.
In diesem Fall wird Hollywood die Farbkanäle und den Alpha-Kanal
des Quellbildes in die Farbe und Alpha der Zielbildkanäle mischen.
Wenn Sie später das Zielbild zeichnen, wird es so aussehen,
als ob die beiden Bilder hintereinander auf jeweils des anderen
gezeichnet wurde. Bitte beachten Sie, dass das Argument combomode
nur zusammen mit #SELMODE_COMBO
unterstützt wird. Es hat keine
Wirkung, wenn sie es mit den anderen Modi verwenden.
Beachten Sie, dass wenn Sie #SELMODE_NORMAL
oder #SELMODE_COMBO
verwenden, werden die ursprünglichen Grafiken des BGPic modifiziert.
Sie werden immer auf die Originalgrafiken des BGPic zeichnen.
Stellen Sie sich vor, Sie haben 640x480 BGPic, welches Sie derzeit
mit dem Befehl ChangeDisplaySize() auf 800x600 skaliert haben.
Wenn Sie jetzt SelectBGPic()
mit #SELMODE_NORMAL
oder #SELMODE_COMBO
auf dieses BGPic anwenden, werden Sie tatsächlich in das 640x480
Bild zeichnen. Das 800x600 Bild wird aktualisiert, wenn EndSelect()
aufgerufen wird. Hollywood wird dann die Original-Grafik auf
die aktuellen Ausgabegröße des BGPic skalieren, aber Ihre Zeichnungsbefehle
werden immer auf dem originalen BGPic ausgeführt.
Ein alternativer Weg, um in die Transparenzkanäle eines BGPic
zu zeichnen, ist, die Befehle SelectMask() oder SelectAlphaChannel()
zu verwenden. Diese beiden Befehle werden jedoch die Schreibdaten
nur auf den Transparenzkanal beschränken. Sie werden nicht den
Farbkanal beeinflussen. Wenn Sie beide Kanäle (Farbe und Transparenz)
ändern wollen, müssen Sie das Argument mode
beim Befehl SelectBGPic()
auf #SELMODE_COMBO
setzen.
Wenn Sie mit dem Zeichnen in Ihr BGPic fertig sind und möchten, dass Ihr Display wieder das Ausgabeziel wird, rufen Sie einfach den Befehl EndSelect() auf.
Nur Befehle mit direkter Grafikausgabe können mit SelectBGPic()
verwendet werden. Sie können nicht animierte Befehle wie MoveBrush()
oder DisplayBrushFX() aufrufen, während SelectBGPic()
aktiv ist.
Wenn mode
auf #SELMODE_LAYERS
gesetzt ist, kann SelectBGPic()
auch nützlich sein. So können Sie mehrere Änderungen an den
Ebenen des aktuellen BGPic erledigen, ohne dass nach jeder
Änderung das BGPic aktualisiert wird. Zum Beispiel können Sie
auf einmal 100 neue Ebenen einfügen. Das wäre ziemlich langsam,
wenn man es in der herkömmlichen Art und Weise tun würde, weil
Hollywood das Display hundertmal aktualisiert. Um dies zu vermeiden,
können Sie einfach SelectBGPic()
aufrufen, die 100 Ebenen einfügen
und Hollywood wird das Display nicht aktualisieren, bevor Sie
EndSelect() aufgerufen haben. Innerhalb eines SelectBGPic()
-EndSelect()
Block können Sie so viele Änderungen vornehmen, wie Sie möchten.
Sie werden nicht vor dem Befehl EndSelect() gezeichnet werden.
Siehe unten für ein Beispiel.
Siehe auch EndSelect(), SelectAlphaChannel(), SelectBrush(), SelectMask(), SelectLayer() und SelectAnim().
#SELMODE_LAYERS
, #SELMODE_NORMAL
oder #SELMODE_COMBO
als Parameter (siehe oben); Voreingestellt
ist #SELMODE_LAYERS
(V4.5)#SELMODE_COMBO
aktiv ist (siehe oben);
voreingestellt ist 0 (V5.0)EnableLayers() SelectBGPic(2) TextOut(#CENTER, #CENTER, "Hello World") Box(0, 0, 100, 100, #RED) Box(#RIGHT, #BOTTOM, 100, 100, #BLUE) EndSelect() DisplayBGPic(2)Der obige Code wählt das Hintergrundbild 2 als aktuelles Ziel und fügt drei Ebenen (eine Text und zwei Rechteck) ein. Danach wird das Display als Ausgabeziel ausgewählt und Hintergrundbild 2 mit drei Ebenen dargestellt.
SetFillStyle(#FILLCOLOR) EnableLayers SelectBGPic(1) ; wir gehen davon aus, 1 ist unser aktuelles BGPic ; erstellt 100 Ebenen For Local k = 1 To 100 Box(Rnd(540), Rnd(380), 100, 100, RGB(Rnd(255), Rnd(255), Rnd(255))) Next EndSelect ; nun werden die 100 Ebenen aufs Mal dargestellt!Dieser Code stellt den oben diskutierten Fall dar. Sie müssen viele Änderungen vornehmen und Sie möchten aus Performancegründen das Zeichnen auf später verschieben. In unserem Fall wollen wir 100 Ebenen dem aktuellen BGPic hinzuzufügen. So kapseln wir diesen Code durch einen
SelectBGPic()
-EndSelect Block.
Hollywood wird die 100 Ebenen hinzufügen und wird sie in einem
Rutsch zeichnen, wenn EndSelect() aufgerufen wird. Das ist
viel schneller, als ohne SelectBGPic()
, weil in diesem Fall
jeder Aufruf von Box() eine Aktualisierung verursachen würde.