|
 |
|
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
|
|
2011/7/14(Thu) 21:19:21|NO.40002
呼ばれたようなので。
ソースコードを考え直すのは重要な事だな。*move4とか、絶対もっとうまいやり方があるだろう。
それはさておき音ゲーはHSPでawait取って流すのではなくて、音楽が現在どこを演奏中なのか
取得してそれに合わせるというのが基本だ。本にも載ってるこんなことをやってるソースコードは
この掲示板にもGoogleというホームページにも文字通り腐るほど埋め立てられているだろうから
まずサンプルをお勉強するところからやってみてはどうか。
この無駄に長いソースの何処かに音楽と同期している部分があるならご勘弁。
何せなげーしこめんとねーし、10秒くらいしかソース読んでないんだ。
|
|
2011/7/14(Thu) 21:19:43|NO.40003
どうみても繰り返し部分が多い気がする。
本当は直してあげたいけど、文章の意味が私はよくわからないし、
画像を参照しているのもありやりにくい。
A~Hを配列にしてはどうでしょう? x?とy?も。
ついでに*move?系も、ldimを使って配列に。
変数名の最後に数字をつけたくなったら、配列にしたほうが良いと思います。
スクリプトを分かりやすくしてもらえないと、ちょっとやる気が起きない…
|
|
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までをおいてるにすぎないことを明記しておくのをわすれました。
すいませんでした。
それ以外に簡略化できるところがありましたら、アドバイスをお願いします。
|
|
2011/7/14(Thu) 21:34:37|NO.40005
ORZ様>
考え方からのご指摘ありがとうございます。
ネットでも調べていたつもりだったのですが、調べが足りなかったようです。
音楽と同期はしていません。
後から、あわせるという考えだったのですが、甘かったようです。
Cookies様>
基礎的な効率化について、アドバイスをありがとうございます。
配列の使い方が甘かったようです。
ご指摘のようにやってみます。
考え方のほうから問題があるということを教えてもらえたので、
もう1度組みなおしてみます。
答えてくれた方々ありがとうございました。
|
|
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...

| |
|