check氏> なるほど、ずれた際に同じ分逆方向へずらすのですか。
await命令のほうで実装したのでcheck氏とやり方がずれますが、
一応ずれた分戻す機能の付いたawait命令のスクリプトを張っておきます。
なんちゃん氏> await 0 で基準を設定します。音ゲーのループの前に設置しておいてください。
#module
// 時間を正確に測るためのAPI
#uselib "kernel32.dll"
#func QueryPerformanceFrequency "QueryPerformanceFrequency" var
#func QueryPerformanceCounter "QueryPerformanceCounter" var
#deffunc __init_await
ddim fr, 1
ddim tm, 1
ddim tm2, 1
ddim wt, 1
ddim xtm, 1
ddim xfr, 1
QueryPerformanceFrequency fr
if stat = 0 : return 1
xfr = double(strf("%I64u", fr))
QueryPerformanceCounter tm
xtm = double(strf("%I64u", tm))
return 0
#undef await// 既存のawait命令を消す(いままでのawait命令を使用する場合はawait@hspで呼び出せます)
#deffunc await double wc
wait 0
if wc <= 0.0 {// await 0やawait -1で現在の時刻(?)を基準に設定
QueryPerformanceCounter tm
xtm = double(strf("%I64u", tm))
return
}
wt = xfr * wc / 1000
xtm += wt
repeat
QueryPerformanceCounter tm2
if double(strf("%I64u", tm2)) - xtm >= wt : break
loop
return
#global
__init_await
if stat : dialog "エラー", 1 : end
await 0// 基準設定。これを音ゲーのループの前に置く。