
Ich suche eine Möglichkeit, einen Filter (einfach die Farben aufm Bildschirm etwas abdunkeln etwa) auf den Bildschirm anzuwenden, so ähnlich wie bei DisplayRGBFilter().
Allerdings gibt's ne Maske die über den Bildschirm passt, und der Maske entsprechend sollen nur bestimmte Bereiche schattiert werden.
Die Formen auf der Maske sind mehr oder weniger beliebig. Der Hintergrund ist, dass auf einer Tilemap einzelne Felder mit unterschiedlichen kleinen Masken schattiert werden sollen. Bisher hab ich kleine Masken für jedes Tile einzeln angezeigt, das geht aber jetzt aus bestimmten Gründen nichtmehr so.
Hab schon einen Versuch gemacht, bei dem direkt im Videospeicher gearbeitet wird, ist aber leider sau langsam... hm.
Ihr braucht zum Testen ein großes Sprite mit Irgendwas, so groß wie der Bildschrim etwa, und eine Maskensprite, bei dem alles was nicht Schwarz ist schattiert wird.
Mich hätte mal interessiert wie DisplayRGBFilter arbeitet, denn der Befehl ist ja Pfeilschnell und vielleicht könnte man die Arbeitsweise irgendwie kopieren mit Maskenunterstützung.
Habt ihr noch ne andere Idee wie man das so umsetzen könnte, dass es möglichst schnell ist?
Vielen Dank für eure Ideen!!

Code: Alles auswählen
; Maskensprite:
;
; $000000 -> Filter wirkt nicht
; Alles andere -> Filter wirkt
;
BG_Path.s = OpenFileRequester("Background Image", "", "", 0)
M_Path.s = OpenFileRequester("Mask File", "", "", 0)
; ---------------
; > procedure coded by STARGÅTE!
; Korrigiert einen zu kleinen oder zu großen Wert für einen Farbwert
Procedure Real255(Wert)
If Wert < 0
ProcedureReturn 0
ElseIf Wert > 255
ProcedureReturn 255
Else
ProcedureReturn Wert
EndIf
EndProcedure
; > procedure coded by STARGÅTE!
; Gibt die Graufarbe einer Farbe zurück
; Intensity = 0.0 -> Farbig
; Intensity = 1.0 -> Grau
; GrayColor : Graufarbe die erreich werden soll (RGB-Farbe)
Procedure ColorGray(Color, Intensity.f, GrayColor=$FFFFFF)
Protected R, G, B, Gray.f
#GrayColorFactorRed = 0.299
#GrayColorFactorGreen = 0.587
#GrayColorFactorBlue = 0.114
Gray = #GrayColorFactorRed*Red(Color) + #GrayColorFactorGreen*Green(Color) + #GrayColorFactorBlue*Blue(Color)
R = Red(GrayColor) * Gray/255*Intensity + Red(Color) * (1-Intensity)
G = Green(GrayColor) * Gray/255*Intensity + Green(Color) * (1-Intensity)
B = Blue(GrayColor) * Gray/255*Intensity + Blue(Color) * (1-Intensity)
ProcedureReturn RGB(R,G,B)
EndProcedure
; --------------
InitSprite()
InitKeyboard()
UsePNGImageDecoder()
UseJPEG2000ImageDecoder()
UseJPEGImageDecoder()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "")
Global BG_Spr = LoadSprite(#PB_Any, BG_Path)
Global M_Spr = LoadSprite(#PB_Any, M_Path)
Procedure FPS()
Static NextSecond
Static Counter
Static FPS
Protected Now
Now = ElapsedMilliseconds()
If Now >= NextSecond
FPS = Counter
If NextSecond = 0 : NextSecond = Now : EndIf
NextSecond + 1000
Counter = 1
Else
Counter + 1
EndIf
ProcedureReturn FPS
EndProcedure
Procedure DisplayShadedSprite(Sprite, x, y, MaskSprite=-1)
Protected UseMask.b
If IsSprite(MaskSprite)
UseMask = #True
EndIf
DisplayTransparentSprite(Sprite, x, y)
; /// Get Information
StartDrawing(ScreenOutput())
Protected s_mem = DrawingBuffer()
Protected s_pitch = DrawingBufferPitch()
Protected s_format = DrawingBufferPixelFormat()
Protected s_width = OutputWidth()
Protected s_height = OutputHeight()
StopDrawing()
Protected *s_line.long
If UseMask
StartDrawing(SpriteOutput(M_Spr))
Protected m_mem = DrawingBuffer()
Protected m_pitch = DrawingBufferPitch()
Protected m_format = DrawingBufferPixelFormat()
Protected m_width = OutputWidth()
Protected m_height = OutputHeight()
StopDrawing()
Protected *m_line.long
EndIf
; /// Do it
Protected.u x_max, y_max
If UseMask
y_max = m_height-1
x_max = m_width-1
Else
y_max = s_height-1
x_max = s_width-1
EndIf
For y = 0 To y_max
If UseMask
*m_line = m_mem+m_pitch*y
EndIf
*s_line = s_mem+s_pitch*y
For x = 0 To x_max
If UseMask = #False Or *m_line\l > 0
*s_line\l = ColorGray(*s_line\l, 0.5)
EndIf
*s_line + 4
If UseMask
*m_line + 4
EndIf
Next
Next
EndProcedure
Repeat
FlipBuffers()
ClearScreen($000000)
ExamineKeyboard()
DisplayShadedSprite(BG_Spr, 10, 10, M_Spr)
StartDrawing(ScreenOutput())
DrawText(OutputWidth()-100, 10, Str(FPS()))
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape)
End