ワンドロは1時間で絵を完成させるということで、1時間ちょうどをはかり、それをtwitterに開始時間と終了時間をツイートできるようにしたプログラムを作ってみた。その中でいろいろとhspのQ&Aを参考にさせていただきました。
将来的にはspaceXっぽくしてみたりいろいろ改造してみようかなと思います。
HSPソースを公開します。
;引用・参考文献
;http://hsp.tv/play/pforum.php?mode=pastwch&num=60593
;https://hsp.tv/play/pforum.php?mode=all&num=91464
;http://hsp.tv/play/pforum.php?mode=pastwch&num=88533
#include "hsp3utf.as"
#include "hsp3util.as" ; gettimestr,getdatestrを使うため
#module
#define global now_ut time2ut(gettime(0),gettime(1),gettime(3),gettime(4),gettime(5),gettime(6))
#defcfunc urlencode str p1
teext=p1
sdim texten,256
sdim text_en,256
repeat strlen(teext)
text_en=peek(teext,cnt)
texten+=strf("%%%02x",text_en)
loop
return texten
#defcfunc time2ut int _y,int _m,int d,int _h,int _mi,int _s
y=_y
m=_m-2
if m<=0 : m+=12 : y--
days=365*y + y/4 + y/400 - y/100 + 30*m+59*m/100 + d - 678912 - 40587
//↑指定した日の修正ユリウス日をフリーゲルの公式から求め、
//さらに1970年1月1日の修正ユリウス日である40587を引く。
h=_h-9 //指定した時から日本とUTCの時差である9を引く。
mi=_mi-0 //日本に関して言えば、分の修正はなし。
s=_s+0 //閏秒を考慮しない場合。考慮する場合は↓のコメントアウトを外す。
//s=_s+37
return days*86400 + h*3600 + mi*60 + s
#deffunc ut2time var ry,var rm,var rd,var rh,var rmi,var rs,int _ut
ut=_ut-0 //閏秒を考慮しない場合。考慮する場合は↓のコメントアウトを外す。
//ut=_ut-37
add_h=9 //日本とUTCとの時差
add_m=0 //日本とUTCとの時差(分)
ut+=add_h*3600+add_m*60
days=ut/86400 : a=ut\86400
rh=a/3600 : a\=3600
rmi=a/60 : rs=a\60
//
n=(days+40587)+678881 //(days+40587)で修正ユリウス日に変換。以下、フリーゲルの公式で日付を求める。
a=3+4*((4*(n+1)/146097+1)*3/4+n)
b=(a\1461)/4*5+2
ry=a/1461
rm=b/153+3
rd=(b\153)/5+1
if rm>=13 : rm-=12 : ry++
return
#global
screen 0,320,80 ; 画面サイズ指定
sysfont 12
font msgothic,30,1 ; 文字サイズを指定
objmode 0,1
onexit gosub *areyouquit
t1="":t2=""
time_start=0
time_end=0
mode=0
*noonedraw
cls
pos 200,0:button gosub "開始",*onedraw_start
pos 200,40:button gosub "終了",*onedraw_end
now=now_ut
timechange=1
*tmprt
gettimestr t1 ; 時刻を取得
getdatestr t2 ; 日付を取得
if (now_ut!now) :
now=now_ut:timechange=1
if timechange=1 {
redraw 0
color 255,255,255:boxf 0,0,180,80 ; 白い色で背景を塗りつぶす
color 0,0,0 ; 文字の色
font msgothic,30,1 ; 文字サイズを指定
pos 0,0:mes t1 ; 時刻を表示
if mode=0 : pos 0,40:mes t2 : else : {
boxf 0,0,0:boxf 0,40,180,80
min=60*60-(now_ut-time_start)
if min>0 { y=(min*180/60/60)
color 00,100,255:boxf 0,40,y,80
pos 0,40:color 255,255,255:mes strf("%02d:%02d",int(min/60),int(min\60))
} else {
color 170,0,0:boxf 0,40,180,80
pos 0,40:color 255,255,255:mes strf("%02d:%02d",int(abs(min)/60),int(abs(min)\60))
}
} ; 日付を表示
redraw 1
}
await 1 ; 1秒ウエイトする
timechange=0
goto *tmprt ; 無限ループ
*onedraw_start
if mode=1 : return
mode=1
time_start=now_ut
return
*onedraw_end
if mode=0 : return
mode=0
time_end=now_ut
times=((60*60)-(time_end-time_start))/60
ut2time y,m,d,h,mi,s,time_start
mtime=strf("%02d:%02d",h,mi)+"~"
ut2time y,m,d,h,mi,s,time_end
mtime+strf("%02d:%02d",h,mi)
if times<0 : mtime+"(+"+abs(times)+")"
dialog mtime
exec "https://twitter.com/share?text="+urlencode(mtime),16
return
*areyouquit
if mode=1 : dialog "終了できませんでした" : return
end
return