私も今作っているモジュールに同様の課題があり試行錯誤しています。
「waitした時の時間を記録しておき、onkey等によってwait抜けしたとき残ってる時間はないか計算して残ってたらその分再waitする」
というアプローチをとってみました。
#define ctype _nowTime (gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7)) //標準命令で完結したかったためgettimeを使用
#define waiton(%1) :\
_waitTime_ = _nowTime() :\
while 1 :\
_nokoriTime_=%1-(_nowTime() - _waitTime_)/10 :\
if(%1<_nokoriTime_){ _nokoriTime_-=24*360000 : _waitTime_-=24*360000 } :\
if(_nokoriTime_<=0){ _break } :\
wait _nokoriTime_ :\
wend :\
_awaitTime_=_nowTime()
#define awaiton(%1) :\
if(_awaitTime_=0){ _awaitTime_ = _nowTime() } :\
while 1 :\
_nokoriTime_=%1-(_nowTime() - _awaitTime_) :\
if(%1<_nokoriTime_){ _nokoriTime_-=24*3600000 : _awaitTime_-=24*3600000 }:\
if(_nokoriTime_<=0){ _break } :\
await _nokoriTime_ :\
wend :\
_awaitTime_=_nowTime()
//以下、テスト
onclick gosub *click
onkey gosub *key
sysfont 17
repeat ,1
awaiton 1000
ntime = _nowTime()
mes "" :pos 0,
mes strf("%02d: %d(%d)", cnt, ntime, ntime-mae_ntime ),1
mae_ntime = ntime
loop
stop
*click
mes " click", 1
return
*key
mes " key",1
return
うーん、なんとなく問題無いように思うのですがどうでしょうか。
精度的なところは、、、テスト部分のawaitonをawaitにしてもほとんど違いが無いから良い(?)のかな・・・。(その時は当然keyもclickもしないでください)
有識者の判断が必要かもしれません。
whileを使ってるのは#defineのユニークラベル名を利用したgotoループを簡単に使うためです。
詳細はF1ヘルプ(#define)とhspdef.as(while,wend,_break)を参照してください。
また、#defineを利用しておりコメントを入れられませんでした。
各行コメント載せ版を下に書いてみたのでスクリプトの説明はこちらを参照ください。
#define waiton(%1) :\
_waitTime_ = _nowTime():/*waitに入る前に現在の時間を記憶する。*/\
while 1 :/* ユニークラベル名gotoを用いたループにwhileを利用 */\
_nokoriTime_=%1-(_nowTime() - _waitTime_)/10 :/*onKey等によってwaitを抜けたとき戻ってくる。残りを計算して再waitする。*/\
if(%1<_nokoriTime_){ _nokoriTime_-=24*360000 : _waitTime_-=24*360000 }:/* 日をまたいで_nowTimeが0に戻った時補正する。 */\
if(_nokoriTime_<=0){ _break } :/* waitで指定した時間経過していたらループから抜ける */\
wait _nokoriTime_ :/* 1回目は指定した時間waitして、2回目以降は残り時間waitさせる。(例:wait 100 →[0.2秒でonkey抜け]→ wait 80) */\
wend :\
_awaitTime_=_nowTime() /*awaitのためにwait抜けした時間を記憶*/