Sprite "Dissolve"-Effekt mittels Noisemap
Verfasst: 23.02.2020 22:16
Hallo zusammen,
ich habe vor kurzem folgendes Video gesehen und in PB versucht nachzubauen: https://youtu.be/5dzGj9k8Qy8?t=622
Beim Timestamp, wird der Effekt demonstriert, den dieser Code nachahmt. Im Video geht er noch weiter, das ist aber im Code noch nicht umgesetzt.
Der Code is schlampig, also am besten erstmal einfach nur ausführen und anschauen. Ich versuch das in den nächsten Tagen etwas sauberer zu gestalten.
Die beiden Grafiken:
char.png https://abload.de/image.php?img=char09j2k.png
noise.png https://abload.de/image.php?img=noise4jkpf.png
ich habe vor kurzem folgendes Video gesehen und in PB versucht nachzubauen: https://youtu.be/5dzGj9k8Qy8?t=622
Beim Timestamp, wird der Effekt demonstriert, den dieser Code nachahmt. Im Video geht er noch weiter, das ist aber im Code noch nicht umgesetzt.
Der Code is schlampig, also am besten erstmal einfach nur ausführen und anschauen. Ich versuch das in den nächsten Tagen etwas sauberer zu gestalten.
Die beiden Grafiken:
char.png https://abload.de/image.php?img=char09j2k.png
noise.png https://abload.de/image.php?img=noise4jkpf.png
Code: Alles auswählen
UsePNGImageDecoder()
UsePNGImageEncoder()
EnableExplicit
Define char_sprite = LoadImage(#PB_Any, "char.png")
Define noise_image = LoadImage(#PB_Any, "noise.png")
Define noise_width = ImageWidth(noise_image)
Define noise_height = ImageHeight(noise_image)
Dim noise_array(noise_width, noise_height)
Dim noise_array_bin(noise_width, noise_height)
Dim char_array(noise_width, noise_height)
Define x,y
StartDrawing(ImageOutput(noise_image))
For y=0 To noise_height-1
For x=0 To noise_width-1
noise_array(x,y) = Red(Point(x,y))
Next
Next
StopDrawing()
StartDrawing(ImageOutput(char_sprite))
DrawingMode(#PB_2DDrawing_AllChannels )
For y=0 To noise_height-1
For x=0 To noise_width-1
char_array(x,y) = Point(x,y)
Next
Next
StopDrawing()
Procedure Binary(Array noise(2), Array noise_bin(2), threshold.i)
Protected x,y
Shared noise_height, noise_width, noise_array()
For y=0 To noise_height-1
For x=0 To noise_width-1
If noise_array(x,y) >= threshold
noise_bin(x,y) = 1
Else
noise_bin(x,y) = 0
EndIf
Next
Next
EndProcedure
Procedure noise2sprite(Array imgarray(2), new_image)
Shared noise_height, noise_width, noise_array_bin()
Protected x,y
StartDrawing(ImageOutput(new_image))
DrawingMode(#PB_2DDrawing_AlphaChannel )
Box(0, 0, noise_width, noise_height, RGBA(0,0,0,0))
DrawingMode(#PB_2DDrawing_AlphaBlend )
Protected c
Protected noiselevel
Protected alpha
For y=0 To noise_height-1
For x=0 To noise_width-1
c = imgarray(x,y)
;Debug Hex(Red(c)) + Hex(Green(c)) + Hex(Blue(c)) +"/"+ Hex(Alpha(c))
noiselevel = noise_array_bin(x,y)
Plot(x,y, RGBA(Red(c), Green(c), Blue(c),Alpha(c) * noiselevel))
;Plot(x,y, c)
Next
Next
StopDrawing()
EndProcedure
Define new_image = CreateImage(#PB_Any, noise_width, noise_height, 32, #PB_Image_Transparent )
Binary(noise_array(), noise_array_bin(), 0)
noise2sprite(char_array(), new_image)
Binary(noise_array(), noise_array_bin(), 100)
noise2sprite(char_array(), new_image)
OpenWindow(0, 0, 0, 164, 164, "Sprite Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CanvasGadget(0, 0, 0,164, 164)
AddWindowTimer(0, 0, 20)
Define n=0
Define e
Define dir =1
Define speed = 4
Repeat
e=WaitWindowEvent()
If e=#PB_Event_Timer
If EventTimer()=0
n + (speed * dir)
If n>255
dir=-1
EndIf
If n<0
dir=1
EndIf
Binary(noise_array(), noise_array_bin(), n)
noise2sprite(char_array(), new_image)
StartDrawing(CanvasOutput(0))
DrawingMode(#PB_2DDrawing_Default )
Box(0, 0, 164, 164, RGB(0,120,80))
DrawingMode(#PB_2DDrawing_AlphaBlend )
DrawImage(ImageID(new_image), 0, 0)
StopDrawing()
EndIf
EndIf
Until e=#PB_Event_CloseWindow
End