スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)
ここには、アナログ時計のサンプル・ソース(1)を載せておきます。
コンパイル・オプションとして ANALOG_BIG を定義すると「大きい時計」、定義しないと「小さい時計」を描きます。
sin、cos 関数を使って角度から座標を求める事で line 命令で時針、分針、秒針を描いてます。
なお、数学のデカルト座標とは異なり、縦軸のY座標は上がマイナスの角度、下がプラスの角度になります。
ここに注意しないと反時計周りに針が描画されます。
さらに数学では横軸は sin 関数、縦軸は cos 関数を使いますが、
これは午後3時の水平線が 0 度と考えてるからです。
アナログ時計を描くときには 90 度ずらす必要があるので、
横軸を cos 関数、縦軸を sin 関数にすることで 0 度が昼12時になります。
アナログ時計のソース(1)
管理上このサンプルは sample59a(アナログ時計).hsp のソースです。
//------------------------------------------------------------------------------ // アナログ時計のサンプル by 科学太郎 //============================================================================== // 新規作成日:2014-08-13 (水) 11:15:00 // 最終更新日:2014-08-13 (水) 13:48:00 //------------------------------------------------------------------------------ #define ANALOG_BIG ;↑ ;コメントにすると「小さい時計」を表示します。 //-------------------------------------- // 記号定数(大きい時計) //-------------------------------------- #ifdef ANALOG_BIG #const ANALOG_MARGIN (10) ;円の余白(マージン) #const ANALOG_SIZE (400) ;円の直径 #const ANALOG_HALF (ANALOG_SIZE/2) ;円の半径 # #const ANALOG_FRAME (15) ;外枠の太さ #const ANALOG_SCALE1 (3) ;目盛りピン(半径,1分毎) #const ANALOG_SCALE5 (8) ;目盛りピン(半径,5分毎) #const ANALOG_CENTER (8) ;中心のピン(半径) # #const ANALOG_TIPLEN (ANALOG_HALF-ANALOG_FRAME-ANALOG_SCALE5) #const ANALOG_H_STICK (ANALOG_TIPLEN*2/3) ;時針の出っ張りドット #const ANALOG_M_STICK (ANALOG_TIPLEN*7/8) ;分針の出っ張りドット #const ANALOG_S_STICK (ANALOG_TIPLEN*1/1) ;秒針の出っ張りドット #else //-------------------------------------- // 記号定数(小さい時計) //-------------------------------------- #const ANALOG_MARGIN (0) ;円の余白(マージン) #const ANALOG_SIZE (96) ;円の直径 #const ANALOG_HALF (ANALOG_SIZE/2) ;円の半径 # #const ANALOG_FRAME (5) ;外枠の太さ #const ANALOG_SCALE1 (0) ;目盛りピン(半径,1分毎) #const ANALOG_SCALE5 (3) ;目盛りピン(半径,5分毎) #const ANALOG_CENTER (4) ;中心のピン(半径) # #const ANALOG_TIPLEN (ANALOG_HALF-ANALOG_FRAME-ANALOG_SCALE5) #const ANALOG_H_STICK (ANALOG_TIPLEN*2/3) ;時針の出っ張りドット #const ANALOG_M_STICK (ANALOG_TIPLEN*7/8) ;分針の出っ張りドット #const ANALOG_S_STICK (ANALOG_TIPLEN*1/1) ;秒針の出っ張りドット #endif //-------------------------------------- // メイン部 //-------------------------------------- *Init cx=ANALOG_MARGIN cy=ANALOG_MARGIN ex=cx+ANALOG_SIZE-1 ey=cy+ANALOG_SIZE-1 rx=cx+ANALOG_HALF ry=cy+ANALOG_HALF *Main n=ANALOG_MARGIN+ANALOG_SIZE+ANALOG_MARGIN #ifdef ANALOG_BIG screen 0,n,n,SCREEN_NORMAL #else screen 0,n,n,SCREEN_NORMAL|SCREEN_TOOL gsel 0,2 #endif title "アナログ時計" color $FF,$DD,$FF:boxf repeat redraw 0 nHour=gettime(4) nMin=gettime(5) nSec=gettime(6) hMSec=gettime(7) DrawAnalog cx,cy,ex,ey DrawHour rx,ry,nHour,nMin DrawMin rx,ry,nMin,nSec DrawSec rx,ry,nSec,hMSec DrawPin rx,ry redraw 1 await 100 loop stop //-------------------------------------- // 文字盤の描画 //-------------------------------------- #deffunc DrawAnalog int _cx_,int _cy_,int _ex_,int _ey_ ;文字盤 n=ANALOG_FRAME color $66,$33,$00:circle _cx_+0,_cy_+0,_ex_-0,_ey_-0,1 color $FF,$FF,$FF:circle _cx_+n,_cy_+n,_ex_-n,_ey_-n,1 ;目盛り(1分毎) color $99,$66,$00 repeat 60 n=(6*cnt) ;(360/60*cnt) m=DEG2RAD(n) x=_cx_+ANALOG_HALF+sin(m)*ANALOG_TIPLEN y=_cy_+ANALOG_HALF-cos(m)*ANALOG_TIPLEN n=ANALOG_SCALE1:circle (x-n),(y-n),(x+n-1),(y+n-1),1 loop ;目盛り(5分毎) color $99,$66,$00 repeat 12 n=(30*cnt) ;(360/12*cnt) m=DEG2RAD(n) x=_cx_+ANALOG_HALF+sin(m)*ANALOG_TIPLEN y=_cy_+ANALOG_HALF-cos(m)*ANALOG_TIPLEN n=ANALOG_SCALE5:circle (x-n),(y-n),(x+n-1),(y+n-1),1 loop return //-------------------------------------- // 時針の描画 //-------------------------------------- #deffunc DrawHour int _rx_,int _ry_,int _hour_,int _min_ if(_hour_>=12):h=_hour_-12:else:h=_hour_ n=(30*h) ;(360/12*h) n=(30*h+_min_/2) ;(360/12*h)+(360/(12*60)*_min_) m=DEG2RAD(n) x=_rx_+sin(m)*ANALOG_H_STICK y=_ry_-cos(m)*ANALOG_H_STICK color $00,$00,$FF line x,y,_rx_,_ry_ return //-------------------------------------- // 分針の描画 //-------------------------------------- #deffunc DrawMin int _rx_,int _ry_,int _min_,int _sec_ n=(6*_min_) ;(360/60*_min_) n=(6*_min_)+(_sec_/10) ;(360/60*_min_)+(360/(60*60)*_sec_) m=DEG2RAD(n) x=_rx_+sin(m)*ANALOG_M_STICK y=_ry_-cos(m)*ANALOG_M_STICK color $00,$FF,$00 line x,y,_rx_,_ry_ return //-------------------------------------- // 秒針の描画 //-------------------------------------- #deffunc DrawSec int _rx_,int _ry_,int _sec_,int _hsec_ n=(6*_sec_) ;(360/60*_sec_) n=(6*_sec_)+(_hsec_*6/1000) ;(360/60*_sec_)+(360/(60*1000)*_hsec_) m=DEG2RAD(n) x=_rx_+sin(m)*ANALOG_S_STICK y=_ry_-cos(m)*ANALOG_S_STICK color $FF,$00,$00 line x,y,_rx_,_ry_ return //-------------------------------------- // 中心ピンの描画 //-------------------------------------- #deffunc DrawPin int _rx_,int _ry_ x1=_rx_-ANALOG_CENTER y1=_ry_-ANALOG_CENTER x2=_rx_+ANALOG_CENTER y2=_ry_+ANALOG_CENTER color $99,$66,$00:circle x1,y1,x2,y2,1 color $66,$33,$00:circle x1,y1,x2,y2,0 return //------------------------------------------------------------------------------ // End of sample59a.hsp //------------------------------------------------------------------------------
スクリーン・ショット
- 青色は時針、緑色は分針、赤色は秒針になります。
- 大きい時計は「07時59分45秒」を表してます。
- 小さい時計は「08時00分50秒」を表してます。
関連記事
- アナログ時計のソース(1)
- アナログ時計のソース(2)
- デジタル時計のソース(1)
- デジタル時計のソース(2)
- ストップウォッチのソース
- タイマーのソース
※コメント投稿者のブログIDはブログ作成者のみに通知されます