here is the CLOCKFACE script...coded in 3 MINUTES...17 LINES of CODE
Geoff Canyon
gcanyon at inspiredlogic.com
Wed Jun 8 10:04:25 EDT 2005
I came up with a radically different approach. Several iterations
ago, we realized that we didn't have to guess when it would be time
to set the clock graphics. We could use 1-(the long seconds mod 1) to
get a message sent exactly when we need it.
Well, we're still guessing at when it's time to move the minute hand
or the hour hand, and we don't need to. The minute hand moves one
degree every ten seconds, the hour hand one degree every two minutes.
The tests to determine this are simple. The natural thing to do is
set the second hand, check to see if the minute hand needs to be set,
and if it does check to see if the hour hand needs to be set. At each
step, I want to exit if appropriate. The stumbling block was the
send...in. I need to get to the end to do it.
Then I realized -- the send...in doesn't have to be the last step. It
can come at any point. So here's the script now:
on openCard
setTime
end openCard
on setTime
send "setTime" to me in 1 - (the long seconds mod 1) seconds
put word 1 of the long time into T --8:13:15
put T & char 2 to 7 of (the long seconds mod 1) into fld "Time"
split T using ":"
set the angle of grc "Second" to 450 - (6 * T[3])
if T[3] mod 10 <> 0 then exit setTime
set the angle of grc "Minute" to 90 - (6 * T[2]) - (T[3] div 10)
if T[3] <> 0 or T[2] mod 2 <> 0 then exit setTime
set the angle of grc "Hour" to 90 - (30 * T[1]) - (T[2] div 2)
end setTime
Notice how simple the check is for the minute hand. Nine out of ten
seconds, the only thing this routine is going to do other than set
the second hand is check whether T[3] mod 10 is 0. This also saves
some time and math because I don't have to check the angle of the
graphics anymore. I just need to set it when the time is right. So no
more mod 360.
This is the same number of lines, but shorter and cleaner, I think. I
could save two lines by adding an else to the if statements:
if t[3] mod 10 <> 0 then exit setTime else set the angle of grc
"Minute" to 90 - (6 * T[2]) - (T[3] div 10)
But that seems artificial and less clear than using two lines.
Let me know what you think.
regards,
Geoff
On Jun 7, 2005, at 9:01 AM, Dennis Brown wrote:
> Dar pointed out that this clock does not have a graceful stop. I
> changed the clock in my user space (see3d) to shut down the clock
> when the card is closed.
>
> Dennis
>
> On Jun 7, 2005, at 12:40 AM, Geoff Canyon wrote:
>
>
>> I've posted the new revision:
>>
>> on openCard
>> setTime
>> end openCard
>>
>> on setTime
>> put word 1 of the long time into T --8:13:15
>> put T & char 2 to 5 of (the long seconds mod 1) into fld "Time"
>> split T using ":"
>> get (450 - (30 * T[1]) - (T[2] div 2)) mod 360
>> if (the angle of grc "Hour") <> it then set the angle of grc
>> "Hour" to it
>> get (450 - (6 * T[2]) - (T[3] div 10)) mod 360
>> if (the angle of grc "Minute") <> it then set the angle of grc
>> "Minute" to it
>> set the angle of grc "Second" to 450 - (6 * T[3])
>> send "setTime" to me in 1 - (the long seconds mod 1) seconds
>> end setTime
>>
>> On Jun 6, 2005, at 9:38 AM, Dennis Brown wrote:
>>
>>
>>
>>> Good catch.
>>> As was pointed out before, trunc(T[2] / 2) can be simplified to (T
>>> [2] div 2)
>>>
>>>
>>>
>>
>> _______________________________________________
>> use-revolution mailing list
>> use-revolution at lists.runrev.com
>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>
>>
>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> http://lists.runrev.com/mailman/listinfo/use-revolution
>
More information about the use-livecode
mailing list