まず基準となる時間を決める
BPMとかtempoを使った方が曲に合わせ易い
bpm=80 //一分間の拍数(4分音符の数)
tim_beat=1000.0*60.0/bpm //一拍(4分音符)の時間(ms)
beat_max=4 //Just_pos迄を何拍分にするか
Just_pos=550.0 //ここをボタンを押すジャストタイミングを表す座標とする
Just_tim=tim_beat*beat_max //発生からの経過時間のジャストタイミングを表すタイム(beat_maxが4なら4拍分の時間)
notes_speed=Just_pos/Just_tim //速度(beat_max拍分の時間経過でJust_posに到達する速度)
tim_beatが基準の時間になる
スタートからの経過時間でtim_beat毎に●を発生させれば
1拍毎に発生させられる
1泊より短い間隔で発生させたい場合はtim_beatを半分(8分音符相当)にしたりする
移動速度は発生からの経過時間にnotes_speedを掛ければbpmに合わせた速度で進む
beat_maxを4にしてる場合は4拍でJust_posに到達する
複数●を表示するサンプル
#include "d3m.hsp" //d3timer()を使うので
//0は前の音符の長さの休符(最初は4分休符)、1は4分音符の4倍の長さ、2は2分音符、4は4分音符、8は8分音符、9は16分音符
Sheet="44449990999088008800224444088880440440"
notes_length=0.0,4.0,2.0,1.0,1.0,1.0,1.0,1.0,0.5,0.25 //音符のtim_beatに掛ける倍率
bpm=80 //一分間の拍数(4分音符の数)
tim_beat=1000.0*60.0/bpm //一拍(4分音符)の時間(ms)
beat_max=4 //Just_pos迄を何拍分にするか
Just_pos=550.0 //ここをボタンを押すジャストタイミングを表す座標とする
Just_tim=tim_beat*beat_max //発生からの経過時間のジャストタイミングを表すタイム(beat_maxが4なら4拍分の時間)
notes_speed=Just_pos/Just_tim //速度(beat_max拍分の時間経過でJust_posに到達する速度)
//文字列データに0以外があったら発生時間を配列に全て登録
notes_max=0
tim_index=0.0
ddim next_tim,strlen(Sheet)
tim_add=tim_beat //初回休符の長さ
repeat strlen(Sheet)
notes_dat = int(strmid(Sheet,cnt,1))
if notes_dat ! 0 {
notes_tim(notes_max)=tim_index //発生時間を登録
notes_max++
tim_add=tim_beat*notes_length(notes_dat) //今回登録した物の長さ
}
tim_index+tim_add //次の発生時間
loop
notes_index=0 //これを開始要素数として発生時間の検索をする
tim_s=d3timer() //スタート時間
*main
redraw 0
color 255,255,255
boxf
color
pos Just_pos,240
mes "○"
tim_next=d3timer()-tim_s //経過時間
stick k
repeat notes_max-notes_index,notes_index
if notes_tim(cnt)<=tim_next {//経過時間が発生時間以上
notes_elapsed_time=(tim_next-notes_tim(cnt)) //経過時間から発生時間を引いて発生からの経過時間にする(この結果とJust_timを比較すればタイミングでの処理が出来る)
notes_pos=notes_speed*notes_elapsed_time //notes_elapsed_timeに速度を掛けて現在の座標にする
if notes_pos>(Just_pos+50) {//Just_posより50ドット超えたらMissとして処理
notes_index=cnt+1 //次回から次の要素数からループ処理
hit=-1
hit_pos=notes_pos //現在の座標を保存
}else{//ここに来る●だけ判定する
//キーが押されてたらnotes_posとJust_posを比較して差によってGOODなどの処理を別ける(これは座標での処理になるのでテンポが遅いほど難易度が下がる)
pos notes_pos,240
color
mes "●"
}
}else{//経過時間以内の発生時間登録が無かった
break
}
loop
if hit=-1 {
Misstim=tim_next+100 //経過時間にMiss表示時間を足して、Miss表示終了時間にする
hit=0
}
if tim_next<Misstim {//経過時間がMiss表示終了時間以上になるまで下の処理をする
pos hit_pos,240-30
color 255
mes "Miss"
}
await 16
redraw 1
goto *main
判定は座標でするかタイミングでするかで難易度等に違いが出ると思う