Seite 1 von 1

Kompletten Screen mit DisplayTranslucideSprite ausblenden

Verfasst: 24.09.2005 21:25
von Delle
Der nachfolgende Code soll einen Screen komplett ausblenden.

Die Idee ist, einfach nach dem Screenaufbau ein schwarzes
Sprite drüberzulegen und mittels DisplayTranslucideSprite() auszublenden.

Funzt aber nicht. Denkfehler drin?
InitSprite()

UseJPEGImageDecoder()

OpenScreen(800,600,32,"")

LoadSprite(0,"beispielscreen.jpg")
CreateSprite(1,799,599)

StartDrawing(SpriteOutput(1))
Box(0,0,799,599,RGB(0,0,0))
StopDrawing()


For i = 0 To 255

ClearScreen(0,0,0)

DisplaySprite(0,0,0) ; Screen

; irgendwelche Sprite-Objekte etc.

DisplayTranslucideSprite(1,0,0,i) ; schwarzes Sprite

FlipBuffers()

Delay(5)

Next

End

Verfasst: 24.09.2005 21:41
von Epyx
Box(0,0,799,599,RGB(0,0,0))

Dazu aus der Hilfe....
Die Farbe 0 wird als transparente Farbe angesehen (diese Farbe wird nicht dargestellt).
Zudem sind diese Special FX befehle nur sehr langsam, sie lassen sich aber beschleunigen mit StartSpecialFX() und StopSpecialFX() was aber auch nur sehr gering zu sein scheint.

das folgende Beispiel funzt bei mir, bzw. blendet da irgendwas ein...

Code: Alles auswählen

InitSprite()

UseJPEGImageDecoder()

OpenScreen(800,600,16,"")

;LoadSprite(0,"beispielscreen.jpg")
CreateSprite(1,799,599)

StartDrawing(SpriteOutput(1))
Box(0,0,799,599,RGB(10,10,100))
StopDrawing()


For i = 0 To 255

ClearScreen(255,0,0)
StartSpecialFX()
;DisplaySprite(0,0,0) ; Screen
DisplayTranslucideSprite(1,0,0,i) ; schwarzes Sprite
StopSpecialFX()
FlipBuffers()

Delay(5)

Next

End

Verfasst: 24.09.2005 23:58
von SoS
@Epyx der Code läuft bei mir nicht,ich würde es aber mit Sprite3D machen

Code: Alles auswählen

InitSprite() 
InitSprite3D()
OpenScreen(800,600,32,"") 
CreateSprite(1,64,64,#PB_Sprite_Texture) 
StartDrawing(SpriteOutput(1)) 
Box(0,0,64,64,RGB(1,1,1)) 
StopDrawing() 
CreateSprite3D(1,1)

For i = 0 To 255  
  ClearScreen(255,0,0) 
  Start3D() 
  ZoomSprite3D(1,800,600) 
  DisplaySprite3D(1,0,0,i) ;  fast schwarzes Sprite ;)
  Stop3D() 
  FlipBuffers()  
  Delay(10)  
Next 
/edit
fehler im Code beseitig,sollte nun gehen mit 800x600 bei zoom

Verfasst: 25.09.2005 00:05
von Kaeru Gaman
meine empfehlung:

den aktuellen screen per GrabSprite zu einem einzelnen Sprite machen,
und dieses ausfaden.

Vorteil:
Du mußt nicht erst den gesamten Screen aufbauen, nur um ihn zu überpinseln.
(müsstest du ja in jedem Frame das Fadings tun, was bei 5 sec. fading und 60FpS immerhin 300mal wäre)
Außerdem kannst du eine einfache Proc dafür schreiben, mit der du jeden beliebigen Screen ausfaden kannst.

Einfaden ginge ähnlich:
Screen einmal zeichnen, grabben, löschen (ohne FlipBuffers zwischendurch),
den einfadevorgang mittels des gegrabten sprites durchführen,
erst danach ist wieder ein bildaufbau nötig.

Verfasst: 25.09.2005 00:36
von Epyx
SoS hat geschrieben:@Epyx der Code läuft bei mir nicht,ich würde es aber mit Sprite3D machen
Mit 3D Sprites hat er ja Probleme, glaube ich. Die liefen nicht korrekt bei ihm, ich würds auch so machen aber deshalb wollte er es wohl mit den FX Befehlen versuchen.

@Kaeru Gaman
Deine Methode wäre nur von Vorteil wenn.

1. 3D Sprites ordentlich arbeiten (bei ihm wohl nicht korrekt)

2. Bei Stilleben also ohne Bewegung wo man ansonsten ständig grabben müsste (Langsam!!)

3. Man auf die Spritemaß vorgaben scheißt (64*64 / 128*128 usw..)

Verfasst: 25.09.2005 00:53
von Kaeru Gaman
hast recht....

1. an das S3D-problem hab ich nicht gedacht
2. die standartmaße sind mir absolut uneingängig, weil bei mir keine einschränkung...
ich vergeß das immer... :oops:


hm... also als normaler sprite...

wie wärs mit ner procedure, die ein gamma-ähnliches fading über die sprite-mem rechnet? (ASM)

Verfasst: 25.09.2005 01:32
von Delle
Bei Escape in einem Spiel sollen die Objekte trotzdem noch weiter fliegen und der Screen langsam ausgeblendet werden. Deswegen nicht der komplette Screen als ein Sprite.

PS: Ja 3D und die Lib funzt bei mir nicht richtig, denk mal bei anderen Usern mit älteren Systemen kann dies auch der Fall sein. Möchte halt gerne, dass JEDER mein Spiel sehen kann und nicht nur die Leute mit der neuesten Hardware.

Verfasst: 25.09.2005 02:52
von Kaeru Gaman
hm... jeden frame erst zeichnen und dann grabben und nochmal darstellen wär ziemlich langsam...


du könntest ne ASM-routine brauchen, die auf den screen direkt geht und einen gamma-wert runterschraubt...

also darstellen, dim-procedure, flippen...

...solche Procs kann StefanM recht gut (glaube so hiess der kollege)

Verfasst: 25.09.2005 15:16
von PMV
appropo Gammerwert ...
Syntax

ChangeGamma(R, G, B, Flags)
Beschreibung

Ändert den Gamma-Wert für den aktuellen Bildschirm. Die Funktion arbeitet nur im 'FullScreen' Modus (nicht im Fenster-Modus). Die Rot, Grün und Blau-Kanäle können individuell geändert werden. Dieser Befehl kann zum Fading/Fadeout, Color-Splashing etc... des gesamten Bildschirms ('FullScreen') genutzt werden. Wenn dieser Befehl nichts tut, dann unterstützt die Hardware diese Funktion nicht (es wird keine Emulation angeboten, wegen der erforderlichen Tonnen von Operationen).

Der 'Flags' Parameter kann folgende Werte annehmen:
0 : Berechnet einfach den neuen Gamma-Wert, basierend auf dem Referenz-Wert.
1 : Setzt den aktuellen Gamma-Wert als Referenz. Muss mindestens einmal vor dem Aufruf
mit dem Flag = 0 aufgerufen werden. Die RGB-Parameter werden ignoriert.

Die ChangeGamma() Funktion wird normalerweise wie folgt angewendet:
ChangeGamma(0,0,0,1) ; wird zumindest einmal zu Beginn (z.B. nach dem Laden eines Sprites) aufgerufen
ChangeGamma(Rot,Gruen,Blau,0) ; ändert den aktuellen Gamma-Wert
Für den ganzen Screen wäre das doch die einfachste möglichkeit, oder nicht?

MFG PMV