トピック
DieMatsmot DieMatsmot

リズムゲームの音ズレ、というかテンポズレ

久しぶりにプチコンをいじり、何か音ゲを作りたいと思いましてですね。 自分なりにプログラムを考えて書いてみたもののしばらく経つと音ズレが起こってしまう。 これの原因はVSYNCによるものなのか(VSYNCは音ゲに使えるほど正確なものではないのか?)、あるいは計算過程に小数点の切り捨てを含めているのがいけないのか。 3DSがネットにつながってないのでソースをお見せできんのが残念ですが、推測も結構ですので改善のアドバイスを頂きたいです。
2そうだね
プレイ済み
返信[1]
親投稿
TTcreation TTSOFT
同じ問題で悩んで諦めた人です。 BGMの内部変数を切り替えて クロックをとってはどうでしょうか
2そうだね
プレイ済み
返信[2]
親投稿
DieMatsmot DieMatsmot
内部変数使ったことないんだよなぁ。 かの有名なおもちつきの作者さんは内部変数を使ってたな。 青鳥で聞いてみることにします。(聞ければ)
2そうだね
プレイ済み
返信[3]
親投稿
スー thanks_0u0
私が音ゲー作ったときもハマりましたー( ´ 〜 ` ) VSYNCを1/60秒で想定するとmmlとズレちゃうんですよね。ただゲームの速度はどうしてもVSYNC依存になりますので、mml同士ならズレないでしょ、ってことで内部変数を使って再生位置を補正していました。 BGMSET 255,"T"+STR$(T)+"[$0=0R4$0=1R4]" みたいなmmlを曲と同時に流して、毎フレームBGMVARを確認、想定したフレームとズレてたら補正、みたいな感じだったような。。。 確かフレーム数に定数をかける方法でも計算できたような。。。myu314さんが定数を出してた気がするのですが。。。うーん、曖昧な情報ですみませんー。
2そうだね
プレイ済み
返信[4]
親投稿
SEKI22 rcftgrsfrr578
3DSが繋がっていないならスマホやPCですか?
0そうだね
プレイ済み
返信[5]
親投稿
僕も音ゲーを作っているのですが、元々のBPMに特定の値を掛けて、試運転を繰り返しつつ最適な値を見つける、という原始的な方法をとりました。最終的にBPMに1.02...程度の数を掛けた上で譜面速度を計算させることで無理やり音ズレを解消しました。
1そうだね
プレイ済み
返信[6]
親投稿
れい rei-nntnd
vsyncは1/60じゃないし MMLの120テンポも1/2じゃないので ちゃんと測って うまく合わせないとだめだよ
4そうだね
プレイ済み
返信[7]
親投稿
DieMatsmot DieMatsmot
れいさんの言うとおりのようですね...。 MMLのテンポは可変できないのでなんとかして譜面側に補正をかけてみることにします。 すーさんのやりかたを参考にさせてもらいますね。 (コーンクリームポテトさんのやり方だと譜面作成に余計な時間がかかってしまうので。;)
1そうだね
プレイ済み
返信[8]
親投稿
スー thanks_0u0
れいさんのわかりやすい解説をサルベージできました!mmlではなくTIME$との関連でしたけど(・u・) 解説ではVSYNC1が約0.016715秒、ということでした。mmlが正確(0.016666...秒)であれば、計算機さん曰く定数は大体1.0029くらい?譜面データからノーツ生成フレームを計算するときにこの定数で割っておけば多分合う、はず??若しくはフレームカウントに定数をかけるか。 でもコーンクリームポテトさんの定数とかなり違うのが気になるところです。。mmlも1/60じゃないのかなぁ。うーん。 ひとまずれいさんのコメントのURLだけ置いときますねー。 https://miiverse.nintendo.net/replies/AYMHAAACAAADVHkgWMTkxg
2そうだね
プレイ済み
返信[9]
親投稿
スー thanks_0u0
定数を使う方法でも大体合いましたー。でもやっぱりmml内部変数の方が曲に合うみたいです。 定数使うと「なんかスコア出ないなー、うまくハマらないなー」みたいな体感でした(・u・) まだ微妙ーーーな誤差があるのでしょうか。 結果、内部変数がオススメです!
1そうだね
プレイ済み
返信[10]
親投稿
myu314 myu314
あら懐かしい話題が:) 結論的には内部変数を使うで良いと思いますー。テンポチェンジとか楽だし。 3DSのリフレッシュレートはどっかのサイトだかフォーラムで見かけたけど、59.834Hzらしいです。で、MML内部変数とMAINCNTにらめっこしてリフレッシュレート調べたところ大体59.8312Hzくらい。同じプログラムをBIGでも試したところ59.9399Hzくらい。BIGは多分59.94Hzだろうから大体正しそう。これはMML内部変数使ってだした数値だからそれなりに合うんじゃないかなぁ。一応3DSは旧と新で大体同じ値だったのは確認済み。両機種対応する場合はご注意を。
2そうだね
プレイ済み
返信[11]
親投稿
myu314 myu314
あとプチコン音ゲーで気をつけるのは、 - BGM系の命令は次のフレーム開始時に実行される - でもWAITしてすぐは、まだ曲が始まってなくて内部変数取れない場合がある - BGM系の命令は1フレームで256回まで。超えると失敗してうまく動かない(エラーにもならない) あたりかな。
2そうだね
プレイ済み
返信[12]
親投稿
DieMatsmot DieMatsmot
僅かな誤差が気になってきますね... BGM系の命令が次フレームからというのは頭に入れておきます。 もしそこでつまづいたら定数かけることにします。
2そうだね
プレイ済み