i have to count frames a lot because i'm using them to base the timing for the rhythm game and the clock. rather than having some global variable i increment every update (which would then require some kind of modulo operation to check, say, if we are on an even numbered frame) i decided to use the closure technique to make a counter that resets after a certain number of frames.
function frame_looper(frames)
local f = 0
return function()
f += 1
if (f>frames) f=1
return f
end
end
|
here i have a function FRAME_LOOPER that takes a number of frames. it creates a local variable f and then returns an anonymous function that when called returns that local variable f. we can now make a variable that uses a frame_looper as a counter.
beat_counter = frame_looper(10) |
now in my _update function i can just call beat_counter() and i'll get back a number from 1-10 depending on how many times the function has been called. rather than having to declare some random variable and set and increment it every update, that local variable f that was enclosed in the anonymous function gets generated every update.
i'm still new to all of this, but i was able to use the technique for two other parts of my code that also work on a counter like this.
function drum_beater(accents)
local i,s = 0,0
return function ()
i += 1
if (i > #accents) i=1
if accents[i] then
s=0
else s=1 end
sfx(s)
end
end
accent1 = {true,false,false,false}
drum = drum_beater(accent1)
--[[ moonbeat:
used in _draw to flicker the
moon sprite]]--
function moonbeat(b)
local moon = {x=80,y=40,
r=8,col=10}
return function()
if b == beat_frame then
moon.r = 10
end
return circfill(
moon.x,moon.y,
moon.r,moon.col)
end
end
moon = moonbeat(0)
|
i can now just call drum() and moon() during _update and get the behavior i want, based on the beat counter for the moon, and using the closure to loop over a table on the drum beat.
[Please log in to post a comment]



