You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.2 KiB
258 lines
6.2 KiB
/**************************************************************** |
|
** ** |
|
** 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 |
|
|
|
|