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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0113
Sゲームオーバー処理がうまくいかない、、、4解決


S

リンク

2021/1/13(Wed) 17:22:13|NO.92063

誰か教えてくださる人がいればとても助かります。
以下コード↓


; シューティングゲーム *ready randomize ; 乱数パターンを不定に buffer 1 ; ウィンドウ1をバッファ画面として用意 picload "shot_chrs.bmp" ; 使用する画像を読み込む wxs = 500 wys = 700 screen 0, wxs, wys ; メイン画面(ウィンドウ0)を500×700画素で出す title "Shooting" ; タイトルバーにタイトル表示 mmload "shot.wav", 0 ; 効果音を読み込む mmload "hit.wav", 1 ; mmload "bomb.wav", 2 ; Bflag = 0 ; ボスフラグ picload "ntitle.bmp", 1 ; タイトル画面 mmload "bgm-title.mp3",3,1 mmplay 3 gosub *pse ; エンターキー待ち *start stg+ ; 1ステージ進行 cls 4 color 255, 255, 255 font "MS Gothic", 32 pos 200,300 mes "STAGE " + stg ; ステージ表示 await 10 fnm = "bgm" + strf("%02d",stg\4) + ".mp3" ; BGMファイル名 mmload fnm,3,1 ; BGMを読み込み、 mmplay 3 ; 鳴らす buffer 2 ; 背景とスクロールの設定 fnm = "nback" + strf("%02d",stg\4) + ".bmp" ; 背景ファイル名 picload fnm ; 背景読み込み ssp = ginfo_winy - wys ; スクロール速度 px = 218 py = 636 ; 自機の初期座標 hp = 20 ; 自機の耐久値(HP) tmx = 12 ; 自機弾の数 dim tx, tmx :dim ty, tmx ; 自機弾の座標の配列変数 dim tf,tmx ; 自機弾フラグの配列変数 nrm = 4*stg ; 敵ノルマ emx = stg/2 + 4 ; 敵の数 dim ex,emx :dim ey,emx ; 敵の座標の配列変数 dim dx,emx :dim dy,emx ; 敵の移動方向の配列変数 dim ehp,emx ; esp = 6 ; 敵の移動速度 foreach ex :c = cnt ; 敵の初期配置を設定 gosub *enmset ; loop etmx = 8 ; 敵弾の数 dim etx, etmx :dim ety, etmx ; 敵弾の座標の配列変数 dim tdx, etmx :dim tdy, etmx ; 敵弾の移動方向の配列変数 dim etf, etmx ; 敵弾フラグの配列変数 bx = 150 ; ボスの座標 by = 50 gsel 0 ; メイン画面選択 *main redraw 0 ; 画面に反映しない(仮想画面は書き換わる) gmode 1 ; ノーマルコピーモード scr = (scr + ssp) \ wys ; コピー元座標を算出 pos 0, scr gcopy 2, 0, 0, wxs, wys-scr ; 背景画像をコピー if scr!0 { pos 0, 0 gcopy 2, 0, wys-scr, wxs, scr } gmode 2 ; 透明色コピーモード if hp > 0 { stick ky, 79 ; キー入力値取得 if ky&1 :px = limit(px-8, 8, 460) ; 自機座標の加減算 if ky&4 :px = limit(px+8, 8, 460) ; if ky&2 :py = limit(py-8, 8, 660) ; if ky&8 :py = limit(py+8, 8, 660) ; pos px, py ; (px,py)座標に位置指定 gcopy 1, 0, 0, 32, 32 ; ウィンドウ1から自機の部分をコピー } foreach tf :c = cnt if tf(c) = 0 { if ky&64 { mmplay 0 ; 自機弾の発射セット tx(c) = px + 8 ty(c) = py - 16 tf(c) = 1 ky = 0 } } else { ty(c) -= 16 if ty(c) < 0 { tf(c) = 0 ; 自機弾を進める } } if tf(c) = 1 :gosub *hitchk ; 発射中の自機弾チェック loop if Bflag == 0 { if (nrm>ecn)&(emx>ecn) { ; ノルマ数以下なら敵を発生 c = rnd(emx) if ehp(c) < 1 :gosub *enmset ; } foreach ehp :c = cnt if ehp(c) > 0 { if r = 0 :gosub *enmvec ; 敵の動きを乱数で決定 x = ex(c) ex(c) += dx(c) if (ex(c)<8)|(wxs-40<ex(c)) :ex(c)=x :dx(c)=-dx(c) ; 左右の壁で反転 y = ey(c) ey(c) += dy(c) if (ey(c)<-24)|(wys-8<ey(c)) :gosub *enmpoi ; 画面下に消えたら再配置 r = rnd(10) pos ex(c), ey(c) ; (ex(c),ey(c))座標に位置指定 gcopy 1, 32, 0, 32, 32 ; ウィンドウ1から敵の画像部分をコピー } loop r = rnd(etmx) e = rnd(emx) ; 敵弾の発射セット if (etf(r)=0)&(ehp(e)>0) { etx(r) = ex(e) + 8 ety(r) = ey(e) + 16 tdx(r) = (rnd(5)-2)*4 tdy(r) = (rnd(2)+1)*8 etf(r) = 1 } foreach etf :c = cnt if etf(c) = 1 { ; 敵弾と自機の当たり判定 if (abs(px-etx(c))<16)&(abs(py-ety(c))<16) { mmplay 1 etf(c) = 0 hp- gosub *bom_p ; 爆発をセット } pos etx(c), ety(c) gcopy 1, 80, 0, 16, 16 ; 敵弾の表示 etx(c) += tdx(c) ety(c) += tdy(c) ; 移動の処理 if (etx(c)<0)|(etx(c)>484)|(ety(c)>684) :etf(c) = 0 } loop if bmc > 0 { bmc- pos bmx, bmy ; 爆発アニメ表示 gcopy 1, 32*(2-bmc), 32, 32, 32 } } ; Bflag == 0 終了 else { ; Bflag == 1 ボス面 color 0, 255, 0 boxf bx, by, bx+200, by+200 } ; Bflag == 1 終了 color 255, 255, 255 font "MS Gothic", 32 pos 8, 8 ; スコア表示 mes strf("%05d", sc*10) if Bflag == 0 { pos wxs-140, 8 ; 敵撃墜ノルマ表示 mes "Enemy "+nrm } pos 8, wys-40 ; 自機の耐久力表示 mes "HP "+hp redraw 1 ; 画面操作の結果を反映(画面の更新) wait 5 ; 0.05秒待つ if Bflag == 0 { foreach ehp :c = cnt if (ehp(c)>0)&(abs(px-ex(c))<24)&(abs(py-ey(c))<24) { ; 自機と敵の当たり判定 hp -= ehp(c) ; 自機のやられ ehp(c) = 0 ; 敵のやられ gosub *bom_e ; 爆発をセット } loop } else { if(px < bx)&(py < by){ if (abs(px-bx)<24)&(abs(py-by)<24) { hp -= 1 } } if(bx < px)&(by < py) { if (abs(bx-px)<200)&(abs(by-py)<200) { hp -= 1 } } } if (hp>0)&(ecn>0) :goto *main ; 自機と敵が健在なら *main にジャンプ if bmc>0 :goto *main ; 爆発中なら *main にジャンプ ; ゲームオーバー処理 ; redraw 1 if hp < 1 { dialog "〜〜GAME OVER〜〜 \n もう一度プレイしますか?",3,"ヤラレチャッタ、、、" if(stat==7):end Sc=0 stg=0 } goto *start ; --- サブルーチン --- ; 敵の初期座標・移動方向をセット ; *enmset ehp(c) = 2 ecn+ ; 敵の発生 *enmpoi ex(c) = rnd(wxs-32) ey(c) =- 24 ; 初期座標 *enmvec dx(c) = (rnd(5)-2)*esp dy(c) = rnd(3)*esp ; 移動方向 return ; 自機弾と敵の当たり判定 ; *hitchk foreach ehp if (ehp(cnt)>0)&(abs(ex(cnt)-tx(c))<24)&(abs(ey(cnt)-ty(c))<32) { mmplay 1 tf(c) = 0 ehp(cnt)- if ehp(cnt) < 1 :gosub *bom_e ; 耐久値<1なら敵1機撃墜 } else { pos tx(c),ty(c) ; 自機弾の表示 gcopy 1,64,0,16,16 ; } loop return ; 爆発アニメのセット ; *bom_e bmc = 3 bmx = ex(cnt) bmy = ey(cnt) ecn- nrm- sc+ mmplay 2 *bom_p if hp < 1 { bmc = 3 bmx = px bmy = py mmplay 2 } return ; キー入力待ち ; *pse wait 1 stick ky if ky = 32 :return ; 32はリターンキー goto *pse

ゲームオーバーしてから「はい」を選択してstg1に戻れたけど、その後敵を全機倒してもステージが進まず困っています。



この記事に返信する


とっしー

リンク

2021/1/14(Thu) 19:32:49|NO.92077

stg=0

のところでstgを0にしているからじゃないですか?
僕もそういうミス時々あるし



沢渡

リンク

2021/1/14(Thu) 20:11:43|NO.92079

素材がなくて実行できないので試せませんが、ecnを*start以下の部分で
0にリセットしていないせいではないかと推測します。
ゲームオーバーになると、次のゲームは敵がいないにもかかわらず
ecnがプラスの状態で始まるので、
いくら敵を倒してもecnが0にならないのではないかなと。



S

リンク

2021/1/14(Thu) 20:58:10|NO.92080

ありがとうございます。
*startのすぐ下にecn=0と入力したら、改善できました。



とっしー

リンク

2021/1/15(Fri) 19:25:37|NO.92082

役に立てなくてすいません。



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