Kompletten Screen mit DisplayTranslucideSprite ausblenden

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Delle
Beiträge: 1132
Registriert: 10.05.2005 22:48

Kompletten Screen mit DisplayTranslucideSprite ausblenden

Beitrag 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
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Beitrag 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
If you can't make it good, at least make it look good.
Bill Gates
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag 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
Zuletzt geändert von SoS am 25.09.2005 00:52, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Epyx
Beiträge: 247
Registriert: 29.08.2004 01:40
Computerausstattung: AMD64 X2 DualCore 6000+ , 3GB Ram , WinXP sp3
2x Ati Radeon HD4800 ~ CrossFireX
Kontaktdaten:

Beitrag 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..)
If you can't make it good, at least make it look good.
Bill Gates
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Delle
Beiträge: 1132
Registriert: 10.05.2005 22:48

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten