mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-10-31 03:24:04 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			259 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /****************************************************************
 | |
| **                                                             **
 | |
| ** Name:        AsyncFX                                        **
 | |
| ** Author:      Andreas Falkenhahn                             **
 | |
| ** Version:     1.2                                            **
 | |
| ** Date:        17.01.19                                       **
 | |
| ** Interpreter: Hollywood 8.0                                  **
 | |
| ** Licence:     Sample program for Hollywood                   **
 | |
| ** Function:    Demonstrates asynchronous transition effects   **
 | |
| **                                                             **
 | |
| ** History:                                                    **
 | |
| **                                                             **
 | |
| ** 1.2: (07.01.19)                                             **
 | |
| **                                                             **
 | |
| ** - uses the new @DIRECTORY preprocessor command now which    **
 | |
| **   will automatically link all pics when compiling           **
 | |
| **                                                             **
 | |
| ** 1.1: (29.03.13)                                             **
 | |
| **                                                             **
 | |
| ** - added BeginRefresh()/EndRefresh() section for optimized   **
 | |
| **   drawing on supported systems                              **
 | |
| **                                                             **
 | |
| ** 1.0: (17.09.08)                                             **
 | |
| **                                                             **
 | |
| ** - initial release                                           **
 | |
| **                                                             **
 | |
| ****************************************************************/
 | |
| 
 | |
| /*
 | |
| ** Important! Check if the used Hollywood version is at least
 | |
| ** version 8.0!
 | |
| */
 | |
| @VERSION 8,0
 | |
| 
 | |
| @DIRECTORY 1, "pics"
 | |
| 
 | |
| @SPRITE 1, "buttons.png", {Frames = 2, Width = 137, Height = 24, Transparency = $ff0000}
 | |
| 
 | |
| /*
 | |
| ** Initial display dimensions
 | |
| */
 | |
| @DISPLAY {Width = 800, Height = 600}
 | |
| 
 | |
| /* check if a picture is already on screen */
 | |
| Function p_CheckPic(x)
 | |
| 
 | |
| 	For Local k = 0 To 15
 | |
| 		If p[k].brush = x Then Return(True)
 | |
| 	Next
 | |
| 	
 | |
| 	Return(False)	
 | |
| 
 | |
| EndFunction
 | |
| 
 | |
| /* select a random effect */
 | |
| Function p_ChooseFX(use_globfx)
 | |
| 
 | |
| 	Local found = False
 | |
| 	Local type
 | |
| 	
 | |
| 	; do we want a global effect or a new effect for every object?
 | |
| 	If (use_globfx = True) And (bstate = 2) Then Return(globfx)
 | |
| 	 
 | |
| 	While found = False
 | |
| 	
 | |
| 		type = GetRandomFX(True)
 | |
| 		
 | |
| 		; no #SCROLL effects please! They'd corrupt the display because we aren't using layers!
 | |
| 		Switch type
 | |
| 		Case #SCROLLWEST
 | |
| 		Case #SCROLLEAST
 | |
| 		Case #SCROLLNORTH
 | |
| 		Case #SCROLLSOUTH
 | |
| 		Case #SCROLLNORTHEAST
 | |
| 		Case #SCROLLSOUTHEAST
 | |
| 		Case #SCROLLSOUTHWEST
 | |
| 		Case #SCROLLNORTHWEST
 | |
| 		Default
 | |
| 			found = True
 | |
| 		EndSwitch
 | |
| 			
 | |
| 	Wend
 | |
| 
 | |
| 	Return(type)
 | |
| 						
 | |
| EndFunction
 | |
| 
 | |
| /* start new transition effect */
 | |
| Function p_TOFunc(msg)
 | |
| 
 | |
| 	Local t
 | |
| 	Local k = msg.userdata	
 | |
| 	
 | |
| 	; choose a new global effect if we're in static mode!
 | |
| 	If (k = 0) And (bstate = 2) Then globfx = p_ChooseFX(False)
 | |
| 
 | |
| 	; randomly choose a new picture but it must not be on screen!							
 | |
| 	Repeat
 | |
| 		t = Rnd(num)
 | |
| 	Until p_CheckPic(t) = False
 | |
| 	
 | |
| 	; remember picture		
 | |
| 	p[k].brush = t
 | |
| 	
 | |
| 	; go!	
 | |
| 	p[k].drawfunc = DisplayBrushFX(p[k].brush + 1, p[k].x * 200, p[k].y * 150, {Async = True, Type = p_ChooseFX(True), Parameter = #WHITE})
 | |
| 	p[k].active = True
 | |
| 	
 | |
| EndFunction
 | |
| 
 | |
| Function p_SyncedRestart()
 | |
| 
 | |
| 	For Local k = 0 To 15 Do p_TOFunc({userdata = k})
 | |
| 
 | |
| EndFunction
 | |
| 
 | |
| /* our main loop */
 | |
| Function p_MainLoop()
 | |
| 
 | |
| 	BeginRefresh
 | |
| 	
 | |
| 	For Local k = 0 To 15
 | |
| 	
 | |
| 		If p[k].active = True
 | |
| 		
 | |
| 			If AsyncDrawFrame(p[k].drawfunc) = True
 | |
| 
 | |
| 				p[k].active = False
 | |
| 			
 | |
|                                 If bstate = 2
 | |
| 
 | |
|                                 	; We're in static mode --> make sure our FX are absolutely sync'ed
 | |
| 
 | |
|                                         If k = 15 Then SetTimeout(Nil, p_SyncedRestart, 1000)
 | |
| 
 | |
|                                         p[k].cleartimeout = False
 | |
| 
 | |
|                                 Else
 | |
| 
 | |
| 					; FX has finished!
 | |
| 					; --> wait 1 second and then display next pic
 | |
| 					; note that we have to use SetTimeout() because we are in a callback and must
 | |
| 					; not call functions that block the system (e.g. do not use Wait() in a callback!)
 | |
| 
 | |
| 					p[k].timeout = SetTimeout(Nil, p_TOFunc, 1000, k)
 | |
|                                         p[k].cleartimeout = True
 | |
| 				EndIf
 | |
| 			EndIf
 | |
| 		EndIf	
 | |
| 	Next
 | |
| 	
 | |
| 	EndRefresh
 | |
| 		
 | |
| EndFunction
 | |
| 
 | |
| /* start all effects */
 | |
| Function p_Start16FX()
 | |
| 
 | |
| 	; start from new!
 | |
| 	For Local k = 0 To 15
 | |
| 		p[k].drawfunc = DisplayBrushFX(p[k].brush + 1, p[k].x * 200, p[k].y * 150, {Async = True, Type = p_ChooseFX(True), Parameter = #WHITE})
 | |
| 		p[k].active = True
 | |
| 	Next
 | |
| 
 | |
| EndFunction
 | |
| 
 | |
| /* scan files and start the transition effects */
 | |
| Function p_Init()
 | |
| 
 | |
| 	Local t
 | |
| 
 | |
| 	; count files
 | |
| 	num = CountDirectoryEntries(1)
 | |
| 
 | |
| 	; load brushes
 | |
| 	For Local k = 1 to num Do LoadBrush(k, GetDirectoryEntry(1, PadNum(k, 2) .. ".jpg"))
 | |
| 	
 | |
| 	p = {}
 | |
| 
 | |
| 	For Local k = 0 To 15 Do p[k] = {brush = -1}
 | |
| 
 | |
|         ; generate initial picture layout
 | |
| 	For Local k = 0 To 15
 | |
| 		Repeat
 | |
| 			t = Rnd(num)
 | |
| 		Until p_CheckPic(t) = False
 | |
| 		p[k].brush = t
 | |
| 	Next
 | |
| 
 | |
| 	Local k = 0
 | |
| 
 | |
|         ; generate x & y coordinates for our FX
 | |
| 	For Local y = 0 To 3
 | |
| 
 | |
| 		For Local x = 0 To 3
 | |
| 
 | |
| 			p[k].x = x
 | |
| 			p[k].y = y
 | |
| 		       
 | |
| 			k = k + 1
 | |
| 		Next
 | |
| 	Next
 | |
| 
 | |
|         ; start all FX at once
 | |
|         p_Start16FX()
 | |
| 
 | |
| EndFunction
 | |
| 
 | |
| /* this function gets called when the user presses a button */
 | |
| Function p_EventFunc(msg)
 | |
| 
 | |
| 	If msg.id = bstate Then Return
 | |
| 	
 | |
| 	bstate = msg.id
 | |
| 	
 | |
| 	; update button state
 | |
| 	DisplaySprite(1, 654, 570, bstate)
 | |
| 	
 | |
| 	; cancel all async drawings or clear timeouts
 | |
| 	For Local k = 0 To 15
 | |
| 	
 | |
| 		If p[k].active = True
 | |
| 			CancelAsyncDraw(p[k].drawfunc)
 | |
| 			p[k].active = False
 | |
| 		Else
 | |
| 			If p[k].cleartimeout = True Then ClearTimeout(p[k].timeout)
 | |
| 		EndIf
 | |
| 	Next
 | |
| 	
 | |
| 	; clear screen
 | |
| 	Box(0, 0, 800, 600, #BLACK)	
 | |
| 	
 | |
| 	; choose a new global effect if we're in static mode
 | |
| 	If bstate = 2 Then globfx = p_ChooseFX(False)
 | |
| 	
 | |
|         p_Start16FX()
 | |
| 
 | |
| EndFunction
 | |
| 
 | |
| p_Init()
 | |
| 
 | |
| SetFillStyle(#FILLCOLOR)
 | |
| 
 | |
| SetInterval(Nil, p_MainLoop, 1000 \ 50)  ; 50 fps
 | |
| 
 | |
| bstate = 1
 | |
| 
 | |
| MakeButton(1, #SIMPLEBUTTON, 654, 570, 64, 24, {OnMouseUp = p_EventFunc})
 | |
| MakeButton(2, #SIMPLEBUTTON, 727, 570, 64, 24, {OnMouseUp = p_EventFunc})
 | |
| 
 | |
| DisplaySprite(1, 654, 570)
 | |
| 
 | |
| EscapeQuit(True)
 | |
| 
 | |
| Repeat
 | |
| 	WaitEvent
 | |
| Forever
 | |
| 	
 |