トピック
受付中
たくみ somsss

譜面を流す

太鼓の達人のようなゲームを作っています。 譜面を流したいのですが、どうすればよいですか?
1そうだね
プレイ済み
返信[1]
親投稿
たくみ somsss
Dataを使いますか?
0そうだね
プレイ済み
返信[2]
親投稿
譜面を改編しやすくなるのでその方がいいかと。 あとREADも必要ですね。
1そうだね
プレイ済み
返信[3]
親投稿
たくみ somsss
Read って読むだけに使う訳じゃないんですね。
0そうだね
プレイ済み
返信[4]
親投稿
たくみ somsss
どんな使い方をしますか?
0そうだね
プレイ済み
返信[5]
親投稿
READはDATAとセットで使います。 このようにREADはDATAの値を読み取ってくれます。 ACLS WHILE 1 READ D$ IF D$==""THEN END ?D$ WEND DATA "データ1","でーた2","DATA3","次でおわるよ",""
0そうだね
プレイ済み
返信[6]
親投稿
たくみ somsss
できました。 でもこれでどうやって、譜面を作り動かすのですか?
0そうだね
プレイ済み
返信[7]
親投稿
たくみ somsss
一応、あるゲームと同じ形で書いてます。できればこれ使いたいです。
0そうだね
プレイ済み
返信[8]
親投稿
すけさん ats8521
↑さいたま2000w
0そうだね
プレイ済み
返信[9]
親投稿
たくみ somsss
はい。さいたま2000安定しないので、練習用に。
0そうだね
プレイ済み
返信[10]
親投稿
たくみ somsss
もしかしてscrollつかう?
0そうだね
プレイ済み
返信[11]
親投稿
SCROOLは全体が動いてしまうので、文字列でPRINTするのが自分はいいですね。 まず譜面データをひとつの文字列変数に連結して、そのあとMID$()を使って画面に表示するぶんだけとって、PRINT&LOCATEで表示という感じです。 自分の中では。
0そうだね
プレイ済み
返信[12]
親投稿
補足 MID$を使ってというのは、 PRINT MID$(譜面データ,経過時間,画面に表示する分の文字数) ということです。
0そうだね
プレイ済み
返信[13]
親投稿
たくみ somsss
文字データをsprite にして流したいのですが、その場合も同様ですか?
0そうだね
プレイ済み
返信[14]
親投稿
コンソールだと思っていました。すみません。 スプライトの場合は話が違います。 まずデータをひとつの文字列変数に入れ(ここは同じ)、文字列変数の(経過時間)文字目を取得して、それがドンかカッだったら、SPUSED()を使いSPSETし、画面外から流れるようにSPANIMをするばいいはずです。
0そうだね
プレイ済み
返信[15]
親投稿
たくみ somsss
すみません文字列変数に入れるとか経過時間とかがよくわかりません。 分かりやすく説明していただけませんか?
0そうだね
プレイ済み
返信[16]
親投稿
たくみ somsss
データを文字列変数に入れるのは read a$ でokですか?
0そうだね
プレイ済み
返信[17]
親投稿
分かりにくい説明ごめんなさい。 それは、DATA "(譜面データ)"を連ねて書いていたら、その複数のデータを全てまとめて一つの文字列変数(なんちゃら$)に事前に入れるということです。 そのあとメインループを作り、まずデータのn文字目を取得します。(NOTE$=A$[I] INC I みたいに。) ちなみにA$[n]とすると、A$のn文字目が取得できます。 その文字がドンとカッのどっちかをIFで判断して、SPSET ドンかカッの定義番号 OUT 管理番号 とすれば自動的に未使用のSPを定義してくれます。 そして、SPANIMを右の画面外から左に流れていくようにすれば出来ます。
0そうだね
プレイ済み
返信[18]
親投稿
補足です。 経過時間というのは、ループの中に1づつ増えていく変数を指しています。 I=I+1とかINC TIMEとか変数名は分かりやすい方でどうぞ。 分からないことがあったら質問どうぞ。
0そうだね
プレイ済み
返信[19]
親投稿
たくみ somsss
データをなんちゃら$に入れるのは、readを使いますよね?
1そうだね
プレイ済み
返信[20]
親投稿
たくみ somsss
エラーになってしまいますがどこがダメなのか分かりません。Subscript out of rangeです。
0そうだね
プレイ済み
返信[21]
親投稿
すみません少し抜けていました。 そのエラーはLが文字列の文字数を越えてしまったからです。 なので、譜面を終了するプログラムが必要です。 なので、データの最後にお好きな文字をいれ、IF文で終わらせましょう。 あと、それだと曲が一瞬で終わってしまうので、待つプログラムも必要でした。 それはFORとVSYNCを使えばできます。
0そうだね
プレイ済み
返信[22]
親投稿
たくみ somsss
同じエラーが起きてしまうのですが、どこが違うのでしょうか?
0そうだね
プレイ済み
返信[23]
親投稿
同じエラーは出ないはずですが…。 自分ではわかりません。すみません。 とりあえず IF NOTE$=="E" THEN END を IF NOTE$=="E"THEN END か IF NOTE$=="E"THEN END ENDIF としましょう。 それではENDIFが無く、エラーになります。
0そうだね
プレイ済み
返信[24]
親投稿
たくみ somsss
ENDIFの位置をかえて、あと色々やりました。
0そうだね
プレイ済み
返信[25]
親投稿
たくみ somsss
最初のデータの行しか読み込めないのですが、何故でしょう?
0そうだね
プレイ済み
返信[26]
親投稿
たくみ somsss
最初の方で繰り返しREADしているのですが...
0そうだね
プレイ済み
返信[27]
親投稿
RESTONEをループの外に置くようにしてください。 RESTONEはあくまでデータの場所を指定する命令なので、ループの中に置くと、データの先頭しか読み取れません。
0そうだね
プレイ済み
返信[28]
親投稿
たくみ somsss
直しました。先端しか読み取れないのは直ったのですが、 今度は最後の音符しか流れてくれません...
0そうだね
プレイ済み
返信[29]
親投稿
説明不足でした。すみません。 READはデータを読み取るだけで文字列をくっつけるのはしてくれないので、 READ A$のところを READ 好きな変数$ A$=A$+好きな変数$ とすれば大丈夫です。
0そうだね
プレイ済み
返信[30]
親投稿
たくみ somsss
ありがとうございます。流せました! 申し訳ないのですが、もう少し付き合っていただけますか? 今僕がやっているのは、gosubでサブルーチンを呼び出して、そこで譜面を流しているのですが、譜面を流している間にボタンの判定ができません。どうすればよいでしょうか?(多分曲がすぐに終わってしまわないようにVSYNC ループを置いているせいだと思います。)
0そうだね
プレイ済み
返信[31]
親投稿
VSYNCループの中でボタンを取得すればいいと思います。
0そうだね
プレイ済み
返信[32]
親投稿
たくみ somsss
あと、工夫して複数の音符を一度に出せるようにしたのですが、すぐエラーになります。out of ringe だったような気がします。
0そうだね
プレイ済み
返信[33]
親投稿
たくみ somsss
やっぱりそうなりますかー。もっと省略したいのですがねー。
0そうだね
プレイ済み
返信[34]
親投稿
SPSET 定義番号 OUT 変数 とすれば、自動で使っていない番号のSPを出してくれます。 変数には管理番号が入ります。 これをFORで活用すれば大丈夫です。
0そうだね
プレイ済み
返信[35]
親投稿
たくみ somsss
あれ...すみません。FORで、活用が分からなかったので、とりあえず、変えてみました。エラーが起きました。 すみません! また教えてください。何度もすみません!
0そうだね
プレイ済み
返信[36]
親投稿
それは多分SPの数がいっぱいになったからでしょう。 なので使い終わったSPを消していくようにすればいいのです。 SPUSEDとSPCLRとSPCHR()を使ってできます。 SPCHR()はアニメーション状態を取得する関数ですが、簡単にいうとその番号のSPが動いてるか動いてないか答えてくれるものです。 位置を変えているのであれば、SPCHR(管理番号)==#CHRXYで判断できます。 SPUSED()はそのSPを使っているかを答えてくれるものです。 SPCLRはSPを消してくれるものです。 これらとFORで全SPを調べていけばいいのです。
0そうだね
プレイ済み
返信[37]
親投稿
たくみ somsss
すみません!プログラムに変えていただけませんか? #CHRXY のとことかがネットで調べてもわかりません!
0そうだね
プレイ済み
返信[38]
親投稿
FOR I=0 TO 255 ***** IF SPUSED(I)==1THEN IF SPCHR(I)!=#CHRXY THEN SPCLR I EMDIF ENDIF NEXT これに流れるSP以外にSPを使っていたら、 IF I==(使っているSPの管理番号) THEN CONTENUE を*****に置いて下さい。 複数ある場合は、 I==(1つめのSPの管理番号)に&&I==(2つめのSPの管理番号)&&I==(3つめ)……… をつけて下さい。
0そうだね
プレイ済み
返信[39]
親投稿
たくみ somsss
If spchr(l)!=#CHRXY then の行でシステムエラーが起きるのですがなぜでしょうか? ()のなかはLですよね...
0そうだね
プレイ済み
返信[40]
親投稿
たくみ somsss
0そうだね
プレイ済み
返信[41]
親投稿
おおっと思いっきりいろいろと間違えてました。 正しくはSPCHR()ではなく、 IF SPCHK() != #CHKXY THEN~です。
0そうだね
プレイ済み
返信[42]
親投稿
ミス。 SPCHK()の中にl(エル)を入れてSPCHK(l)としてください。
0そうだね
プレイ済み
返信[43]
親投稿
たくみ somsss
エラーは直ったのですが、画像の通り、ドンがずっと流れていってます。これはSPが「動いていない」とすぐに判断して消しているせいですか?
0そうだね
プレイ済み
返信[44]
親投稿
たくみ somsss
Dataの最初の音符をドンからカッに変えたら、最初の音符はカッに変わったのですが、次からの音符は変えてみても、変わりませんでした。
0そうだね
プレイ済み
返信[45]
親投稿
たくみ somsss
譜面を読み込めていないのでしょうか?
0そうだね
プレイ済み
返信[46]
親投稿
そう思ったら確認するのが吉です。 ?NOTE$などをし、しっかり譜面が読み込めてるか確認することが重要です。 これに限らず、思った動きをしないときは、変数を表示したり、IF文で音を鳴らしたりするのは、かなり大事です。
0そうだね
プレイ済み
返信[47]
親投稿
たくみ somsss
?a$ではありませんか? ?a$でやると、全部の譜面が出ました。 ということは流す方に問題ありと言うことですね?
1そうだね
プレイ済み
返信[48]
親投稿
たくみ somsss
しょぼーんさんから教えてくださったfor l=0 to 255~next の文を抜くと、sprite の数が一杯になってしまう代わりに、譜面がちゃんと流れるようになりました。
0そうだね
プレイ済み
返信[49]
親投稿
IをFOR~NEXT以外に使っていませんか? 使っていたら、変数の値が変わってしまうので、別の変数名にしましょう。 自分が過去にIを使ったプログラムをアドバイスしていたら、すみませんでした。こちらのミスです。
0そうだね
プレイ済み
返信[50]
親投稿
たくみ somsss
できました。ありがとうございます。 あの、何度もすみませんがもう少しお願いします。 この前、ボタンを押しても反応しないときがあるといったと思うのですが、 VSYNC ループにボタンの判定をいれてもなおりません。 今回の「同じlを使っていた...」みたいなミスがありそうなことはありませんか? 同じようにfor ~next の文を消しただけでは直りません。
0そうだね
プレイ済み
返信[51]
親投稿
ボタンの取得だけでなく、処理も入れてますか? VSYNCループはメインループと思って下さい。
0そうだね
プレイ済み
返信[52]
親投稿
たくみ somsss
処理とは何ですか? 無知ですみません.
0そうだね
プレイ済み
返信[53]
親投稿
要はプログラムや動作のことです。 IF文やFOR~NEXTもPRINTも全部処理です。 SPを処理するプログラム、処理が出来ていない、のように使います。 ちなみにプログラム全体をソースといいます。 間違っていたらすみません。
0そうだね
プレイ済み
返信[54]
親投稿
たくみ somsss
入れてました。遅れてしまいすみません。
0そうだね
プレイ済み
返信[55]
親投稿
たくみ somsss
入れていたのですが、なぜ出来ないんでしょうか?
0そうだね
プレイ済み
返信[56]
親投稿
たくみ somsss
多分譜面を流すループのvicic?が、ボタンを押すタイミングと合っているのではないでしょうか? visicを取るとドンとカッの幅が極端に狭くなってしまいました。
0そうだね
プレイ済み
返信[57]
親投稿
たくみ somsss
VSYNCでした。
0そうだね
プレイ済み
返信[58]
親投稿
恐らくそれだと思います。 なので、MAINCNTというものを使います。 MAINCNTというシステム変数(最初から値が決まっている変数)は、現在のフレーム数を取得できるのですが、簡単にいうと、プチコン起動してどれぐらい1/10秒が経ったかを表すものです。 これを使えば、 IF (MAINCNT MOD 60)==0THEN ~~~ で、1秒毎に処理を行うことができます。 これを曲のテンポに合わせて60のところを変え、GOSUB @FUMENをつければいいのです。
0そうだね
プレイ済み
返信[59]
親投稿
たくみ somsss
これであってますかね? どうなったら正解なのかもよくわかりません。すみません。
0そうだね
プレイ済み
返信[60]
親投稿
そこはテンポと何分音符刻みかで違ってきます。 x=テンポ/60/(何分/4) 例えばテンポが120で32分音符刻みでしたら、 x=120/60/(32/4)*60 x=2/8*60 x=15 なので、MOD 16とすればいいのです。
0そうだね
プレイ済み
返信[61]
親投稿
たくみ somsss
返信が遅れてほんとにすみません! なぜ、x=15でmod 16となるのですか?
0そうだね
プレイ済み
返信[62]
親投稿
あ、多分誤字ってますね。 本当にすみません。 MOD 15が正しいと思われます。
0そうだね
プレイ済み
返信[63]
親投稿
たくみ somsss
あ、すみません。32分刻みって何でしょうか?
0そうだね
プレイ済み
返信[64]
親投稿
たくみ somsss
ドンの間隔から16分かなと思い、やってみたのですが、それだと本家よりももっと遅いです。
0そうだね
プレイ済み
返信[65]
親投稿
たくみ somsss
● ● ● ● ● ● ● ● ● 4分 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 8分 ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● 16分
0そうだね
プレイ済み
返信[66]
親投稿
説明足りずすみません。 32分刻みというのは32分音符での数え方ということです。 1小節を32分に分け、音符を並べるということです。
0そうだね
プレイ済み
返信[67]
親投稿
たくみ somsss
あれ?16分だから16入れたら、遅すぎる!何で?
0そうだね
プレイ済み
返信[68]
親投稿
どこに16を入れましたか? あと、テンポが本家より遅いかもしれません。 googleとかで曲のテンポを調べてはどうでしょうか。
0そうだね
プレイ済み
返信[69]
親投稿
たくみ somsss
Modの後に入れました。多分200ですね。
1そうだね
プレイ済み
返信[70]
親投稿
たくみ somsss
間違いました。120/60/(□/4)*60 で□のところに入れました。
0そうだね
プレイ済み
返信[71]
親投稿
16はそこであっています。 なので、テンポが遅いのかもしれません。 120の所をいじってはみてはどうですか?
0そうだね
プレイ済み
返信[72]
親投稿
たくみ somsss
50ですね。 50だと遅すぎる!
0そうだね
プレイ済み