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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0725
T.Kハイスコアー処理について6解決


T.K

リンク

2014/7/25(Fri) 17:54:09|NO.63092

音ゲーにハイスコア処理を追加してみたんですが・・・。

*top cls 4 font "MS ゴシック", 20, 0 color 555,255,255 pos 150,180:mes "音楽スタート" a=0 x=280:y=0:sel=0:maxsel=15 *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を使用してるだけだから精度は良くない) #define winx 100 #define winy 0 #define mm 8 ;間隔 #define xcls0 color 0, 0, 0 : boxf 0, 2000, winx * mm - 1, winy * mm - 1 #define xcls1 color 0, 30, 50 : boxf winx * mm, 0 dim key,7 goto *hiscr_read ;ハイスコアー読み込み *ret1 ;ハイスコアー表示 ----- *hiscr_disp font "MS ゴシック", 18, 1 ;フォント設定 color 255, 255, 255 ;ハイスコアーの文字色 pos (winx + 2) * mm, 12 * mm repeat length(scr) - 1 mes strf("第%d位 ", cnt + 1) + strf("%06d ", scr(cnt)) + namae(cnt) loop return ;スタート表示 ----- *restart_disp xcls0 font "MS ゴシック", 30, 0 color 600, 200, 300 pos 10 * mm, 28 * mm mes " レッツ!ミュージック♪" wait 100 title "音ゲー" KEY_CODE = 0,'Z','X','C','V','B' KEY_POSX = 41 KEY_POSY = 423 BAR_SIZEX = 100 BAR_SIZEY = 20 PERFECT_LINE = 400 PERFECT_RANGE = 20//PERFECT_LINEから上下にずれてもperfectになるサイズ start_tim = d3timer()+200 //開始時間 //背景バッファ初期化 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 gakuhu="0111222333444555111333222*" ;0は無表示,1〜5はz〜bボタンを押す tenpo = 10 ;テンポの速さ onebeat = 9500/tenpo //一拍の時間(ms) perfect_tim = (1.0*PERFECT_LINE/480.0)*onebeat //バー発生からPERFECT_LINEまでの時間 movms = (480.0/onebeat) //1msの移動量(1画面の縦サイズを一拍の時間で割る) font "",40 repeat redraw 0 gmode 0 pos 0,0 celput 1//背景画面コピー if (onebeat*gcnt) <= (d3timer()-start_tim) {//一拍ずつの経過時間を越えた use=0 gaku = peek(gakuhu,gcnt)-'0' //文字コード0の方が*より大きいので*の所でマイナスになる if gaku < 0 {break} 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 //ヒットした時の座標を保存 range=abs(PERFECT_LINE-hit_line_posy) if range<(PERFECT_LINE/5):ms="miss":use=3 { ;パーフェクトラインの半分より下に来た tokuten = tokuten - 50 } ;得点加算 if range<(PERFECT_LINE/6):ms="good":use=2 { ;PERFECT_RANGE*2以下ならgood tokuten = tokuten + 80 } ;得点加算 if range<=PERFECT_RANGE :ms="perfect":use=1{ ;PERFECT_RANGE以下ならperfect tokuten = tokuten + 40 } ;得点加算 }else{ hitf=0 //ヒット表示フラグリセット } pos 200,0 color 255,255,255 mes ms //redraw 1 await 16 ;待ち時間をいれたあとに redraw 0 ;作業しているところを隠す use_bak=use ;スコア表示 color 100, 100, 50 ;表示領域の色 font "MS ゴシック", 25, 1 ;フォント設定 color 255, 0, 255 ;スコアーの文字色 pos 400,0 mes strf("スコアー:%06d", tokuten) redraw 1 await 16 loop ;ゲームオーバー判定&ハイスコアの書き込み goto *hiscr_write ;ハイスコアー書き込み *owari gosub *hiscr_disp ;ハイスコアー表示 dialog "ゲーム終了です。\nもう一度しますか。", 2, "音ゲー" if stat = 6 :goto *top end ;ハイスコアー書き込み ----- *hiscr_write hiscr = "" ;メモリノートパッド用変数クリア notesel hiscr ;メモリノートパッド設定 last = length(scr) - 1 ;配列最後の添字 if tokuten <= scr(last) : goto *owari ;得点と5番目の比較;文字列入力ダイアログ screen 2, 200, 120, 8 ;ダイアログ用ウィンドウ dat = "" mes "名前を入力して下さい。" pos 25, 32 input dat, 150 ;入力ボックス pos 65, 64 button "OK", *ok ;ボタン stop *ok gsel 2, -1 ;ID2非表示 gsel 0, 1 ;ID0アクティブ scr(last) = tokuten ;得点を配列の最後に格納 namae(last) = dat ;名前を配列の最後に格納 gosub *sort ;ソート foreach scr ;配列データをメモリノートパッドに追加 noteadd str(scr(cnt)) noteadd namae(cnt) loop notesave "音ゲー.txt" ;メモリノートパッド保存 noteunsel ;メモリノートパッド解放 goto *owari *sort repeat length(scr) - 1 d1 = cnt repeat length(scr) - (d1 + 1), d1 + 1 if scr(d1) < scr(cnt){ ww = scr(d1) : sww = namae(d1) scr(d1) = scr(cnt) : namae(d1) = namae(cnt) scr(cnt) = ww : namae(cnt) = sww } loop loop return ;ハイスコアー読み込み ----- *hiscr_read onerror gosub *hserr ;エラー処理 dim scr, 5 : sdim namae, 5 ;ハイスコアー用配列 hiscr = "" ;メモリノートパッド用変数クリア(文字型にする) notesel hiscr ;メモリノートパッド設定 noteload "音ゲー.txt" ;メモリノートパッド読み込み foreach scr noteget sscr, cnt * 2 ;スコアー取り出し noteget namae(cnt), cnt * 2 + 1 ;名前取り出し scr(cnt) = int(sscr) ;スコアーを整数に変換 loop noteunsel ;メモリノートパッド解放 goto *ret1 ;呼び出しの次行に戻る *hserr if wparam = 12 { ;ファイルがないエラー foreach scr noteadd "0" noteadd "none" loop return } dialog "エラーです。終了します。" + wparam + "/" + lparam, 1 end
このような状況なのですが、スタート表示の前にハイスコアーを表示したいのですが、エラーで表示できません。
どうしてなのでしょうか?改善策があれば教えて頂けたら光栄です><
長文失礼しました。



この記事に返信する


MonoChrome

リンク

2014/7/25(Fri) 18:44:46|NO.63093

エラー番号10 "サブルーチン外のreturnは無効です"

「gotu *ret1」でラベル「*ret1」にジャンプした後
ラベル「*hiscr_disp」内の「return」がサブルーチン外で実行されているのが原因です。

ラベル「*ret1」をラベル「*restart_disp」の直前に移動し
ラベル「*hiscr_disp」へは「gosub *giscr_disp」でサブルーチンジャンプするようにしてください。

  ;ハイスコアー表示 -----
*hiscr_disp font "MS ゴシック", 18, 1 ;フォント設定 color 255, 255, 255 ;ハイスコアーの文字色 pos (winx + 2) * mm, 12 * mm repeat length(scr) - 1 mes strf("第%d位 ", cnt + 1) + strf("%06d ", scr(cnt)) + namae(cnt) loop return *ret1 gosub *hiscr_disp ;スタート表示 ----- *restart_disp xcls0 font "MS ゴシック", 30, 0 color 600, 200, 300 pos 10 * mm, 28 * mm mes " レッツ!ミュージック♪" wait 100



T.K

リンク

2014/7/25(Fri) 20:54:28|NO.63096

>MonoChromeさん 
返信ありがとうございます><
早速ご指摘通りしてみたら、エラーは改善できましたありがとうございます。
しかし、ハイスコアー表示の命令が全く無視されてるかのように表示してくれません。
なぜだろう・・・。



暇人

リンク

2014/7/25(Fri) 22:53:53|NO.63100

表示はしてる
> gosub *hiscr_disp
>;スタート表示 -----
>*restart_disp
> xcls0
何してる?

後以前の質問の回答時に一回のメインループ中のawaitは一回にするって書いたような・・・
ここ↓に来る時はredraw 0なんだから再度redraw 0をする必要も無い
> await 16 ;待ち時間をいれたあとに
> redraw 0 ;作業しているところを隠す
この二行は削除して良い



T.K

リンク

2014/7/26(Sat) 08:46:54|NO.63103

>暇人さん
返信ありがとうございます><
> await 16 ;待ち時間をいれたあとに
> redraw 0 ;作業しているところを隠す
を消すのを忘れてました。すいません

あと
> gosub *hiscr_disp
>;スタート表示 -----
>*restart_disp
> xcls0
ここの文に何か問題があるんですか?
スタート表示の前にハイスコアーを出すように命令したつもりなんですが・・・
無知でごめんなさい><



暇人

リンク

2014/7/26(Sat) 09:05:53|NO.63104

> xcls0
これは自分で作ったマクロじゃないの?
スコア表示して直ぐに消してるんだから見えなくて当然でしょ・・・



T.K

リンク

2014/7/26(Sat) 09:48:10|NO.63107

>暇人さん

;ハイスコアー表示 ----- *hiscr_disp xcls0 font "MS ゴシック", 25, 0 ;フォント設定 color 255, 255, 0 ;ハイスコアーの文字色 pos 10 * mm, 28 * mm repeat length(scr) - 0 mes strf("第%d位 ", cnt + 1) + strf("%06d ", scr(cnt)) + namae(cnt) loop return *ret1 gosub *hiscr_disp font "MS ゴシック", 35, 0 color 600, 200, 300 pos 10 * mm, 10 * mm mes " レッツ!ミュージック♪" wait 150
できました。
xcls0設定はある講習サイトから参考にさせていただいてたので、勉強不足でした・・・
あとポジション設定も画面外に映してました・・・。
ありがとうございました><



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