>音楽とのシンクロってどうやってるんですか?!
小節やBPMなどの概念で考えるのがそもそも面倒なので、
何小節何拍目に音符を置くというのではなく譜面作成の時点でミリ秒単位に変換しています。
実際にはソフランの実装でもっと複雑ですが、大まかな流れは
音符の位置y = 判定ライン - 音符を判定するタイミング + プレー開始からの経過時間
プレー開始からの経過時間は音源の再生時間でもあるので、
dmmstatやBASS.dllであればBASS_ChannelGetPositionで取得できます。
SapphireではDXライブラリのGetNowCountでプレー開始のタイミングでの値と現在の値の差分を取って経過時間を算出しています。
↓質素ですが、Sapphireとだいたい同じ仕組みです。↓
dim humen
ddim hispeed
dim time
dim drawpos
sdim judge
dim key:dim bfkey
dim near
humen=2000,3000,4000,5000,6000,7000
hispeed=0.4 //ミリ秒単位そのままだと速すぎなので
dim humen_judge,length(humen)
repeat
getkey key,32
redraw 0
color:boxf
near=-1
foreach humen
drawpos=480-int(double(humen(cnt))*hispeed)+int(double(time)*hispeed)-20
color 255,255,255:boxf 100,drawpos,150,drawpos+20
if key==1&bfkey==0 {
if near==-1 :near=0
if (abs(time-humen(near)) > abs(time-humen(cnt)))&humen_judge(cnt)==0 :near=cnt
}
loop
if near!-1 {
if abs(time-humen(near)) < 50 {
humen_judge(near)=1
judge="OK! ±"+abs(time-humen(near))+"ms"
}
}
pos 170,400:mes judge
redraw 1
await 1000/60
time+1000/60
bfkey=key
loop