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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1115
mineSTGボス作成について1未解決


mine

リンク

2021/11/15(Mon) 21:18:22|NO.94382

STGのボスを作りたいと思っています。
現在雑魚敵を一定数倒すと次のステージに進むだけのゲームになっています。
そこで雑魚敵を一定数倒すとボスが出てきて、倒すと次のステージに進むように作りたいと思っています。
ですが私自身初心者なもので、どの位置にどのようなプログラムを書けばいいのかわかりません。
教えてください。

randomize ; 乱数パターン不定 buffer 1 ; ウィンドウ1をバッファ画面として用意 picload "jikitama.bmp" ; 使用する画像を読み込む wxs = 500 wys = 700 screen 0, wxs, wys ; メイン画面(ウィンドウ0)を500×700画素で出す title "High.Speed.Punisher ヨ -kai-" ; タイトルバーにタイトル表示 mmload "shot.wav", 0 ; 効果音を読み込む mmload "hit.wav", 1 ; mmload "bomb.wav", 2 ; Bflag = 0 ; ボスフラグ picload "ntitle.bmp", 1 ; タイトル画面 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\3) + ".mid" ; BGMファイル名 mmload fnm, 3 ; BGMを読み込み、 mmplay 3 ; 鳴らす buffer 2 ; 背景とスクロールの設定 fnm = "nback" + strf("%02d",stg\3) + ".bmp" ; 背景ファイル名 picload fnm ; 背景読み込み ssp = ginfo_winy - wys ; スクロール速度 px = 218 py = 636 ; 自機の初期座標 hp += 10 ; 自機の耐久値(HP) tmx = 7 ; 自機弾の数 dim tx, tmx :dim ty, tmx ; 自機弾の座標の配列変数 dim tf,tmx ; 自機弾フラグの配列変数 nrm = 3*stg + 10 ; 敵ノルマ emx = stg/2 + 3 ; 敵の数 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 ; 敵弾フラグの配列変数 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, 15 ; キー入力値取得 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&16 { 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 終了 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 { mmstop pos 180, 300 color 255, 0, 0 mes "GAME OVER" stop } goto *start ; --- サブルーチン --- ; 敵の初期座標・移動方向をセット ; *enmset ehp(c) = 3 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

長くなってしまいましたがよろしくお願いします。



この記事に返信する


アイドル

リンク

2021/11/18(Thu) 08:00:04|NO.94399

私もSTG作っている者です!

まずは余計な部分を剃り落として「敵、ボス」だけのスクリプトを出したほうが回答しやすいです
例えばBGMと画像を消して、画像は「mes」とかで動けるようにします。

「picload」と「背景」をコメントアウトすると何故か何も映らないので、
どういう処理なのかわかりにくくなっています。


>>雑魚敵を一定数倒すとボスが出てきて、倒すと次のステージに進むように
「画面外に行った敵、倒した敵」の数を数えて、その数が超えたらボス出現
ボスの体力を0にしたらフラグ立てて、フラグが立っていれば次のステージ
っていうふうに作ればイケルと思います。

私は数を数えるの面倒だったので特殊敵を配置して、
それが全滅したらボス出現するようにしています。



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