HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0903
SqOc処理に関係なく精密な時間を5未解決


SqOc

リンク

2015/9/3(Thu) 02:36:15|NO.71280

いまだに音ゲーを作っています。
プログラムのほうは大体できたのですが、譜面を作ってやってみると、
正しくbpmを設定しても、譜面がいくつかくるとだんだんスピードが落ちてしまいます。
現在、timeGetTimeを使っていて、


//次のフレームにいく時 nowtime = timeGetTime() endtime=(nowtime-backtime)/1 if endtime>=beat{ backtime = timeGetTime() }

一部抜き出すと、こんな感じで、beatを設定してやっているのですが、やはり途中で変わってしまいます。



#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" beat=300 backtime = timeGetTime() repeat //次のフレームにいく時 nowtime = timeGetTime() endtime=(nowtime-backtime)/1 if endtime>=beat{ mes "a" backtime = timeGetTime() } await 1 loop

この程度なら問題はないのですが、ゲームに組み込むと誤差が出てしまいます。
何かより正確な方法を教えてください!

回答お願いします!!



この記事に返信する


kanamaru

リンク

2015/9/3(Thu) 08:33:54|NO.71286

settimerを使うのはどうでしょうか?
http://chokuto.ifdef.jp/advanced/usertimer.html



Velgail

リンク

2015/9/3(Thu) 12:36:12|NO.71289


if endtime>=beat{ mes "a" wait 1//処理に10ms掛かったとする。 backtime = timeGetTime() }
なんとなくここに意図と違うものを見つけた気がする。
backtime=nowtime
にしたらどうなるだろう?



SqOc

リンク

2015/9/3(Thu) 16:26:12|NO.71290

kanamaruありがとうございます。
ですが、記事内に、

タイマーを使用する場合の注意点
ウィンドウタイマーを使用する場合には注意が必要です。
1つは、ウィンドウタイマーはそれほど高精度ではないということです。

と書かれていましたorz



暇人

リンク

2015/9/3(Thu) 20:24:12|NO.71295

原因はNO.71289で書かれてるのも含め
beatを超えた分が次に持ち越されずに
0からになってるのでずれてく

解決策は色々あると思うけど(NO.71289の解決策でもずれていくのは無くなる)
経過時間か何かでスタートからの進行度は必要になると思う

#uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" beat=300 nextbeat=beat starttime = timeGetTime() repeat elapsedtime=timeGetTime()-starttime //経過時間(ms) if elapsedtime>=nextbeat { nextbeat+beat mes "a" } await 16 loop


>正しくbpmを設定しても、譜面がいくつかくるとだんだんスピードが落ちてしまいます。
何か別の問題もありそう・・・



にゃんちゃん

リンク

2015/9/5(Sat) 11:56:55|NO.71357

タイマーを使うのもいいですが、BGMファイルのサンプル数を使ってモニターするのはどうでしょうか。
具体的には、波形編集ソフトなどで1拍分のサンプル数を計測しておき、それを*2とか/2とかにして好きな時間をカウントします。
こうすれば、タイマーの制度に困ることもないですし、処理落ちしても譜面が後ろにどんどんずれたりしなくなります。



ONION software Copyright 1997-2021(c) All rights reserved.