重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C言語(DXlib)での音ゲーについて、当方初心者なので恥ずかしいのですが、ノーツを任意のタイミングで流す方法が分かりません
譜面を作って任意でノーツ生成する方法を教えて下さい...

一定間隔でのノーツの流し方はある程度分かるのですが...(下記です)
//bar生成
while (currentTime >= (60000 / bpm * counter) - 3000) {

bar_f [counter % BAR_SIZE] = true;
bar_c [counter % BAR_SIZE] = 60000 / bpm * counter;

counter++; }



こちらのサイト様を参考にさせていただきました

https://iconcreator.hatenablog.com/entry/2019/02 …

A 回答 (2件)

順序を変える.



「counter % BAR_SIZE の~」についていうと, 「counter % BAR_SIZE」の値は「0 以上 BAR_SIZE 未満」にしかなりません. なので, 例えば BAR_SIZE が 40 なら
0~39
になります. 「60」はなんかの勘違い (か修正ミス) じゃないかな. なお, counter という変数そのものはリセットされず, ず~っと増加し続けます.

で本題に入ると, while の条件式の右辺, 特に
60000 / bpm * counter
の部分が重要で, この値によって出てくるタイミングを制御しています. なので, この値 (もっといえば「counter」の部分の値) を「希望する値」に設定すれば, 「任意のタイミング」で流すことができます.

ただし, 本格的にいじっていこうとするといろいろと変えなければなりません. あたりまえだけど各列を独立に制御しなきゃならないし, そのためには下にあるように 2次元配列にする, あるいはリストにするなどといった工夫が必要です. さらに, 「どのタイミングで出すか」を制御するための情報 (平たくいえば「楽譜」) も, プログラムの中に書くとかなんらかのファイルに保持するとかの形で準備することになります. また, bar_f とか bar_c とかの情報は一体として管理するのが妥当なので, これらをまとめた構造体を作るべきでしょう.

4096分音符とかを作らないことを祈る (謎)
    • good
    • 1
この回答へのお礼

天才やな

ありがとうございます、とりあえずif(counter==x)のベタ書き譜面と4096分音符の作成を試してみます!()

しかし内容が分かりやすい上に回答がびっくりするほど早くて惚れました、かっこよすぎです...///

お礼日時:2019/11/16 01:21

かくにん.



どうしてそれで「一定間隔」になるのかは理解できてる?
    • good
    • 1
この回答へのお礼

がんばります

いつもありがとうございます。
ええと、
whileでノーツ一個あたりのミリ秒を求め、処理のたびに加算されるcounterをかけることで以降のノーツ生成タイミングも計算しているからです


しかし解説のミスだと思い気にしていなかったのですが、
『counter % BAR_SIZEの部分はbarを生成するたびに、0,1,2, ..., 59, 60, 0, 1, ...と変化していきます。こうすることで、BAR_SIZEが40しかなくてもずっとbarを生成し続けることができます。』
というのが理解できていませんでした。
BAR_SIZEが40ならcounterも40でリセットされるはず、60まで変化している理由が不明です、もし良ければの話ですがここもご教授願えれば幸いです

お礼日時:2019/11/16 00:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!