Sprite "Dissolve"-Effekt mittels Noisemap

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Derren
Beiträge: 557
Registriert: 23.07.2011 02:08

Sprite "Dissolve"-Effekt mittels Noisemap

Beitrag von Derren »

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

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 
Signatur und so
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Sprite "Dissolve"-Effekt mittels Noisemap

Beitrag von Sicro »

Cooler Effekt 8)
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten