/**************************************************************** ** ** ** 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