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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0223
ミントボスのHP切り替え7解決


ミント

リンク

2014/2/23(Sun) 19:09:34|NO.60233

こんにちは。少しお久しぶりです。
東方STGを作っているのですが、
ボスのHP切り替えのソースが思い通りに動かなくって困ってます。


 ■問題点■
BS_y(cnt) -= 1 ;ボスを↑に「移動」(問題点)
これを入れないと、HP減らしても「BS_HIT(1)」が判定がされない。
これを入れて1段階目を倒すと「BS_HIT(1)」の数値が上昇するがボスが上に移動して困る。
でも入れないと判定しない・・・どこか原因あるけど見つからない・・・orz


 ■仕様■
・ボスは1人
・ボスは移動しない
・ボスのHPが0になると、次のHPが設定される(2段階目はHPが増えます)
・1段階のボスHPを0にすると、絵が表示される(スペカ絵)
・2段階のボスHPを0にすると、絵が表示される(絵は同じです)
・絵は上に移動し画面外で「止める」か「消す」

 ■やりたいこと■
1.1段階のHPを0にしたとき、絵が表示される。
2.その後、2段階のHPを設定されボス戦を続行。
3.2段階のHPを0にしたとき、1段階目と同じ絵を表示させる。


ボスは1人だけど2人いるとして考えて、
1人目のボスのHPを減らせば、2人目(2つめのHP)が出てくるという考え方。
そんで段階ごとにHPを設定することができたんだけど、
同じ絵なのでまとめようとしたら何故かうまくいかない・・・orz

うまく伝わるといいんだけど、わからないところありましたら聞いてください。
それではよろしくお願いいたします。
---------------------------

screen 0,400,400 ;******************情報***************** ;自機の情報 JIKI_x = 160 : JIKI_y = 300 JIKI_Spd = 4 ;自機スピード ;ボスの情報 BS_MAX = 2 ;ボスの最大数(2) dim BS_f,BS_MAX ;ボスフラグ dim BS_x,BS_MAX ;X dim BS_y,BS_MAX ;Y dim BS_HIT,BS_MAX ;ヒット数 dim BS_HP,BS_MAX ;HP SPE_MAX = 2 ;スペカ最大数 dim SPE_f,SPE_MAX ;スペカフラグ dim SPE_x,SPE_MAX ;X dim SPE_y,SPE_MAX ;Y ;***************ボスの配置************** BS_x(0,0) = 160,160 BS_y(0,0) = 160,160 ;**************ボスのHP*************** BS_HP(0,0) = 5,10 ;***********スペカ絵の配置************** SPE_x(0,0) = 200,200 SPE_y(0,0) = 160,160 ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 50,20 : mes "BS_HIT(0) " + BS_HIT(0) pos 50,40 : mes "BS_HIT(1) " + BS_HIT(1) pos 50,70 : mes "SPE_y(0) " + SPE_y(0) pos 50,90 : mes "SPE_y(1) " + SPE_y(1) ;*************ラベルジャンプ************ gosub *スペカ絵 gosub *ボス処理 gosub *ボスVS自機弾 gosub *自機移動 gosub *自機弾の移動 ;*************************************** ;自機表示 color 255,255, : pos JIKI_x,JIKI_y : mes "自" ;ボス表示 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 1 { ;ボスフラグが「立ってたら実行」 pos BS_x(cnt),BS_y(cnt) color 255 : mes "ボス" }loop ;スペカ絵 repeat SPE_MAX ;スペカ最大数(2) if BS_HIT(cnt) >= BS_HP(cnt) { ;ダメージ与えたら「実行」 pos SPE_x(cnt),SPE_y(cnt) color 255,255 : mes "絵" }loop ;自機弾表示 if JK_SHOT = 1 { ;自機弾フラグが「立ってたら実行」 pos JKSO_x,JKSO_y color ,255,255 : mes "弾" } redraw 1 : await 15 goto *メイン ;****************スペカ絵*************** *スペカ絵 repeat SPE_MAX ;スペカ最大数(2) if SPE_f(cnt) = 0 { ;スペカのフラグが「立ってなかったら実行」 SPE_f(cnt) = 1 ;スペカのフラグを「立てる」 } if SPE_y(cnt) >= -150 { ;絵が画面外に移動したら「実行しない」 if BS_HIT(cnt) >= BS_HP(cnt) { ;ダメージを与えたら「実行」 SPE_y(cnt) -= 1 ;絵を↑に「移動」 } }loop return ;*****************ボス処理************** *ボス処理 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 0 { ;ボスのフラグが「立ってなかったら実行」 BS_f(cnt) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(cnt) >= BS_HP(cnt) { ;ダメージ与えたら「実行」 BS_y(cnt) -= 1 ;ボスを↑に「移動」(問題点) ;↑これを入れないと、HP減らしても「BS_HIT(1)の判定がされない」 }loop return ;************ボスVS自機弾************* *ボスVS自機弾 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 1 AND JK_SHOT = 1 { ;ボスがいて、自機弾がある場合「実行」 if (BS_x(cnt) < JKSO_x+15) AND (BS_x(cnt)+46 > JKSO_x) AND (BS_y(cnt) < JKSO_y+11) AND (BS_y(cnt)+30 > JKSO_y) { BS_HIT(cnt) += 1 ;自機弾の火力 JK_SHOT = 0 ;自機弾フラグを「戻す」 } }loop return ;***************自機移動**************** *自機移動 stick key,15 if key & 4 : JIKI_x + JIKI_Spd ;→の移動 if key & 1 : JIKI_x - JIKI_Spd ;←の移動 if key & 2 : JIKI_y - JIKI_Spd ;↑の移動 if key & 8 : JIKI_y + JIKI_Spd ;↓の移動 return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and JK_SHOT = 0 { ;Zキーが押されたら、自機弾フラグがない場合「実行」 JK_SHOT = 1 ;自機弾フラグを「立てる」 JKSO_x = JIKI_x ;X JKSO_y = JIKI_y ;Y } if JK_SHOT = 1 : JKSO_y -= 15 ;自機弾を↑に移動させる if JKSO_y < 0 : JK_SHOT = 0 ;一番上まで行ったら、自機弾フラグを「戻す」 return



この記事に返信する


暇人

リンク

2014/2/23(Sun) 19:45:51|NO.60234

倒しても
> if BS_f(cnt) = 1 AND JK_SHOT = 1 { ;ボスがいて、自機弾がある場合「実行」
ここのBS_f(cnt) = 1が通ってしまうので先にBS_f(0)が判定されて
JK_SHOTが0になりBS_f(1)まで判定されない


> BS_y(cnt) -= 1 ;ボスを↑に「移動」(問題点)
これを

BS_f(cnt) = -1
みたいにすれば良いんじゃない?



MillkeyStars

リンク

2014/2/23(Sun) 19:46:42|NO.60235

仕様がいまいちわからないけど、1段目のHPが0になった時は、ボスの移動はあるの?
(サンプルだと、1段目のHPがゼロになった時、上に移動してるけど。)



ミント

リンク

2014/2/23(Sun) 21:07:58|NO.60237

暇人さん

>>BS_f(cnt) = -1
>>みたいにすれば良いんじゃない?
確かにそれでもいいんだけどボス消えちゃうし・・・
っと思ってたら別に消えても問題ないし、仕様とすれば大丈夫かな。

ただこのソース、ボスが1人なのに無駄に2回描画しちゃっているんで、
そこんところは考えてできれば直してみるわ。
(3面ぐらいに5段階ボス作る予定なので、5回描画して、5回分動かすはめになる)
(HPごとに変数を変えてもいいんだけど、同じ絵を表示させるのに変数名が違うのを用意するのもよくない)

ありがとうございます。もうちょっと自分と向き合って考えてみます。
--------------------------
MillkeyStarsさん

>>仕様がいまいちわからないけど、1段目のHPが0になった時は、ボスの移動はあるの?
>>(サンプルだと、1段目のHPがゼロになった時、上に移動してるけど。)
やっぱそこの行コメントアウトするべきだったか orz

>> ■仕様■
>>・ボスは1人
>>・ボスは移動しない
このソースではボスは動かないという仕様です。
(メインソースは動きます)

ん〜作り方を考え直すべきか・・・・



ミント

リンク

2014/2/23(Sun) 22:10:17|NO.60239

落ち着いてよく考えたらできたっぽい。
そもそも似たようなことをかなり昔にやってたのを思い出した。
敵の配置を真似して、それぞれにHPを設定するイメージで組んだ。

ちょっくらメインソースに適応してきます。

screen 0,400,400 ;******************情報***************** ;自機の情報 JIKI_x = 160 : JIKI_y = 300 JIKI_Spd = 4 ;自機スピード ;ボスの情報 BS_MAX = 2 ;ボスの最大数(2) dim BS_f,BS_MAX ;ボスフラグ dim BS_x,BS_MAX ;X dim BS_y,BS_MAX ;Y dim BS_HIT,BS_MAX ;ヒット数 dim BS_HP,BS_MAX ;HP SPE_MAX = 2 ;スペカ最大数 dim SPE_f,SPE_MAX ;スペカフラグ dim SPE_x,SPE_MAX ;X dim SPE_y,SPE_MAX ;Y ;***************ボスの配置************** BS_x(0) = 160 : BS_x(1) = 160 BS_y(0) = 160 : BS_y(1) = 160 ;**************ボスのHP*************** BS_HP(0) = 5 : BS_HP(1) = 10 : BS_HP(2) = 15 ;***********スペカ絵の配置************** SPE_x(0) = 200 : SPE_x(1) = 200 SPE_y(0) = 160 : SPE_y(1) = 160 ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 50,20 : mes "BS_HIT(0) " + BS_HIT(0) pos 50,40 : mes "BS_HIT(1) " + BS_HIT(1) pos 50,90 : mes "SPE_y(0) " + SPE_y(0) pos 50,110 : mes "SPE_y(1) " + SPE_y(1) ;*************ラベルジャンプ************ gosub *スペカ絵 gosub *ボス処理 gosub *ボスVS自機弾 gosub *自機移動 gosub *自機弾の移動 ;*************************************** ;自機表示 color 255,255, : pos JIKI_x,JIKI_y : mes "自" ;ボス表示 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 1 { ;ボスフラグが「立ってたら実行」 pos BS_x(cnt),BS_y(cnt) color 255 : mes "ボス" }loop ;スペカ絵 repeat SPE_MAX ;スペカ最大数(2) if BS_HIT(cnt) >= BS_HP(cnt) { ;ダメージ与えたら「実行」 pos SPE_x(cnt),SPE_y(cnt) color 255,255 : mes "絵" }loop ;自機弾表示 if JK_SHOT = 1 { ;自機弾フラグが「立ってたら実行」 pos JKSO_x,JKSO_y color ,255,255 : mes "弾" } redraw 1 : await 15 goto *メイン ;****************スペカ絵*************** *スペカ絵 repeat SPE_MAX ;スペカ最大数(2) if SPE_f(cnt) = 0 { ;スペカのフラグが「立ってなかったら実行」 SPE_f(cnt) = 1 ;スペカのフラグを「立てる」 } if SPE_y(cnt) >= -150 { ;絵が画面外に移動したら「実行しない」 if BS_HIT(cnt) >= BS_HP(cnt) { ;ダメージを与えたら「実行」 SPE_y(cnt) -= 1 ;絵を↑に「移動」 } }loop return ;*****************ボス処理************** *ボス処理 repeat BS_MAX ;ボスの最大数(2) switch cnt ;グループごとの処理を行う case 0 ;1 if BS_f(cnt) = 0 { ;ボスのフラグが「立ってなかったら実行」 BS_f(cnt) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(0) >= BS_HP { ;ダメージを与えたら「実行」 BS_f(cnt) = 0 ;ボスのフラグを「オフにする」 } swbreak case 1 ;2 if BS_HIT(0) >= BS_HP { ;ダメージを与えたら「実行」 if BS_f(cnt) = 0 { ;ボスのフラグが「立ってなかったら実行」 BS_f(cnt) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(1) >= 10 {;ダメージを与えたら「実行」 BS_f(cnt) = 0 ;ボスのフラグを「オフにする」 } } swbreak swend loop return ;************ボスVS自機弾************* *ボスVS自機弾 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 1 AND JK_SHOT = 1 { ;ボスがいて、自機弾がある場合「実行」 if (BS_x(cnt) < JKSO_x+15) AND (BS_x(cnt)+20 > JKSO_x) AND (BS_y(cnt) < JKSO_y+11) AND (BS_y(cnt)+30 > JKSO_y) { JK_SHOT = 0 ;自機弾フラグを「戻す」 BS_HIT(cnt) += 1 ;自機弾の火力 } }loop return ;***************自機移動**************** *自機移動 stick key,15 if key & 4 : JIKI_x + JIKI_Spd ;→の移動 if key & 1 : JIKI_x - JIKI_Spd ;←の移動 if key & 2 : JIKI_y - JIKI_Spd ;↑の移動 if key & 8 : JIKI_y + JIKI_Spd ;↓の移動 return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and JK_SHOT = 0 { ;Zキーが押されたら、自機弾フラグがない場合「実行」 JK_SHOT = 1 ;自機弾フラグを「立てる」 JKSO_x = JIKI_x ;X JKSO_y = JIKI_y ;Y } if JK_SHOT = 1 : JKSO_y -= 15 ;自機弾を↑に移動させる if JKSO_y < 0 : JK_SHOT = 0 ;一番上まで行ったら、自機弾フラグを「戻す」 return



暇人

リンク

2014/2/23(Sun) 22:23:13|NO.60240

>確かにそれでもいいんだけどボス消えちゃうし・・・
それは描画処理の方でどうにでもなる話

>ただこのソース、ボスが1人なのに無駄に2回描画しちゃっているんで、
倒した段階はBS_f(cnt) = -1にして
if BS_f(cnt) = 1 で一回通過後処理したらbreakすれば良い

メイン

;ボス表示 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) > 0 { ;ボスフラグが「立ってたら実行」 pos BS_x(cnt),BS_y(cnt) color 255 : mes "ボス" break } loop
サブルーチン

;*****************ボス処理************** *ボス処理 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 0 { ;ボスのフラグが「立ってなかったら実行」 BS_f(cnt) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(cnt) >= BS_HP(cnt) and BS_f(cnt)=1{ ;ダメージ与えたら「実行」 if cnt=(BS_MAX-1) {BS_f(cnt) = 2}else{BS_f(cnt) = -1} }loop return ;************ボスVS自機弾************* *ボスVS自機弾 repeat BS_MAX ;ボスの最大数(2) if BS_f(cnt) = 1 { if JK_SHOT = 1 { ;ボスがいて、自機弾がある場合「実行」 if (BS_x(cnt) < JKSO_x+15) AND (BS_x(cnt)+46 > JKSO_x) AND (BS_y(cnt) < JKSO_y+11) AND (BS_y(cnt)+30 > JKSO_y) { BS_HIT(cnt) += 1 ;自機弾の火力 JK_SHOT = 0 ;自機弾フラグを「戻す」 } } break }loop return



ミント

リンク

2014/2/24(Mon) 22:07:21|NO.60266

暇人さん

>ただこのソース、ボスが1人なのに無駄に2回描画しちゃっているんで、
倒した段階はBS_f(cnt) = -1にして
if BS_f(cnt) = 1 で一回通過後処理したらbreakすれば良い

あぁ、フラグをマイナスにする方法もあったかー。
なんで今まで「0と1」しか扱わなかったのか・・・
これならなんとかいけそうですね。

ちょっとソース反映まで時間かかるります。



ミント

リンク

2014/3/1(Sat) 17:57:21|NO.60363

ボスのHP切り替えができました。
ちょっとまだ時間かかりそうなのでいったん解決にしちゃいます。ありがとうございます。
既存の不具合発見して影響範囲が少し大きくなってしまった(´・ω・`)



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