HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1023
Yozane至急!音ゲーについて17解決


Yozane

リンク

2013/10/23(Wed) 00:03:10|NO.57760

音ゲーが作りたくてここまで作ったのですが、いまいち音の鳴らし方がわかりません・・・
譜面はtxtで読み込めるようにしています。
ソースを書きますので音を鳴らし方を教えてください!
できれば、書き込んでくれると助かります。
MUSICを選択するとゲーム画面に映ります。そこから鳴らせるといいです。

; stick命令によるメニュー選択サンプル ; cls 4 color 255,255,255 pos 220,180:mes "MUSIC" pos 310,200:mes "MUSIC" pos 220,220:mes "MUSIC" pos 310,240:mes "MUSIC" a=0 x=280:y=180:sel=0:maxsel=3 *selmain color 0,0,0:boxf x,y,x+20,y+20 y=sel*20+180 color 255,255,255 pos x,y:mes "⇔" *selloop stick a,1 if a&2 : a=-1:goto *selchg if a&8 : a=1:goto *selchg if a&$30 : goto *selok await 10:goto *selloop *selchg a=a+sel if (a<0)or(a>maxsel) : a=sel sel=a:goto *selmain *selok #include "d3m.hsp" //タイマーだけ利用(timeGetTimeを使用してるだけだから精度は良くない) dim key,6 KEY_CODE = 0,'C','V','B','N','M' KEY_POSX = 41 KEY_POSY = 423 BAR_SIZEX = 100 BAR_SIZEY = 20 PERFECT_LINE = 400 PERFECT_RANGE = 30 //PERFECT_LINEから上下にずれてもperfectになるサイズ //背景バッファ初期化 buffer 1 color 0,0,0 :boxf:color 255,255,255 repeat 5 line BAR_SIZEX+cnt*BAR_SIZEX,0,BAR_SIZEX+cnt*BAR_SIZEX,640 loop line 0,PERFECT_LINE,500,PERFECT_LINE gsel 0 notesel gakuhu noteload "譜面.txt" tenpo = 150 ;テンポの速さ onebeat = 100000/tenpo //一拍の時間(ms) perfect_tim = (1.0*PERFECT_LINE/480.0)*onebeat //バー発生からPERFECT_LINEまでの時間 movms = (480.0/onebeat) //1msの移動量(1画面の縦サイズを一拍の時間で割る) font "",30 start_tim = d3timer() //開始時間 repeat redraw 0 gmode 0 pos 0,0 celput 1//背景画面コピー if (onebeat*gcnt) <= (d3timer()-start_tim) {//一拍ずつの経過時間を越えた use=0 gaku=int(strmid (gakuhu,gcnt,1)) bar_start_tim=onebeat*gcnt //バー発生時間 gcnt+1 } etim=d3timer()-start_tim //開始からの経過時間 bar_tim=etim-bar_start_tim //バー発生からの経過時間(これにmovmsを掛けてバー座標にする) repeat 6-1,1 getkey key(cnt),KEY_CODE(cnt) color 255,255*key(cnt),255 pos KEY_POSX+BAR_SIZEX*(cnt-1),KEY_POSY mes strf("%c",KEY_CODE(cnt)) loop if gaku { if use=0 { color 255,255,0 boxf (gaku*BAR_SIZEX)-BAR_SIZEX,movms*bar_tim-BAR_SIZEY/2,gaku*BAR_SIZEX,movms*bar_tim+BAR_SIZEY/2 //バーの基準点を中央に変更 } } //ヒット表示 if hitf<6 and hitf>0{//perfect=白、good=黄色、miss=赤 if hitf<4 { color 255,255,63+hitf*64 boxf hit_line_posx-BAR_SIZEX,hit_line_posy-BAR_SIZEY/2+hitf*3,hit_line_posx,hit_line_posy+BAR_SIZEY/2-hitf*3 } color 255,255-128*(use_bak=3),255-128*(use_bak>1) circle hit_line_posx-65-hitf*2,PERFECT_LINE-15-hitf*2,hit_line_posx-35+hitf*2,PERFECT_LINE+15+hitf*2,1 circle hit_line_posx-80-hitf*4,PERFECT_LINE-30-hitf*4,hit_line_posx-20+hitf*4,PERFECT_LINE+30+hitf*4,0 hitf++ } if (key(gaku)=1)&(use=0)&(gaku!0) { hitf=1 //ヒット表示フラグ hit_line_posx=gaku*BAR_SIZEX hit_line_posy=movms*bar_tim //ヒットした時の座標を保存 if abs(PERFECT_LINE-hit_line_posy) <= PERFECT_RANGE {//差がPERFECT_RANGE以下ならperfect ms="PERFECT" :use=1 }else{//PERFECT_RANGE*2以下ならgoodでそれより大きければmiss if abs(PERFECT_LINE-hit_line_posy) <= (PERFECT_RANGE*2) {ms="GOOD" :use=2}else{ms="MISS" :use=3 } } use_bak=use } pos 200,200 color 255,255,255 mes ms redraw 1 await 16 #module // 時間を正確に測るためのAPI #uselib "kernel32.dll" #func QueryPerformanceFrequency "QueryPerformanceFrequency" var #func QueryPerformanceCounter "QueryPerformanceCounter" var #deffunc __init_await ddim fr, 1 ddim tm, 1 ddim tm2, 1 ddim wt, 1 ddim xtm, 1 ddim xfr, 1 QueryPerformanceFrequency fr if stat = 0 : return 1 xfr = double(strf("%I64u", fr)) QueryPerformanceCounter tm xtm = double(strf("%I64u", tm)) return 0 #undef await// 既存のawait命令を消す(いままでのawait命令を使用する場合はawait@hspで呼び出せます) #deffunc await double wc wait 0 if wc <= 0.0 {// await 0やawait -1で現在の時刻(?)を基準に設定 QueryPerformanceCounter tm xtm = double(strf("%I64u", tm)) return } wt = xfr * wc / 1000 xtm += wt repeat QueryPerformanceCounter tm2 if double(strf("%I64u", tm2)) - xtm >= wt : break loop return #global __init_await if stat : dialog "エラー", 1 : end await 0// 基準設定。これを音ゲーのループの前に置く。 loop
ここまでできて何でできないと思うかもしれないですが
いろいろと知り合いなどに助けてもらいながらやったので・・・
よろしくお願いします!



この記事に返信する


ZAP

リンク

2013/10/23(Wed) 00:41:14|NO.57761

よくわからないのですが、音源は何なのですか?

テキストから読み込む、とありますが、
既存のMP3やoggなどの音楽ファイルを鳴らすのではなくて、
テキストに書かれた譜面データをリアルタイムで音声合成して鳴らしたいのですか?

だとすると壁はかなり高いと思います。



check

リンク

2013/10/23(Wed) 00:41:16|NO.57762

至急と書かれると俺はひねくれものなので答えたくなくなるので、
俺みたいなへそ曲がりを相手するときは書かないほうがいいとお勧めする。

音を鳴らすのはmmload、mmplayでF1検索。
だが、mm系の命令では音ゲーに対応させることは難しいと思う。
やってみればわかると思う。



KA

リンク

2013/10/23(Wed) 05:44:59|NO.57763

まず、「音ゲー」の「音」の部分だけで完結するスクリプトを作りましょう。
「ゲー」も一緒くたなので、解析する気も失せます。



hamyuu

リンク

2013/10/23(Wed) 11:15:12|NO.57764

#Use file [hspdef.as]
#Error:symbol in use in line 290 [???]

と出て起動できなかったのでどういう状態なのかよくわからないですが、

音ゲーで効果音を鳴らすなら「DirectSoundExtension」がオススメ!と思いました。
http://taillove.jp/mia/plugins.html
http://taillove.jp/mia/plugin/arc/dsoundex.txt

単に自分が慣れているというだけですが...



Yozane

リンク

2013/10/23(Wed) 15:11:23|NO.57765

音源はmp3かwavです。
テキストに1234・・・と書いて順番を決めて流れます。
選択したときに音が流れてくれればいいです。



KA

リンク

2013/10/23(Wed) 16:06:41|NO.57766

>>譜面はtxtで読み込める
>>テキストに1234・・・と書いて順番を決めて流れます
曲順リスト?

まず、単体で鳴らすだけのスクリプトを作りましょう。
あとは、それを該当部分に組み込むかgosubします。

たぶん、あなた自身が処理内容を理解していないと思います。
(単発的にコメントが付いているが、具体的な動作のコメントが皆無)



123

リンク

2013/10/23(Wed) 19:32:33|NO.57767

mmloadとmmplayのヘルプを見てみて。
ただmp3は普通にぱっく出来ないので権利には注意するんだよ



暇人

リンク

2013/10/23(Wed) 22:48:40|NO.57775

mm系だと音の重ね再生ができないからdmm系を使う
他のDirectSoundを扱えるプラグインとかmci(デバイスをMPEGVIDEOにすれば)でも同様の事はできる

下で使ってるwavファイルは一度hsptv.exeを実行しないとhsptvに存在しない

#include "hspogg.as" dmmini _dir_tv=dir_exe+"\\hsptv\\" wav_fname="se_puyo.wav","se_break2.wav","se_break.wav","se_jump2.wav","se_click.wav","se_foot.wav","se_jump.wav","se_puyo.wav","se_shot2.wav","se_shot.wav","se_tyuiin.wav" repeat length(wav_fname) Sound_no++ dmmload _dir_tv+wav_fname(cnt) wav_id(Sound_no)=stat loop dim key,6 KEY_CODE = 0,'C','V','B','N','M' key_Sound= 0,wav_id(1),wav_id(2),wav_id(3),wav_id(4),wav_id(5) //サウンドID を各キーにセット title_mes="key_Sound= 0,wav_id(1),wav_id(2),wav_id(3),wav_id(4),wav_id(5)","key_Sound= 0,wav_id(6),wav_id(7),wav_id(8),wav_id(9),wav_id(10)" //デバッグ表示用 title "Sound="+Sound+" "+title_mes(Sound)//デバッグ用表示 mes "'C','V','B','N','M' で再生" repeat stick stk if stk&64 {//Ctelキーで Sound^1 if Sound=0 {//各キーにセットされてるサウンドID を変更 key_Sound= 0,wav_id(1),wav_id(2),wav_id(3),wav_id(4),wav_id(5) }else{ key_Sound= 0,wav_id(6),wav_id(7),wav_id(8),wav_id(9),wav_id(10) } title "Sound="+Sound+" "+title_mes(Sound)//デバッグ用表示 } repeat 6-1,1 key_bak(cnt)=key(cnt) //離されたか確認用に前回のキーを記憶 getkey key(cnt),KEY_CODE(cnt) if key(cnt)=1 and key_bak(cnt)=0 {//今回押されて前回離されていたら再生 dmmplay key_Sound(cnt) //デバッグ用表示 pos ginfo_cx+(ginfo_cy>460)*100,ginfo_cy*(ginfo_cy<=460)+(ginfo_cy>460)*16 mes strf("%c wav_id=%d",KEY_CODE(cnt),key_Sound(cnt)) } loop await 16 loop

後NO.57760のawait置換えモジュールの使い方は間違ってる
この置換えモジュールはCPUコア一つ分使い切る動作になってるので
あまりお勧めしない



Yozane

リンク

2013/10/24(Thu) 17:22:16|NO.57778

DirectSoundでやったらできました!
ありがとうございます。
最後に、譜面が落ちてきて次に落ちてくるテンポを狭くしたいのですがどれをどう変更したらいいでしょうか?
(譜面の落ちてくるスピードではない。)



Yozane

リンク

2013/10/24(Thu) 17:29:16|NO.57779

最後といったのにすみません。
あと、譜面を二つ同時に落とすにはどうすればいいですか?



check

リンク

2013/10/24(Thu) 17:51:39|NO.57782

音の鳴らし方が解決しているなら、別スレ立てるべきじゃないのか?



check

リンク

2013/10/24(Thu) 18:02:40|NO.57783

後、ソース丸投げで「考えてください!」って言うのは実質的に「ソースくれ」と同じなんで、
少しは自分でそのソースコードを理解する努力をしたらどうだ?
(質問に)必要な部分だけを取り出して、外部ファイルがなくても動くようにするのがいい。



暇人

リンク

2013/10/25(Fri) 00:59:07|NO.57788

質問とは関係ないが
>onebeat = 100000/tenpo //一拍の時間(ms)
msにするなら 60000/tenpo だな・・・

自分が書いたスクリプト利用されてるから
最初に間違って書いたのかと思ったら違った・・・
http://hsp.tv/play/pforum.php?mode=pastwch&num=53739
違うページでも使った人がいて、そこで100000/tenpo にされてた・・・



晩御飯

リンク

2013/10/25(Fri) 01:02:40|NO.57789

もっと言うとtempoかな



暇人

リンク

2013/10/25(Fri) 05:51:23|NO.57790

URLこっちだった・・・
http://hsp.tv/play/pforum.php?mode=pastwch&num=53562

>もっと言うとtempoかな
最初に出されたスクリプトの変数名は全部ローマ字でそのまま使ってる
変えたことに気付かない事があると不味いので・・・



Yozane

リンク

2013/10/25(Fri) 11:45:20|NO.57793

>>暇人さん
すみません、知り合いに頼んでここから自分でやってみといわれたんで・・
無知ですみません・・・

もう一回他のスレたてます。



Yozane

リンク

2013/10/25(Fri) 11:45:38|NO.57794

一応解決で。



ONION software Copyright 1997-2023(c) All rights reserved.