|
現実世界の10倍の速さで時が流れる時計を作りたいのですが、 秒/分/時の繰り上がりが正常でないようで、助言を賜りたく参りました。
概要 0.現実世界の10倍の速さで時が流れる 1.1日は24時間 2.1時間は60分 3.1分間は60秒 4.日本時間との時差がある複数の環境でスクリプトを実行しても同じ時刻を表示させたい (手動でもいいので調整したい)
表示は後程作ろうと、現段階ではPRINTをWHILEループで表示させて確認しています。
〜〜〜 WHILE !GETKEYSTATE(VK_ESC)
//2000年1月1日からの秒数 DIM REALTIME = GETTIME() DIM FICTIME = REALTIME * 10 //現実時間の秒数を10倍
DIM SECONDS = INT(FICTIME MOD 60) //秒数 DIM MINUTES = INT(FICTIME / 60 MOD 60) //分数 DIM HOURS = INT(FICTIME / (60 * 60 ) MOD 24) //時数
PRINT HOURS +":"+ MINUTES +":"+ SECONDS
WEND
〜〜〜
問題点 1.30秒の時点で分数が増加し、60で増加しない 2.30分の時点で時数が増加し、60で増加しない 3.概要4.について全く見当がつかない
概要4については、5行目のREALTIME DIM FICTIME = (REALTIME + ( 任意の時差 * 60 * 60 )) * 10 かなと思っているのですが、時計自体が正常に表示できていない為、 間違っている可能性が高く、着手できていません…。
|
No.4007 2017/05/23(Tue) 09:24:43
|
☆ Re: 現実の10倍の速さで動く仮想の時計を表示させたい / しゅん |
|
|
// 30秒や30分で増加するのは、丸め誤差です。割り算にINTつけて // ある基準時点を設け、そこから10倍で時が流れるのであれば、 // 現時刻から一意に定まるので、概要4の考慮は不要かと思います。 // そもそも一日は86400秒なので、86400の余りから計算しないとおかしいはずです。
// いろいろ混乱されていると思います。 // 10倍で流れる、ということは、10倍の1秒は、実時間の0.1秒。 // 10倍の1分は、実時間の6秒、ということで良いでしょうか?
// UWSCにはSETTIME的な関数はないので、javascript利用で、2000/1/1を基準にすると以下の通りです
DIM date, sc = CREATEOLEOBJ("ScriptControl") sc.Language = "javascript" sc.ExecuteStatement("function getTime(t,o){b=new Date(o);return new Date(((new Date()).getTime()-b.getTime())*t+b.getTime())}")
WHILE !GETKEYSTATE(VK_ESC) date = sc.Run("getTime", 10, "2000/01/01") PRINT date.toString() SLEEP(1) WEND
// 1秒SLEEPしているので、10倍時間で約10秒毎にPRINTされます。 // 表示フォーマットが気に入らない場合は、javascriptのDateオブジェクトについて調べてください。
// 追記:そうかGETTIMEでできたんでした、、、。
|
No.4010 2017/05/23(Tue) 12:20:58
|
|
☆ Re: 現実の10倍の速さで動く仮想の時計を表示させたい / satocha |
|
|
一日が何秒で繰り上がりがどう、出力文字の加工はどう…という難しくて面倒なことは全部コンピューターにやってもらったほうが得策です。われわれはその結果だけいただけばばいい。
というわけで、powershellというか.NETのdatetimeオブジェクトに計算させてみました。
自分でやることは、datetimeオブジェクトが理解できる時刻文字列をUWSCで組み立てるだけ。
fukidasi( "終了はCTRL+Q+左クリック" ) //開始時刻を設定 gettime() //.NETで理解できる日付文字列を組み立てる startstr =g_time_yy4 + "/" + g_time_mm2 + "/" + g_time_dd2 + " " + g_time_hh2 + ":" + g_time_nn2 + ":" + g_time_ss2 + "." + g_time_zz2 thread clock( 1, startstr, 30, 70 ) thread clock( 10, startstr, 30, 170 ) repeat //fukidasiウインドウを前面に ctrlwin(getid(get_fukidasi_win),activate) until getKeyState( vk_ctrl ) and getKeyState( vk_q ) and getKeyState( vk_lbutton ) exitexit
procedure clock( n, startstr, x, y ) //n倍速の時計表示 repeat str =n + "倍速:" + trim( powershell( replace( replace( ps, "<STP>", startstr ), "<NTH>", n ) ) ) fukidasi( str, x, y ) sleep( 0.01 ) until false fend
textblock ps #UWSCで設定した開始時刻 $start =[datetime]"<STP>" #現在時 $now =date #開始時と現在時の差を取る $diffTicks =[INT64]($now.subtract($start).ticks) #n倍する $nTicks =$diffTicks * <NTH> #開始時+n倍時差を計算すると勝手に時刻文字列が得られる $start.addTicks([INT64]$nTicks) endtextblock
|
No.4011 2017/05/23(Tue) 15:42:11
|
|
☆ Re: 現実の10倍の速さで動く仮想の時計を表示させたい / miles |
|
|
//GETTIME関数を使いました。 x=10 // 倍数をセット WHILE !GETKEYSTATE(VK_ESC) DIM REALTIME = GETTIME() DIM FICTIME = REALTIME * x //現実時間の秒数をx倍 GETTIME((FICTIME-REALTIME)/(60*60*24)) balloon(G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2,,250) SLEEP(1) WEND
// 追記 基準日を指定した方がわかりやすい。 // GETTIME((FICTIME-REALTIME)/(60*60*24)) GETTIME(FICTIME/(60*60*24), "2000/01/01 00:00:00")
|
No.4012 2017/05/23(Tue) 16:06:09
|
|
☆ Re: 現実の10倍の速さで動く仮想の時計を表示させたい / しろまさ |
|
|
DIM SECONDS = FICTIME MOD 60 //秒数 DIM MINUTES = INT(FICTIME / 60) MOD 60 //分数 DIM HOURS = INT(FICTIME / (60 * 60)) MOD 24 //時数
Intの括弧の位置がおかしいだけだと思います。
|
No.4013 2017/05/23(Tue) 16:22:34
|
|
☆ Re: 現実の10倍の速さで動く仮想の時計を表示させたい / しろまさ |
|
|
// 概要4対応です。
Dim gtS = GetTime(0, "2001/01/01 12:00:00") // 2000年1月1日 12:00:00 からの秒数 Dim gtN = GetTime() Dim dif, gt10, s, n, h, d, dn = 60, dh = dn * 60, dd = dh * 24 WHILE !GETKEYSTATE(VK_ESC) dif = GETTIME() - gtN gt10 = dif * 10 + gtS //現実時間の秒数を10倍 s = gt10 MOD 60 //秒数 n = INT(gt10 / dn) MOD 60 //分数 h = INT(gt10 / dh) MOD 24 //時数 // d = INT(gt10 / dd) MOD ?? //日数 Fukidasi(h +":"+ n +":"+ s) WEND
// NIBさんベースで作りましたがこれだと日を出すのが難しそうですね(月末判断)
|
No.4014 2017/05/23(Tue) 17:00:53
|
|
☆ Re: 現実の10倍の速さで動く仮想の時計を表示させたい / NIB |
|
|
拙い質問に迅速に答えていただき、本当に有難うございます。 お陰様で、暗雲から脱出できました。
言葉足らずで申し訳ありません。 スクリプト実行時の時間から時差を開始ではなく、実行時以外でも GETTIME()で得られる秒数をもとに常に時間は流れているというものと書くべきでした。 複数人が不特定のタイミングで使うことを想定しています。
沢山の助言を頂いたもの、拙には未だ高度すぎる等、メンテナンス性を鑑み、 milesさんの記述+追記が時差の手動調整等で最も理想形でしたので、これを元に制作を進めたいと思います。
今回教えていただいた皆様の、高度と感じた記述の数々も理解できるよう更に勉強致します。 一人では永遠に抜け出せないままでした。重ね重ね本当に有難うございました。
|
No.4019 2017/05/24(Wed) 09:48:24
|
|