Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Chiming Cuckoo Clock
#1
This program creates a representation of a cuckoo clock.  The clock is a standard 12-hour analogue face (as would be a real clock) with a swinging pendulum.  This analogue clock with audio will be a useful addition to your desktop (tongue very much in cheek!).  It features some unusual graphics effects.


.zip   Cuckoo Clock.zip (Size: 569.01 KB / Downloads: 18)

Unzip the file and place the extracted Folder in your QB64 directory & make sure that you have the Run Option “Save EXE in source folder” checked.

   

The pendulum swings under proper gravity mathematics, and it swings with a 1 second tick (2 second period) and this timing is determined by the physics.

At each hour, a "cuckoo" pops out and chimes the number of hours.  At any time, F3 can be pressed to give the chimes of the next hour, and then the time will reset to normal.  F4 can be pressed to turn on or off the clock tick.  Esc to quit.

Occasionally a mouse crawls along clock ledge.

The clock features an alarm.  Pressing F5 allows a time to be set for an alarm (F1 sets the hour, F2 sets the minutes).  F5 cancels a set alarm.  There is a 15 second delay after the set time when an audible alarm is sounded.  The delay is so that the alarm does not coincide an hour chime.

The clock has an Advent Calendar function.  During the days 1st to 25th December, special things happen.  Selections from 26 Advent images are displayed on the hour.  (The reason that there are 26 images for 25 days will become clear when the clock is used).  26 default images are supplied, but you may find that younger family members may enjoy the Advent function if relevant images appear.  You may create up to 26 of your own .png images with files named Advent1.png to Advent26.png.  The displayed image size is quite small and it is suggested that your images are not much larger than 300x300 pixels as there would be noticeable loss of detail.  If you want to explore the Advent Calendar function before Advent arrives, uncheck line 34 and press F3.




Code: (Select All)
'Cuckoo Clock 2025-11-22 by Magdha ex Qwerkey
'With Snow and Advent Calendar
'With Alarm (15s delay)
'With Gnawing Fauna
'Clipart from spriters-resource.com, clipartpng.com, clker.com, clipartpanda.com
'Clipart from pngimg.com, worldartsme.com & openclipart.org
'Sound Effects from www.freesfx.co.uk

'Esc Quit
'F4 Turn On/Off Ticking
'F3 Set Chime
'F5 Set/Cancel Alarm: F1 Set Alarm Hour, F2 Set Alarm Minutes

CONST False = 0, True = NOT False
CONST ScreenX% = 500, ScreenY% = 700
CONST PendLength% = 300, PendX0% = ScreenX% \ 2, PendY0% = 320, PendHalfWidth% = 28
CONST Theta0! = 0.1, Deltat! = 0.01, Gravity! = 9.80665 * 11.4
CONST HandsHalfWidth% = 9, HandsX0% = ScreenX% \ 2, HandsY0% = 271
CONST HrsLength% = 50, MinsLength% = 60, NoFlakes% = 550, RodentStep% = 50
DIM SnowStorm%(NoFlakes%, 3), NumbersImg&(9)
FOR S1% = 0 TO NoFlakes%
    SnowStorm%(S1%, 1) = -1
    SnowStorm%(S1%, 2) = 50 - INT(20 * RND)
NEXT S1%

_TITLE ("Cuckoo Clock - Esc to Quit")
$EXEICON:'.\clock.ico'

RANDOMIZE (TIMER)
'(DATE$ format: mm-dd-yyyy) Advent 1st to 25th Dec
Today$ = DATE$
'Today$ = "12-12-2016"
DayNo% = VAL(MID$(Today$, 4, 2))
Advent%% = False
IF VAL(LEFT$(Today$, 2)) = 12 AND DayNo% <= 25 THEN
    Advent%% = True
    WhichGift1$ = LTRIM$(STR$(DayNo%))
    WhichGift2$ = LTRIM$(STR$(DayNo% + 1))
END IF

'Sounds
CuckooSnd& = _SNDOPEN("Cuckoo.ogg", "SYNC")
AlarmSnd& = _SNDOPEN("Alarm.ogg", "SYNC")
TickSnd& = _SNDOPEN("Tick.ogg", "VOL ,SYNC")
LatchSnd& = _SNDOPEN("Latch.ogg", "VOL ,SYNC")
_SNDVOL TickSnd&, 0.5
_SNDVOL LatchSnd&, 0.8

'Images
ClockImg& = _LOADIMAGE("Clock1.png", 33)
PendImg& = _LOADIMAGE("Pendulum1.png", 33)
PendImgHeight% = _HEIGHT(PendImg&)
PendImgWidth% = _WIDTH(PendImg&)
RodentImg! = _LOADIMAGE("Running Mouse.png", 33)
TempImg& = _NEWIMAGE(58, 38, 32)
_DEST TempImg&
CIRCLE (29, 29), 30, _RGB(60, 60, 0)
PAINT (29, 29), _RGB(60, 60, 0), _RGB(60, 60, 0)
LINE (0, 29)-(59, 59), _RGB(60, 60, 0), BF
BackDoorImg& = HardwareImage&(TempImg&)
DoorImg& = _LOADIMAGE("Door1.png", 33)
RightDoorImg& = _LOADIMAGE("Right Door.png", 33)
LeftDoorImg& = _LOADIMAGE("Left Door.png", 33)
TempImg& = _NEWIMAGE(48, 48, 32)
_DEST TempImg&
COLOR _RGB(40, 40, 0), _RGB(70, 70, 0)
CLS
LINE (0, 0)-(47, 47), , B
LINE (7, 7)-(40, 40), , B
LINE (0, 0)-(7, 7),
LINE (0, 47)-(7, 40),
LINE (47, 0)-(40, 7),
LINE (47, 47)-(40, 40),
BackDoorsImg& = HardwareImage&(TempImg&)
BirdImg& = _LOADIMAGE("Birdie.png", 33)
BirdAImg& = _LOADIMAGE("Birdie3.png", 33)
IF Advent%% THEN
    Gift1Img& = _LOADIMAGE("Advent" + WhichGift1$ + ".png", 33)
    Gift2Img& = _LOADIMAGE("Advent" + WhichGift2$ + ".png", 33)
END IF
SnowImg& = _LOADIMAGE("Snowflake1.png", 33)
HandSrcImg& = _LOADIMAGE("Original Hand.png", 32)
HandsSrcHeight% = _HEIGHT(HandSrcImg&)
HandsSrcWidth% = _WIDTH(HandSrcImg&)
HandsScale! = 2 * HandsHalfWidth% / HandsSrcWidth%
HandsOffset% = CINT(30 * HandsScale!) 'FIO was CONST 7
TempImg& = _NEWIMAGE(2 * HandsHalfWidth%, HrsLength%, 32)
_PUTIMAGE (0, 0)-((2 * HandsHalfWidth%) - 1, (HrsLength% / 2) + 1), HandSrcImg&, TempImg&, (0, 0)-(HandsSrcWidth% - 1, CINT(((HrsLength% / 2) + 1) / HandsScale!)) 'scaled for 20->84
_PUTIMAGE (0, (HrsLength% / 2) - 1)-((2 * HandsHalfWidth%) - 1, HrsLength% - 1), HandSrcImg&, TempImg&, (0, HandsSrcHeight% - 1 - CINT(((HrsLength% / 2) + 1) / HandsScale!))-(HandsSrcWidth% - 1, HandsSrcHeight% - 1)
HourHandImg& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(2 * HandsHalfWidth%, MinsLength%, 32)
_PUTIMAGE (0, 0)-((2 * HandsHalfWidth%) - 1, (MinsLength% / 2) + 1), HandSrcImg&, TempImg&, (0, 0)-(HandsSrcWidth% - 1, CINT(((MinsLength% / 2) + 1) / HandsScale!))
_PUTIMAGE (0, (MinsLength% / 2) - 1)-((2 * HandsHalfWidth%) - 1, MinsLength% - 1), HandSrcImg&, TempImg&, (0, HandsSrcHeight% - 1 - CINT(((MinsLength% / 2) + 1) / HandsScale!))-(HandsSrcWidth% - 1, HandsSrcHeight% - 1)
MinuteHandImg& = HardwareImage&(TempImg&)
_FREEIMAGE HandSrcImg&

'Draw Hardware Numerals
FOR S2%% = 0 TO 9
    TempImg& = _NEWIMAGE(10, 15, 32)
    _DEST TempImg&
    COLOR _RGB(255, 255, 0), _RGBA(128, 128, 0, 0)
    CLS
    _PRINTSTRING (0, 0), RIGHT$(STR$(S2%%), 1)
    NumbersImg&(S2%%) = HardwareImage&(TempImg&)
NEXT S2%%
TempImg& = _NEWIMAGE(10, 15, 32)
_DEST TempImg&
COLOR _RGB(255, 255, 0), _RGBA(128, 128, 0, 0)
CLS
_PRINTSTRING (0, 0), ":"
ColonImg& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(60, 15, 32)
_DEST TempImg&
COLOR _RGB(255, 255, 0), _RGBA(128, 128, 0, 0)
CLS
_PRINTSTRING (0, 0), "Alarm"
AlarmImg& = HardwareImage&(TempImg&)

'Screen
SCREEN _NEWIMAGE(ScreenX%, ScreenY%, 32)
_SCREENMOVE 50, 10
_DEST 0
_DISPLAYORDER _HARDWARE 'Hardware images only

'Initial Values
Theta! = Theta0!
Speed! = 0
DoCuckoo%% = False
DoSquawk%% = False
Count0% = 0
Count1% = 0
GoRodent! = 0
RodentPersp% = 0
PrevSec% = 59
ClosingDoor%% = False
OpeningDoor%% = False
DoTick%% = True
TimeToNextHour! = 0
DoSwissClock%% = True
Alarum%% = False
SetHrs%% = 0
SetMins%% = 0

WHILE DoSwissClock%%
    _LIMIT 500

    SwissTime! = TIMER + TimeToNextHour! 'FIO Can Add Temp Offset
    SwissHour% = INT(SwissTime! / 3600): SwissMinute% = INT((SwissTime! - SwissHour% * 3600) / 60): SwissSecond% = INT(SwissTime! - SwissHour% * 3600 - SwissMinute% * 60)
    SwissHour% = SwissHour% MOD 12
    IF SwissHour% = 0 THEN SwissHour% = 12
    AngleHourHand! = (SwissTime! MOD 43200) * 2 * _PI / 43200
    AngleMinuteHand! = (SwissMinute% + (SwissSecond% / 60)) * 2 * _PI / 60

    IF SwissMinute% = 0 AND SwissSecond% = 0 AND PrevSec% <> 0 THEN DoCuckoo%% = True

    IF SwissHour% = SetHrs%% AND SwissMinute% = SetMins%% AND SwissSecond% = 15 AND Alarum%% THEN ' Extra 15s to avoid clash with chime at hour
        _SNDPLAY AlarmSnd&
        Alarum%% = False
    END IF

    IF DoCuckoo%% THEN
        IF SwissSecond% <> PrevSec% THEN
            IF SwissSecond% = 0 THEN
                'open door & send out cuckoo
                OpeningDoor%% = True
                _SNDPLAY LatchSnd&
            ELSEIF SwissSecond% = SwissHour% + 1 THEN
                'send in cuckoo & close door
                DoCuckoo%% = False
                OpeningDoor%% = False
                ClosingDoor%% = True
                TimeToNextHour! = 0
                _SNDPLAY LatchSnd&
            ELSE
                _SNDPLAY CuckooSnd&
                DoSquawk%% = True
            END IF
            PrevSec% = SwissSecond%
        END IF
    END IF

    'Snow
    IF Advent%% THEN
        IF RND < 1 / 101 THEN
            S1% = INT(RND * NoFlakes%)
            IF SnowStorm%(S1%, 1) = -1 THEN
                SnowStorm%(S1%, 0) = INT(RND * ScreenX%)
                SnowStorm%(S1%, 1) = 0
            END IF
        END IF
        FOR S1% = 0 TO NoFlakes%
            IF SnowStorm%(S1%, 1) <> -1 THEN
                _PUTIMAGE (SnowStorm%(S1%, 0) - 1, SnowStorm%(S1%, 1) - 1), SnowImg&
                IF SnowStorm%(S1%, 3) = SnowStorm%(S1%, 2) - 1 THEN SnowStorm%(S1%, 1) = SnowStorm%(S1%, 1) + 1
                IF SnowStorm%(S1%, 1) = ScreenY% THEN
                    SnowStorm%(S1%, 1) = -1
                ELSE
                    IF RND < 1 / 100 THEN
                        IF SnowStorm%(S1%, 0) = 0 THEN
                            IF RND > 0.5 THEN
                                SnowStorm%(S1%, 0) = 1
                            ELSE
                                SnowStorm%(S1%, 0) = ScreenX% - 1
                            END IF
                        ELSEIF SnowStorm%(S1%, 0) = ScreenX% - 1 THEN
                            IF RND > 0.5 THEN
                                SnowStorm%(S1%, 0) = ScreenX% - 2
                            ELSE
                                SnowStorm%(S1%, 0) = 0
                            END IF
                        ELSE
                            IF RND > 0.5 THEN
                                SnowStorm%(S1%, 0) = SnowStorm%(S1%, 0) + 1
                            ELSE
                                SnowStorm%(S1%, 0) = SnowStorm%(S1%, 0) - 1
                            END IF
                        END IF
                    END IF
                    SnowStorm%(S1%, 3) = SnowStorm%(S1%, 3) + 1
                    IF SnowStorm%(S1%, 3) = SnowStorm%(S1%, 2) THEN SnowStorm%(S1%, 3) = 0
                END IF
            END IF
        NEXT S1%
    END IF

    'Pendulum
    ObjectEndX! = PendX0% - (PendLength% * SIN(Theta!))
    ObjectEndY! = PendY0% + (PendLength% * COS(Theta!))
    DeltaX! = PendHalfWidth% * COS(Theta!)
    DeltaY! = PendHalfWidth% * SIN(Theta!)
    SrcWidth% = PendImgWidth% - 1: SrcHeight% = PendImgHeight% - 1
    DestTLX% = CINT(PendX0% - DeltaX!): DestTLY% = CINT(PendY0% - DeltaY!)
    DestTRX% = CINT(PendX0% + DeltaX!): DestTRY% = CINT(PendY0% + DeltaY!)
    DestBLX% = CINT(ObjectEndX! - DeltaX!): DestBLY% = CINT(ObjectEndY! - DeltaY!)
    DestBRX% = CINT(ObjectEndX! + DeltaX!): DestBRY% = CINT(ObjectEndY! + DeltaY!)
    _MAPTRIANGLE (0, 0)-(SrcWidth%, 0)-(0, SrcHeight%), PendImg& TO(DestTLX%, DestTLY%)-(DestTRX%, DestTRY%)-(DestBLX%, DestBLY%)
    _MAPTRIANGLE (SrcWidth%, SrcHeight%)-(0, SrcHeight%)-(SrcWidth%, 0), PendImg& TO(DestBRX%, DestBRY%)-(DestBLX%, DestBLY%)-(DestTRX%, DestTRY%)

    'Clock
    _PUTIMAGE (ScreenX% / 2 - 200, 43), ClockImg&

    'Image for door background
    _PUTIMAGE ((ScreenX% / 2) - 28, 120)-((ScreenX% / 2) + 28, 176), BackDoorImg&

    IF ClosingDoor%% THEN
        IF Advent%% THEN
            _PUTIMAGE (136, 334), BackDoorsImg&
            _PUTIMAGE (317, 334), BackDoorsImg&
            _PUTIMAGE (137, 335)-(182, 380), Gift1Img&
            _PUTIMAGE (318, 335)-(363, 380), Gift2Img&
        END IF
        IF Count0% < 240 THEN
            _PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - CINT(75 * Count0% / 240), 178), DoorImg&
            IF Advent%% THEN
                _PUTIMAGE (137, 335)-(137 + 45, 335 + CINT(45 * (1 - Count0% / 240))), LeftDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
                _PUTIMAGE (318, 335)-(318 + 45, 335 + CINT(45 * (1 - Count0% / 240))), RightDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
            END IF
        ELSE
            _PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - 75, 178), DoorImg&
            _PUTIMAGE ((ScreenX% / 2) - CINT(30 * (Count0% - 240) / 240), 152 - CINT(30 * (Count0% - 240) / 240))-((ScreenX% / 2) + CINT(30 * (Count0% - 240) / 240), 152 + CINT(30 * (Count0% - 240) / 240)), BirdImg&
        END IF
        IF Count0% = 0 THEN
            ClosingDoor%% = False
        ELSE
            Count0% = Count0% - 1
        END IF
    ELSEIF OpeningDoor%% THEN
        IF Advent%% THEN
            _PUTIMAGE (136, 334), BackDoorsImg&
            _PUTIMAGE (317, 334), BackDoorsImg&
            _PUTIMAGE (137, 335)-(182, 380), Gift1Img&
            _PUTIMAGE (318, 335)-(363, 380), Gift2Img&
        END IF
        IF Count0% < 240 THEN
            _PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - CINT(75 * Count0% / 240), 178), DoorImg&
            IF Advent%% THEN
                _PUTIMAGE (137, 335)-(137 + 45, 335 + CINT(45 * (1 - Count0% / 240))), LeftDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
                _PUTIMAGE (318, 335)-(318 + 45, 335 + CINT(45 * (1 - Count0% / 240))), RightDoorImg&, , (0, 45 * Count0% / 240)-(45, 45)
            END IF
        ELSE
            _PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30 - 75, 178), DoorImg&
            IF DoSquawk%% THEN
                _PUTIMAGE ((ScreenX% / 2) - 32, 120)-((ScreenX% / 2) + 32, 184), BirdAImg&
            ELSE
                BirdSinY% = -25 * SIN(_PI * (Count0% - 240) / 240)
                _PUTIMAGE ((ScreenX% / 2) - CINT(30 * (Count0% - 240) / 240), 152 - CINT(30 * (Count0% - 240) / 240) + BirdSinY%)-((ScreenX% / 2) + CINT(30 * (Count0% - 240) / 240), 152 + CINT(30 * (Count0% - 240) / 240) + BirdSinY%), BirdImg&
            END IF
        END IF
        IF Count0% < 480 THEN Count0% = Count0% + 1
    ELSE
        'display doors
        _PUTIMAGE ((ScreenX% / 2) - 30, 118)-((ScreenX% / 2) + 30, 178), DoorImg&
        IF Advent%% THEN
            _PUTIMAGE (136, 334), BackDoorsImg&
            _PUTIMAGE (317, 334), BackDoorsImg&
            _PUTIMAGE (137, 335), LeftDoorImg&
            _PUTIMAGE (318, 335), RightDoorImg&
        END IF
    END IF

    IF DoSquawk%% THEN
        Count1% = Count1% + 1
        IF Count1% = 200 THEN
            Count1% = 0
            DoSquawk%% = False
        END IF
    END IF

    'Hour Hands
    UpperOffsetX% = -(HandsOffset% * SIN(AngleHourHand!)) + HandsX0%
    UpperOffsetY% = (HandsOffset% * COS(AngleHourHand!)) + HandsY0%
    ObjectEndX! = (HrsLength% - HandsOffset%) * SIN(AngleHourHand!) + HandsX0%
    ObjectEndY! = -(HrsLength% - HandsOffset%) * COS(AngleHourHand!) + HandsY0%
    DeltaX! = HandsHalfWidth% * COS(AngleHourHand!)
    DeltaY! = HandsHalfWidth% * SIN(AngleHourHand!)
    SrcWidth% = (2 * HandsHalfWidth%) - 1: SrcHeight% = HrsLength% - 1
    DestTLX% = CINT(UpperOffsetX% - DeltaX!): DestTLY% = CINT(UpperOffsetY% - DeltaY!)
    DestTRX% = CINT(UpperOffsetX% + DeltaX!): DestTRY% = CINT(UpperOffsetY% + DeltaY!)
    DestBLX% = CINT(ObjectEndX! - DeltaX!): DestBLY% = CINT(ObjectEndY! - DeltaY!)
    DestBRX% = CINT(ObjectEndX! + DeltaX!): DestBRY% = CINT(ObjectEndY! + DeltaY!)
    _MAPTRIANGLE (0, 0)-(SrcWidth%, 0)-(0, SrcHeight%), HourHandImg& TO(DestTLX%, DestTLY%)-(DestTRX%, DestTRY%)-(DestBLX%, DestBLY%)
    _MAPTRIANGLE (SrcWidth%, SrcHeight%)-(0, SrcHeight%)-(SrcWidth%, 0), HourHandImg& TO(DestBRX%, DestBRY%)-(DestBLX%, DestBLY%)-(DestTRX%, DestTRY%)

    'Minute Hands
    UpperOffsetX% = -(HandsOffset% * SIN(AngleMinuteHand!)) + HandsX0%
    UpperOffsetY% = (HandsOffset% * COS(AngleMinuteHand!)) + HandsY0%
    ObjectEndX! = (MinsLength% - HandsOffset%) * SIN(AngleMinuteHand!) + HandsX0%
    ObjectEndY! = -(MinsLength% - HandsOffset%) * COS(AngleMinuteHand!) + HandsY0%
    DeltaX! = HandsHalfWidth% * COS(AngleMinuteHand!)
    DeltaY! = HandsHalfWidth% * SIN(AngleMinuteHand!)
    SrcHeight% = MinsLength% - 1
    DestTLX% = CINT(UpperOffsetX% - DeltaX!): DestTLY% = CINT(UpperOffsetY% - DeltaY!)
    DestTRX% = CINT(UpperOffsetX% + DeltaX!): DestTRY% = CINT(UpperOffsetY% + DeltaY!)
    DestBLX% = CINT(ObjectEndX! - DeltaX!): DestBLY% = CINT(ObjectEndY! - DeltaY!)
    DestBRX% = CINT(ObjectEndX! + DeltaX!): DestBRY% = CINT(ObjectEndY! + DeltaY!)
    _MAPTRIANGLE (0, 0)-(SrcWidth%, 0)-(0, SrcHeight%), MinuteHandImg& TO(DestTLX%, DestTLY%)-(DestTRX%, DestTRY%)-(DestBLX%, DestBLY%)
    _MAPTRIANGLE (SrcWidth%, SrcHeight%)-(0, SrcHeight%)-(SrcWidth%, 0), MinuteHandImg& TO(DestBRX%, DestBRY%)-(DestBLX%, DestBLY%)-(DestTRX%, DestTRY%)

    IF GoRodent! = 0 AND RND < 1 / (500 * 5) THEN
        GoRodent! = RND
        IF GoRodent! > 0.5 THEN
            RodentPos% = 120
        ELSE
            RodentPos% = 380
        END IF
        FwdRodent%% = True
        RevRodent%% = False
        Count2% = 0
        RatRunOld% = 0
        RANDOMIZE (TIMER)
    END IF

    'Rodent
    IF GoRodent! <> 0 THEN
        RatRun% = Count2% \ RodentStep%
        IF RatRun% <> RatRunOld% THEN
            IF FwdRodent%% THEN
                RodentPersp% = RodentPersp% + 1
            ELSEIF RevRodent%% THEN
                RodentPersp% = RodentPersp% - 1
            ELSE
                IF GoRodent! > 0.5 THEN
                    RodentPos% = RodentPos% + 1
                ELSE
                    RodentPos% = RodentPos% - 1
                END IF
            END IF
            RatRunOld% = RatRun%
            RodentSize% = CINT(RodentPersp% / 3)
        END IF
        IF FwdRodent%% THEN
            IF GoRodent! > 0.5 THEN
                _PUTIMAGE (120 - (RodentSize% \ 2), 385 - RodentSize%)-(120 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 21)-(17 + (18 * RatRun%), 36)
            ELSE
                _PUTIMAGE (380 - (RodentSize% \ 2), 385 - RodentSize%)-(380 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 21)-(17 + (18 * RatRun%), 36)
            END IF
            IF RodentPersp% = 45 THEN FwdRodent%% = False
        ELSEIF RevRodent%% THEN
            IF GoRodent! > 0.5 THEN
                _PUTIMAGE (380 - (RodentSize% \ 2), 385 - RodentSize%)-(380 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 132)-(17 + (18 * RatRun%), 147)
            ELSE
                _PUTIMAGE (120 - (RodentSize% \ 2), 385 - RodentSize%)-(120 + RodentSize% - (RodentSize% \ 2), 385), RodentImg!, , (2 + (18 * RatRun%), 132)-(17 + (18 * RatRun%), 147)
            END IF
            IF RodentPersp% = 0 THEN GoRodent! = 0
        ELSE
            IF GoRodent! > 0.5 THEN
                _PUTIMAGE (RodentPos% - 8, 370), RodentImg!, , (2 + (18 * RatRun%), 95)-(17 + (18 * RatRun%), 110)
                IF RodentPos% = 380 THEN RevRodent%% = True
            ELSE
                _PUTIMAGE (RodentPos% - 8, 370), RodentImg!, , (2 + (18 * RatRun%), 58)-(17 + (18 * RatRun%), 73)
                IF RodentPos% = 120 THEN RevRodent%% = True
            END IF
        END IF
        Count2% = Count2% + 1
        IF Count2% = 4 * RodentStep% THEN Count2% = 0
    END IF

    IF Alarum%% THEN
        _PUTIMAGE ((ScreenX% / 2) - 75, 401), AlarmImg&
        IF SetHrs%% > 9 THEN
            S2%% = SetHrs%% - 10
            _PUTIMAGE ((ScreenX% / 2) - 15, 401), NumbersImg&(S2%%)
            _PUTIMAGE ((ScreenX% / 2) - 25, 401), NumbersImg&(1)
        ELSE
            _PUTIMAGE ((ScreenX% / 2) - 15, 401), NumbersImg&(SetHrs%%)
        END IF
        _PUTIMAGE ((ScreenX% / 2) - 5, 401), ColonImg&
        S2%% = SetMins%% \ 10
        S3%% = SetMins%% MOD 10
        _PUTIMAGE ((ScreenX% / 2) + 5, 401), NumbersImg&(S2%%)
        _PUTIMAGE ((ScreenX% / 2) + 15, 401), NumbersImg&(S3%%)
    END IF

    'Pendulum Maths
    Deltav! = -Gravity! * SIN(Theta!) * Deltat!
    Theta! = Theta! + (Deltat! * (Speed! + (Deltav! / 2)) / PendLength%)
    Speed! = Speed! + Deltav!
    IF Theta! > Theta0! THEN
        Theta! = Theta0!: Speed! = 0
        IF DoTick%% THEN _SNDPLAY TickSnd&
    ELSEIF Theta! < -Theta0! THEN
        Theta! = -Theta0!: Speed! = 0
        IF DoTick%% THEN _SNDPLAY TickSnd&
    END IF

    K1$ = INKEY$
    IF K1$ <> "" THEN
        IF ASC(K1$) = 27 THEN
            DoSwissClock%% = False
        ELSEIF fkey%%(K1$) = 4 THEN 'Tick On/Off
            IF DoTick%% THEN
                DoTick%% = False
            ELSE
                DoTick%% = True
            END IF
        ELSEIF fkey%%(K1$) = 3 AND TimeToNextHour! = 0 AND NOT DoCuckoo%% AND NOT ClosingDoor%% THEN 'Set Chime (Set to next hour)
            H1% = SwissHour%: T1! = SwissTime!
            IF H1% = 12 THEN H1% = 0
            IF T1! > 43200 THEN T1! = T1! - 43200
            TimeGap! = (H1% + 1) * 3600 - T1!
            IF TimeGap! > 35 THEN TimeToNextHour! = TimeGap! - 4
        ELSEIF fkey%%(K1$) = 5 THEN 'Alarm On/Off
            IF Alarum%% THEN
                Alarum%% = False
            ELSE
                Alarum%% = True
                SetHrs%% = SwissHour%
                SetMins%% = ((SwissMinute% + 1) \ 5 + 1) * 5
                IF SetMins%% > 60 THEN
                    SetMins%% = 5
                    SetHrs%% = SetHrs%% + 1
                    IF SetHrs%% > 12 THEN SetHrs%% = 1
                ELSEIF SetMins%% > 55 THEN
                    SetMins%% = 0
                    SetHrs%% = SetHrs%% + 1
                    IF SetHrs%% > 12 THEN SetHrs%% = 1
                END IF
            END IF
        ELSEIF fkey%%(K1$) = 1 AND Alarum%% THEN 'Set Alarm Hour
            SetHrs%% = SetHrs%% + 1
            IF SetHrs%% > 12 THEN SetHrs%% = 1
        ELSEIF fkey%%(K1$) = 2 AND Alarum%% THEN 'Set Alarm Minutes
            SetMins%% = SetMins%% + 5
            IF SetMins%% > 55 THEN SetMins%% = 0
        END IF
    END IF
    K1$ = ""

    _DISPLAY

WEND

_SNDCLOSE CuckooSnd&
_SNDCLOSE TickSnd&
_SNDCLOSE LatchSnd&
_SNDCLOSE AlarmSnd&
_FREEIMAGE PendImg&
_FREEIMAGE ClockImg&
_FREEIMAGE RodentImg!
_FREEIMAGE DoorImg&
_FREEIMAGE BackDoorImg&
_FREEIMAGE BirdImg&
_FREEIMAGE BirdAImg&
IF Advent%% THEN
    _FREEIMAGE Gift1Img&
    _FREEIMAGE Gift2Img&
END IF
_FREEIMAGE MinuteHandImg&
_FREEIMAGE HourHandImg&
_FREEIMAGE RightDoorImg&
_FREEIMAGE BackDoorsImg&
FOR S2%% = 0 TO 9
    _FREEIMAGE NumbersImg&(S2%%)
NEXT S2%%
_FREEIMAGE ColonImg&
_FREEIMAGE AlarmImg&

SYSTEM

FUNCTION fkey%% (Key$)
    IF ASC(Key$) <> 0 THEN
        fkey%% = 0
    ELSE
        fkey%% = ASC(RIGHT$(Key$, 1)) - 58
    END IF
END FUNCTION

FUNCTION HardwareImage& (ImageName&)
    HardwareImage& = _COPYIMAGE(ImageName&, 33)
    _FREEIMAGE ImageName&
END FUNCTION
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Clock Patience (InForm Game) Magdha 0 214 11-20-2025, 10:23 AM
Last Post: Magdha

Forum Jump:


Users browsing this thread: 1 Guest(s)