RFC: Silly little Animate function...
Ken Corey
ken at kencorey.com
Tue Feb 21 16:20:46 EST 2012
Hi All,
I now have that silly little animate function I was threatening earlier.
I post it here for comments. Is this done in a Livecode-style? Are
there CPU hogs I'm hiding in here? Can anyone spot any errors? Any
improvements/speed-ups you can suggest?
I noticed that the regular expressions are long, and are going to wrap,
which means they'll likely break in many email clients. Just tape 'em
back together.
The syntax came out pretty much as I'd hoped:
animate "long name of obj", \
"property newvalue;[property newvalue[;...]]", \
howLong
"property" is the name of the property of the object.
"newvalue" is the new value of the property. It can be
an integer, a float, a percentage of current (50%), or
a color triplet (255,0,0)
"howLong" is the time to attempt to take, in milliseconds to
perform the animation.
Caveats:
1) No error/bounds/property checking happens. If you tell it to, it will
try to set the "vanilla" property of something whether it exists or not.
2) The color changing "works" for some value of "works". It's slowish
because it uses regular expressions.
3) The frames per second is hard coded into animate. Change as you like.
4) There's no hand-shaking with the world outside this function. You
would *not* want to try to make a game with this function.
5) It relies on the 'send' command for each frame of each animated
object, which means it's much less efficient than it could be.
----------------------------8<-----------------------------
-- pAtts and pTime is only passed the first time.
-- subsequent calls only pObj is populated, all working
-- variables are stored as custom properties in pObj.
on animate pObj,pAtts,pTime
lock screen
local nf
local sFramesPerSecond
put 30 into sFramesPerSecond
put the animating of pObj into bAnimating
if bAnimating is empty or not bAnimating then
-- set up animating
-- make sure we always get at least 1 frame
put max(trunc((sFramesPerSecond*pTime/1000)+.5),1) into nf
set the pAtts of pObj to empty
split pAtts by ";" and space
set the pAtts of pObj to pAtts
repeat for each line aKey in the keys of pAtts
put the aKey of pObj into tVar
put aKey&"_delta" into tKey
if char -1 of pAtts[aKey] = "%" then
-- we were passed a percentage
put (char 1 to -2 of pAtts[aKey])/100 into tValue
set the tKey of pObj to (tValue * (the aKey of pObj) - the
aKey of pObj)/nf
else if aKey = "foregroundColor" or aKey = "backgroundColor" then
put
matchText(pAtts[aKey],"([0-9\.\-]+),([0-9\.\-]+),([0-9\.\-]+)",tNRed,tNGreen,tNBlue)
into tJunk
put the aKey of pObj into tColor
if tColor is empty then
put 0,0,0 into tColor
end if
put
matchText(tColor,"([0-9\.\-]+),([0-9\.\-]+),([0-9\.\-]+)",tORed,tOGreen,tOBlue)
into tJunk
put (tNRed - tORed)/nf into tDRed
put (tNGreen - tOGreen)/nf into tDGreen
put (tNBlue - tOBlue)/nf into tDBlue
-- set the color change here...note that each channel can
be fractional.
set the tKey of pObj to tDRed&comma&tDGreen&comma&tDBlue
else
set the tKey of pObj to (pAtts[aKey] - the aKey of pObj)/nf
end if
-- Drat! floats get trunced, so we must carry them through,
but start
-- with the original number.
put aKey&"_float" into tKeyFloat
set the tKeyFloat of pObj to the aKey of pObj
set the timeslice of pObj to pTime/nf
set the numberOfFrames of pObj to nf
set the curFrame of pObj to 1
end repeat
set the animating of pObj to true
send "animate "&pObj to me in 1/nf milliseconds
else
-- we're animating, so the delta's should exist
if the curFrame of pObj <= the numberOfFrames of pObj then
set the curFrame of pObj to (the curFrame of pObj + 1)
put the pAtts of pObj into pAtts
repeat for each line aKey in the keys of pAtts
put aKey&"_delta" into tKey
put aKey&"_float" into tKeyFloat
if aKey = "foregroundColor" or aKey = "backgroundColor" then
put the tKeyFloat of pObj into tColor
put
matchText(tColor,"([0-9\.\-]+),([0-9\.\-]+),([0-9\.\-]+)",tORed,tOGreen,tOBlue)
into tJunk
put the tKey of pObj into tColor
put
matchText(tColor,"([0-9\.\-]+),([0-9\.\-]+),([0-9\.\-]+)",tNRed,tNGreen,tNBlue)
into tJunk
put tNRed + tORed into tDRed
put tNGreen + tOGreen into tDGreen
put tNBlue + tOBlue into tDBlue
set the aKey of pObj to
trunc(tDRed)&comma&trunc(tDGreen)&comma&trunc(tDBlue)
set the tKeyFloat of pObj to
tDRed&comma&tDGreen&comma&tDBlue
else
-- Drat! floats get trunced, so we must carry them through.
set the aKey of pObj to the tKeyFloat of pObj + the tKey
of pObj
set the tKeyFloat of pObj to the tKeyFloat of pObj + the
tKey of pObj
end if
end repeat
send "animate "&pObj to me in (the timeslice of pObj) milliseconds
else
set the animating of pObj to false
end if
end if
end animate
More information about the use-livecode
mailing list