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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0714
twilight音楽ゲームの処理落ちについて。8解決


twilight

リンク

2011/7/14(Thu) 20:18:28|NO.39997

現在9月公開目標で、音楽ゲームをつくっています。
イメージとしては、テンキーの1~9(5以外)の部分に
それぞれ外側から、note(画像)が流れてくるという感じです。

その流れる部分をつくっていたんですが、
同時に画面に表示されるnoteが多いと、awaitの数よりも時間がかかってしまって、
譜面を作る上で問題ができてしまいます。
きっと、スクリプトの効率が悪いと思うのですが、直し方がわかりません。
どうか、アドバイスをください。
よろしくお願いします。

以下が、スクリプトです。


screen 0,800,900 pos 100,100 button "start",*play goto *main /* ①環境設定 */ *settei mmload "music.mp3",1,0 celload "jpg\\1.jpg",11 celload "jpg\\2.jpg",22 celload "jpg\\3.jpg",33 celload "jpg\\4.jpg",44 celload "jpg\\6.jpg",66 celload "jpg\\7.jpg",77 celload "jpg\\8.jpg",88 celload "jpg\\9.jpg",99 celload "jpg\\1m.jpg",111 celload "jpg\\2m.jpg",222 celload "jpg\\3m.jpg",333 celload "jpg\\4m.jpg",444 celload "jpg\\6m.jpg",666 celload "jpg\\7m.jpg",777 celload "jpg\\8m.jpg",888 celload "jpg\\9m.jpg",999 dim note,2000,2000 x1=290:y1=490 x2=365:y2=490 x3=440:y3=490 x4=290:y4=415 x6=440:y6=415 x7=290:y7=340 x8=365:y8=340 x9=440:y9=340 return // ①ここまで /*   ②表示設定 */ *grow_main color 255,255,255 boxf color 0,0,0 line 800,50,0,50;上のライン line 800,850,0,850;下のライン line 362,50,362,850;ブロック上の縦ライン line 437,50,437,850;ブロック下の縦ライン line 0,412,800,412;ブロック上の横ライン line 0,487,800,487;ブロック下の横ライン line 290,340,0,50;左斜め上のライン line 510,340,800,50;右斜め上のライン line 290,560,0,850;左斜め下のライン line 510,560,800,850;右斜め下のライン pos 290,340 gcopy 777,0,0,70,70;7 pos 365,340 gcopy 888,0,0,70,70;8 pos 440,340 gcopy 999,0,0,70,70;9 pos 290,415 gcopy 444,0,0,70,70;4 pos 440,415 gcopy 666,0,0,70,70;6 pos 290,490 gcopy 111,0,0,70,70;1 pos 365,490 gcopy 222,0,0,70,70;2 pos 440,490 gcopy 333,0,0,70,70;3 return stop // ②ここまで。 /* ③譜面読み込み ☆形式について (#,%)=& #はループ回数 %は1~9までで、押すキー &は0=ノートなし 1=ノートあり・未判定 2=判定済み */ *play note(1,1)=1 note(1,2)=1 note(1,3)=1 note(1,4)=1 note(1,6)=1 note(1,7)=1 note(1,8)=1 note(1,9)=1 goto *move // ③ここまで /* ④ノート表示 */ *move mmplay 1 repeat -1,1 A=0;2 B=0;4 C=0;6 D=0;8 E=0;1 F=0;3 G=0;7 H=0;9 redraw 0 gosub *grow_main *move2 if cnt=A:goto *move4 if note(cnt-A,2)=1 { pos x2,y2+200-A*10 gcopy 22,0,0,70,70;2 } A=A +1 if A=28:goto *move4 goto *move2 //4の操作 *move4 if cnt=B:goto *move6 if note(cnt-B,4)=1 { pos x4-200+B*10,y4 gcopy 44,0,0,70,70;4 } B=B +1 if B=28:goto *move6 goto *move4 //6の操作 *move6 if cnt=C:goto *move8 if note(cnt-C,6)=1 { pos x6+200-C*10,y6 gcopy 66,0,0,70,70;6 } C=C +1 if C=28:goto *move8 goto *move6 *move8 if cnt=D:goto *move1 if note(cnt-D,8)=1 { pos x8,y8-200+D*10 gcopy 88,0,0,70,70;8 } D=D +1 if D=28:goto *move1 goto *move8 *move1 if cnt=E:goto *move3 if note(cnt-E,1)=1 { pos x1-200+E*10,y1+200-E*10 gcopy 11,0,0,70,70;1 } E=E +1 if E=28:goto *move3 goto *move1 *move3 if cnt=F:goto *move7 if note(cnt-F,3)=1 { pos x3+190-F*10,y3+190-F*10 gcopy 33,0,0,70,70;3 } F=F +1 if F=28:goto *move7 goto *move3 *move7 if cnt=G:goto *move9 if note(cnt-G,7)=1 { pos x7-195+G*10,y7-195+G*10 gcopy 77,0,0,70,70;7 } G=G +1 if G=28:goto *move9 goto *move7 *move9 if cnt=H:goto *next1 if note(cnt-H,9)=1 { color 0,255,0 pos x9+195-H*10,y9-195+H*10 gcopy 99,0,0,70,70;9 } H=H +1 if H=28:goto *next1 goto *move9 *next1 redraw 1 X=20 await x loop // ④ここまで *main gosub *settei gosub *grow_main stop



この記事に返信する


ひらまる

リンク

2011/7/14(Thu) 21:07:51|NO.40000

とりあえず、画像などのリソースが必要なソースは
一発でテスト実行できないので、解答が遅れる傾向があります。
動くソースを載せてください。

それとちゃんと見てないのですが、repeatとcntで代用できるところがかなりあると思います。

note(1,1)=1 note(1,2)=1 note(1,3)=1 note(1,4)=1 note(1,6)=1 note(1,7)=1 note(1,8)=1 note(1,9)=1
repeat 9, 1
	nore(1,cnt)=1
	mes cnt
loop
とか。
とにかくもっとスクリプトを簡略化してください。8割くらいは削れると思います。
このままだと処理速度の前に致命的なバグが複数発生する可能性があります。

なんか久しぶりの書込で調子が出ませんが、あとはどなたかフォローお願いします…;



ひらまる

リンク

2011/7/14(Thu) 21:08:31|NO.40001

うげぇ…
preを閉じてないなりぃ……ORZ



ORZ

リンク

2011/7/14(Thu) 21:19:21|NO.40002

呼ばれたようなので。
ソースコードを考え直すのは重要な事だな。*move4とか、絶対もっとうまいやり方があるだろう。

それはさておき音ゲーはHSPでawait取って流すのではなくて、音楽が現在どこを演奏中なのか
取得してそれに合わせるというのが基本だ。本にも載ってるこんなことをやってるソースコードは
この掲示板にもGoogleというホームページにも文字通り腐るほど埋め立てられているだろうから
まずサンプルをお勉強するところからやってみてはどうか。

この無駄に長いソースの何処かに音楽と同期している部分があるならご勘弁。
何せなげーしこめんとねーし、10秒くらいしかソース読んでないんだ。



Cookies

リンク

2011/7/14(Thu) 21:19:43|NO.40003

どうみても繰り返し部分が多い気がする。
本当は直してあげたいけど、文章の意味が私はよくわからないし、
画像を参照しているのもありやりにくい。

A~Hを配列にしてはどうでしょう? x?とy?も。
ついでに*move?系も、ldimを使って配列に。

変数名の最後に数字をつけたくなったら、配列にしたほうが良いと思います。


スクリプトを分かりやすくしてもらえないと、ちょっとやる気が起きない…



twilight

リンク

2011/7/14(Thu) 21:25:16|NO.40004

ひらまる様>
返信ありがとうございます。
とりあえず、ご指摘のとおり、画像と含めて、zipであげさせてもらいました。
ttp://ux.getuploader.com/zisakusofuto/download/8/%E9%9F%B3%E3%82%B2%E3%83%BCtestver.zip

それから、簡略化の件ですが、ご指摘のあった部分は本来、譜面のデータ部の予定で
仮に、1~9までをおいてるにすぎないことを明記しておくのをわすれました。
すいませんでした。

それ以外に簡略化できるところがありましたら、アドバイスをお願いします。



twilight

リンク

2011/7/14(Thu) 21:34:37|NO.40005

ORZ様>
考え方からのご指摘ありがとうございます。

ネットでも調べていたつもりだったのですが、調べが足りなかったようです。
音楽と同期はしていません。
後から、あわせるという考えだったのですが、甘かったようです。

Cookies様>
基礎的な効率化について、アドバイスをありがとうございます。
配列の使い方が甘かったようです。
ご指摘のようにやってみます。


考え方のほうから問題があるということを教えてもらえたので、
もう1度組みなおしてみます。

答えてくれた方々ありがとうございました。



twilight

リンク

2011/7/14(Thu) 21:35:52|NO.40006

追記失礼します。

zipは削除しておきます。
また、お世話になるかもしれませんが、そのときはよろしくお願いします。



ひらまる

リンク

2011/7/14(Thu) 22:28:44|NO.40007

途中で疲れて大事なとこは手付かず;
もったいないから投下して寝ます。

あとORZさんを呼んだつもりはあったようななかったような…(謎
偶然キャプスロックがかかってて、
すぐに気付いたのですが「面白いからこのままで良いか」みたいな感じで投稿しました。

;初期設定 gosub *settei ;メインループ *main gosub *drow_main if IsPlay : gosub *move await 1 goto *main ;---①環境設定--- *settei ;スクリーン初期化 screen 0,800,900 ;スタートボタン配置 pos 100,100 button gosub "start",*play ;テクスチャ読込 TexNo = 1 repeat 2 IsM = cnt repeat 9, 1 if cnt == 5 : continue if IsM == 0 : celload ""+cnt +".jpg", TexNo if IsM == 1 : celload ""+cnt+"m.jpg", TexNo TexNo ++ loop loop return ;---②表示設定--- *drow_main ;画面更新 redraw 1 redraw 0 color 255,255,255 boxf color 0,0,0 ;横ライン描画 line 800, 50, 0, 50 ;上のライン line 800, 850, 0, 850 ;下のライン line 800, 412, 0, 412 ;ブロック上の横ライン line 800, 487, 0, 487 ;ブロック下の横ライン ;縦ライン描画 line 0, 850, 0, 50 ;左のライン line 0, 850, 0, 50 ;右のライン line 362, 850, 362, 50 ;ブロック上の縦ライン line 437, 850, 437, 50 ;ブロック下の縦ライン ;斜めライン描画 line 800, 850, 0, 50 ;左上から右下へのライン line 0, 850, 800, 50 ;右上から左下へのライン ;中央線を消す color 255, 255, 255 boxf 363, 413, 436, 486 ;パネル描画 DrawX = 0 DrawY = 0 gmode 1, 70, 70 repeat 8, 1 pos 290 + 75 * DrawX, 490 - 75 * DrawY gcopy cnt DrawX ++ if cnt == 4 : DrawX ++ if DrawX >= 3 { DrawX = 0 DrawY ++ } loop return ;---③譜面読み込み--- *play ;テストプレイ用譜面設定 note(1,1)=1 note(1,2)=1 note(1,3)=1 note(1,4)=1 note(1,6)=1 note(1,7)=1 note(1,8)=1 note(1,9)=1 ;プレイ中フラグON IsPlay = 1 return ;---④ノート表示--- *move color font msgothic, 30 pos 200,200 mes "譜面の表示意味不明ORZ" return

おやすみなさい(-ω-)ZZzz...



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