' Horloge V5... ' Une horloge analogique, mais en 3D. ' Essayons de faire réaliste.... ' cadre simple... color #fff create sprite 16 as "cadre" add "cadre" box 1, 1, 1 to 16, 16, 1 move "cadre" to 0, 0, 3 zoom "cadre" to 6, 6, 1 ' On va construire 12 "protubérances" ' pour les 12 index des heures for 1 to 12 as ?heure ?objet = "index-?heure" create sprite 4 as ?objet if (mod ?heure, 3) = 0 ' 3, 6, 9, 12 : plus grand ?l = 4 else ?l = 2 end add ?objet line 1, 1, 1 to 1, ?l, 1 ?angle = ?heure * 30 turn z ?objet to -?angle ' z=2.85 c'est légèrement devant le cadre (3.0) move ?objet to 16 * (sin ?angle), 16 * (cos ?angle), 2.85 next ' Construction des aiguilles : ' 1) Les Heures color #888 create sprite 16 as "heure" add "heure" line 1, 1, 1 to 1, 12, 1 ' note : un sprite est auto centré mais ici on veut ' le faire pivoter autour de sa base (1,1,1) ' on va tout de même le décaler légèrement pour ' laisser une "queue" derrière son axe center "heure" to 1, 2, 1 move "heure" to 0, 0, 2 zoom z "heure" to 0.5' un peu plate paint "heure" to "metal" ' 2) Les minutes color #999 create sprite 16 as "minute" add "minute" line 1, 1, 1 to 1, 16, 1 center "minute" to 1, 2, 1 move "minute" to 0, 0, 1.5 zoom z "minute" to 0.5 paint "minute" to "metal" ' 3) Les secondes color #922 create sprite 16 as "seconde" add "seconde" line 1, 1, 1 to 1, 16, 1 center "seconde" to 1, 2, 1 zoom "seconde" to .5, 1, .5' plate et fine ! move "seconde" to 0, 0, 1 paint "seconde" to "metal" ' Le plus complexe : lumière et ombre ' Les lumières sont toujours un équilibre délicat à trouver. ' lumière d'ambiance assez forte power "glow" to 60 ' Lumière ombre : classiquement en haut à gauche create shadow as "ombre" move "ombre" to -10, 20, -20 target "ombre" to "cadre"' vers le cadre power "ombre" to 40 color "ombre" to #def ' taille minimale pour une bonne qualité shadow "ombre" to 20 ' on va accompagner d'une lumière classique ' à la même position power "light" to 15 color "light" to #ffe move "light" to -30, 20, -30 ' Maintenant, animation de l'horloge ' En débutant à 0, l'horloge se règlera au démarrage ?heure_anim = 0 ?minute_anim = 0 ?seconde_anim = 0 ' boucle principale : rien de spécial ' le calcul des angles se fait ensuite... do ?h = (hours) * 30 ?heure_anim = goto "animation", ?heure_anim, ?h turn z "heure" to -?heure_anim ?m = (minutes) * 6 ?minute_anim = goto "animation", ?minute_anim, ?m turn z "minute" to -?minute_anim ?s = (seconds) * 6 ?seconde_anim = goto "animation", ?seconde_anim, ?s, 10 turn z "seconde" to -?seconde_anim ?angle + .2 move "camera" to 1 * (sin ?angle), -2 * (sin ?angle * 2), -30 + 3 * (sin ?angle) update loop label "animation" local ' ici l'idée est simplement de déplacer en douceur les aiguilles. ' simplement si a doit devenir b --> a = a+(b-a)/10 ' mais il y a un hic : l'aiguille ne repart par en arrière ' entre 59 secondes et 00 ! ' Une distance négative doit être impossible param ?position param ?future_position param ?ralentissement = 30' valeur par défaut ?delta = ?future_position - ?position if ?delta < 0 ' Le hic : pour ne pas revenir en arrière... ' on la place immédiatement 1 tour complet en arrière ' l'aiguille ira donc de l'avant... ?position - 360 end return ?position + (?future_position - ?position) / ?ralentissement '
