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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1223
ミント食らいボムシステム11解決


ミント

リンク

2013/12/23(Mon) 15:34:55|NO.58850

お久しぶりです。ミントです。そうでないかたは始めまして。

現在、東方STGを作ってます。
「食らいボム」システムを作ろうとして、その途中経過で困ったことになってしまいました。
(っというか原因がわからない)

 ※食らいボムとは
敵の弾に当たったとき、数秒間ボムを発動できる時間があります。
その数秒間のうちにボムを打てば死んだことになりません(残機は減らない)
逆に数秒間のうちにボムを打てなかった場合は、残機が減ります。
-------------------------------------------------------------

screen 0,450,300 ;*****************情報****************** ;自機の座標 JIKI_x = 206 : JIKI_y = 230 KNI_MAX = 50 ;弾の最大数(50) dim KN_f,KNI_MAX ;弾のフラグ dim KN_x,KNI_MAX ;弾のX dim KN_y,KNI_MAX ;弾のY ;****************メインループ*********** *メイン redraw 0 : color : boxf ;****************カウンター************* color ,255 pos 20,20 : mes "弾のヒット数 " + KN_HIT pos 20,40 : mes "ミスカウント " + MISU_c pos 20,60 : mes "弾の動きを止める_F " + UG_STO_f pos 20,80 : mes "自機の動きを止める_F " + JIKI_STOP_f ;*************************************** gosub *自機の移動 gosub *弾の準備 gosub *弾VS自機 ;***************自機******************** ;自機表示 pos JIKI_x,JIKI_y : mes "□" ;低速表示 color 255,255 pos TE_x,TE_y : mes "#" ;弾表示 repeat KNI_MAX ;弾の最大数(50) color 255, pos KN_x(cnt),KN_y(cnt) : mes "●" loop ;*************低速移動****************** if JIKI_STOP_f = 0 { ;自機の動きを止めるフラグが「立ってたら実行」 JIKI_Spd = 4 ;自機スピード } redraw : await 15 goto *メイン ;****************弾の準備*************** *弾の準備 repeat KNI_MAX ;弾の最大数(50) if UG_STO_f = 0 { ;弾の動きを止めるフラグ KN_M = rnd(100) ;乱数 if KN_f(cnt) = 0 { ;フラグ KN_f(cnt) = 1 ;弾のフラグを「立てる」 KN_x(cnt) = KN_M ;乱数を入れる KN_y(cnt) = 0 ;Yの高さ } if KN_f(cnt) = 1 {;フラグが「立ってたら実行」 KN_x(cnt) += 0.02 * rnd(100);Xスピード KN_y(cnt) += 2;Yスピード } if KN_y(cnt) >= 390 { ;弾が下まで行ったら「実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 } }loop return ;*************弾VS自機**************** *弾VS自機 repeat KNI_MAX ;弾の最大数(50) if KN_f(cnt) = 1 {;弾のフラグが「立ってたら実行」 if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){ // if (JIKI_x < KN_x(cnt)+6) AND (JIKI_x+2 > KN_x(cnt)) AND (JIKI_y < KN_y(cnt)+6) AND (JIKI_y+2 > KN_y(cnt)){ KN_HIT += 1 ;弾のヒット数 MISU_c++ ;ミスカウンター JIKI_Spd = 0 ;自機のスピードを「無くす」 JIKI_STOP_f = 1 ;自機の動きを止めるフラグを「立てる」 UG_STO_f = 1 ;弾の動きを止めるフラグを「立てる」 if MISU_c < 3 : await 100 ;ミスカウンターが「3未満」ならスローになる if MISU_c >= 3 { ;ミスカウンターが「3」以上だったら「実行」 MISU_c = 0 ;ミスカウンターを「初期化」 UG_STO_f = 0 ;弾の動きを止めるフラグを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」 } } }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 ;↓の移動 ;低速の位置 TE_x = JIKI_x+3 : TE_y = JIKI_y+2 return
-----------------------------------------------------
 ●ソースの説明●
まずは、普通のSTG同様、弾とあたったら死にます。
大事な部分はその当たり判定の中身。

KN_HIT += 1 ;弾のヒット数 MISU_c++ ;ミスカウンター JIKI_Spd = 0 ;自機のスピードを「無くす」 JIKI_STOP_f = 1 ;自機の動きを止めるフラグを「立てる」 UG_STO_f = 1 ;弾の動きを止めるフラグを「立てる」
「MISU_c++」で弾に当たったカウントを数えます。
「JIKI_Spd = 0」は特に意味はありませんが、不具合がおきにくくするための保険です。
「JIKI_STOP_f = 1」で自機を動けなくさせます
(東方では小さい当たり判定があるので、動けると弾から抜けてしまう可能性があるため)

「UG_STO_f = 1」弾の動きを止めます。
(弾が動くと判定が2回発生するなどが考えられる)

if MISU_c < 3 : await 100 ;ミスカウンターが「3未満」ならスローになる if MISU_c >= 3 { ;ミスカウンターが「3」以上だったら「実行」 MISU_c = 0 ;ミスカウンターを「初期化」 UG_STO_f = 0 ;弾の動きを止めるフラグを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」 }
「MISU_c」が3未満の時、ボムを打てば死なずにすむシステムにしてます。
(ボム機能はこの不具合と関係ないので入れていません)

「MISU_c」が3以上の時、自機は死にます。死ぬときに情報をリセットします。
-------------------------------------------------------------------
 ■原因■
実行してして、左上からくる弾に何度か突っ込めば、
MISU_c = 3未満
UG_STO_f = 1
JIKI_STOP_f = 1
っという状態が発生します (このとき自機が動けなくなる)

それで、原因がわからなくって色々試した結果、
//if (JIKI_x < KN_x(cnt)+6) AND (JIKI_x+2 > KN_x(cnt)) AND (JIKI_y < KN_y(cnt)+6) AND (JIKI_y+2 > KN_y(cnt)){
↑このコメントアウトしているやつを解除して、

if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){
↑こっちをコメントアウトして実行すれば、何度弾にぶつかっても同じ現象は発生しませんでした。


当たり判定が原因か?というとそうでもないような気がします・・・多分。
多分どこか別のところが悪さしているような・・・う〜んこの・・・

ってなわけでちょっとわかりにくいかもしれませんが、アドバイス等あれば教えてほしいです><
ソースの改善余地もありまくると思うので、その指摘でもかまいません。
なお、私が理解出来ないソースだとしばらく返答に時間がかかってしまいますorz

それではよろしくお願いします。



この記事に返信する


check

リンク

2013/12/23(Mon) 16:18:47|NO.58851

玉を動かなくしても当たり判定も消さなければ意味がないのでは?
玉に当たる→衝突判定を消す→ボムが放たれたら衝突判定を戻す
こんな感じでいいと思う(東方やったことないんでよくわからないが)

改善の余地なら、42行目から57行目までのループで、
敵の動きを止めるフラグ(UG_STO_f)が立っていると空ループになる。
フラグが立っていたらbreakで抜けたほうがいい。



ミント

リンク

2013/12/23(Mon) 17:26:39|NO.58856

checkさん

>玉を動かなくしても当たり判定も消さなければ意味がないのでは?
>玉に当たる→衝突判定を消す→ボムが放たれたら衝突判定を戻す
if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){
の後に、弾との当たり判定を消すっていう意味かな?
もしそうだとしたら・・・

1.弾にあたったら新しいフラグを立てる「ATA_F = 1」
2.if KN_f(cnt) = 1 {;弾のフラグが「立ってたら実行」の前に「ATA_F = 0」をおく。
こうすると、当たったまま動けなくなって、ボムは打つチャンスができます。
だけど「MISU_c」の数が増加しなくなっちゃうので、この方法はだめですね・・・

>改善の余地なら、42行目から57行目までのループで、
おぉー、そんなのがあるとは・・・
ってことはほとんどのソース空ループしているやつあるなぁ・・・
今度そこら辺は直しておきます!



暇人

リンク

2013/12/23(Mon) 17:33:24|NO.58857

>if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){
TE_x、TE_yは
>JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」
ここで戻されていないので死んだ後も他の弾に当たってカウントが進む
でも、TE_x、TE_yの方も変えたとしても同じフレームで複数回当たるのでボムは使えないし
スタート地点に弾があれば同じ事が起きるので、その辺の修正が必要



ミント

リンク

2013/12/23(Mon) 18:13:21|NO.58858

>暇人さん
>JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」
>>ここで戻されていないので死んだ後も他の弾に当たってカウントが進む
>>でも、TE_x、TE_yの方も変えたとしても同じフレームで複数回当たるのでボムは使えないし
確かにこれだと複数回当たっているんだよね・・・
作り方を考え直さないとダメかな〜。
1発の弾に対しては発生してないんだよねー。う〜ん。

>>スタート地点に弾があれば同じ事が起きるので、その辺の修正が必要
あ、これに関しては大丈夫です!
時間が経過(MISU_c)してしまったら、弾消しフラグを立ててそこで処理しています。

ちなみに、1発の弾のソース
------------------------------

screen 0,450,300 ;*****************情報****************** ;自機の座標 JIKI_x = 206 : JIKI_y = 230 ;****************メインループ*********** *メイン redraw 0 : color : boxf ;****************カウンター************* color ,255 pos 20,20 : mes "弾のヒット数 " + KN_HIT pos 20,40 : mes "ミスカウント " + MISU_c pos 20,60 : mes "弾の動きを止める_F " + UG_STO_f pos 20,80 : mes "自機の動きを止める_F " + JIKI_STOP_f ;*************************************** gosub *自機の移動 gosub *弾の準備 gosub *弾VS自機 ;***************自機******************** ;自機表示 pos JIKI_x,JIKI_y : mes "□" ;低速表示 color 255,255 pos TE_x,TE_y : mes "#" ;弾表示 color 255, pos KN_x-4,KN_y-1 : mes "●" ;*************低速移動****************** if JIKI_Spd_f = 0 { ;自機の動きを止めるフラグが「立って無かったら実行」 JIKI_Spd = 4 ;自機スピード } redraw : await 15 goto *メイン ;***************弾の準備**************** *弾の準備 if UG_STO_f = 0 { ;弾の動きを止めるフラグ if KN_f = 0 { ;フラグ KN_f = 1 ;弾のフラグを「立てる」 KN_x = TE_x ;自機狙い KN_y = 0 ;Yの高さ } if KN_f = 1 : KN_y + = 2 ;Yスピード if KN_y >= 390 { ;画面外に行ったら実効 KN_f = 0 ;クナイを「戻す」 } } return ;***************弾VS自機************** *弾VS自機 if KN_f = 1 { ;弾のフラグが「立ってたら実行」 if (TE_x < KN_x+2) AND (TE_x+2 > KN_x) AND (TE_y < KN_y+17) AND (TE_y+2 > KN_y) { KN_HIT += 1 ;弾のヒット数 MISU_c++ ;ミスカウンター JIKI_Spd = 0 ;自機のスピードを「無くす」 JIKI_STOP_f = 1 ;自機の動きを止めるフラグを「立てる」 UG_STO_f = 1 ;弾の動きを止めるフラグを「立てる」 if MISU_c < 3 : await 100 ;ミスカウンターが「3未満」ならスローになる if MISU_c >= 3 { ;ミスカウンターが「3」以上だったら「実行」 MISU_c = 0 ;ミスカウンターを「初期化」 UG_STO_f = 0 ;弾の動きを止めるフラグを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」 } } } 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 ;↓の移動 ;低速の位置 TE_x = JIKI_x+3 : TE_y = JIKI_y+2 return
----------------------------------------------------
なんでそもそも複数弾のソースを最初にあげたかと言うと、
複数弾の方でしか発生しておらず、複数弾による複数の当たり判定が原因なんじゃないかなーっとは思ってた。
その回避方法として、「弾を動かさない」「自機を動かさない」をやればできると思ったんだが・・・
ちょっと考えてくるかのー・・・



ZAP

リンク

2013/12/23(Mon) 22:40:37|NO.58862

被弾したら「食らいボム判定用フラグ」を立て、
「食らいボムチェック時間」を設定。
食らいボム判定フラグが立っている間は通常の当たり判定ではなく、
食らいボムチェック用サブに飛ぶようにすればシンプル?


#define KURAI_BOMB_TIME_MAX 60 ;食らいボムを受け付ける時間(フレーム数) screen 0,450,300 ;*****************情報****************** ;自機の座標 JIKI_x = 206 : JIKI_y = 230 KNI_MAX = 50 ;弾の最大数(50) dim KN_f,KNI_MAX ;弾のフラグ dim KN_x,KNI_MAX ;弾のX dim KN_y,KNI_MAX ;弾のY KuraiBombCheckFlag=0 ;食らいボム判定中フラグ KuraiBombCheckTime=0 ;食らいボム判定時間 ;****************メインループ*********** *メイン redraw 0 : color : boxf ;****************カウンター************* color ,255 pos 20,20 : mes "食らいボム判定中フラグ " + KuraiBombCheckFlag pos 20,40 : mes "食らいボム判定時間 " + KuraiBombCheckTime ;*************************************** gosub *自機の移動 gosub *弾の準備 if KuraiBombCheckFlag==0 :gosub *弾VS自機 :else :gosub *KuraiBombCheckSub ;変 更 箇 所 ;***************自機******************** ;自機表示 pos JIKI_x,JIKI_y : mes "□" ;低速表示 color 255,255 pos TE_x,TE_y : mes "#" ;弾表示 repeat KNI_MAX ;弾の最大数(50) color 255, pos KN_x(cnt),KN_y(cnt) : mes "●" loop ;*************低速移動****************** if JIKI_STOP_f = 0 { ;自機の動きを止めるフラグが「立ってたら実行」 JIKI_Spd = 4 ;自機スピード } redraw : await 15 goto *メイン ;****************弾の準備*************** *弾の準備 repeat KNI_MAX ;弾の最大数(50) if UG_STO_f = 0 { ;弾の動きを止めるフラグ KN_M = rnd(100) ;乱数 if KN_f(cnt) = 0 { ;フラグ KN_f(cnt) = 1 ;弾のフラグを「立てる」 KN_x(cnt) = KN_M ;乱数を入れる KN_y(cnt) = 0 ;Yの高さ } if KN_f(cnt) = 1 {;フラグが「立ってたら実行」 KN_x(cnt) += 0.02 * rnd(100);Xスピード KN_y(cnt) += 2;Yスピード } if KN_y(cnt) >= 390 { ;弾が下まで行ったら「実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 } }loop return ;*************弾VS自機**************** *弾VS自機 repeat KNI_MAX ;弾の最大数(50) if KN_f(cnt) = 1 {;弾のフラグが「立ってたら実行」 if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){ KuraiBombCheckFlag=1 ;食らいボムチェックフラグを立てる KuraiBombCheckTime=KURAI_BOMB_TIME_MAX ;食らいボムチェック時間を設定 break ;一発でも当たれば以降のチェックは不要のため、ループから抜ける } } loop return ;**************食らいボム判定処理*************** *KuraiBombCheckSub if key & 16 { ;食らいボムチェック中にスペースキーが押されたらボム発動 repeat KNI_MAX ;食らいボムが発動した証として全弾を消去 KN_f(cnt) = 0 loop ;------------------------------------ ;ボムの発射等、必要があればここで設定 ;------------------------------------ KuraiBombCheckFlag=0 ;食らいボムチェックフラグを降ろす KuraiBombCheckTime=0 ;食らいボムチェック時間を設定 } else { KuraiBombCheckTime-- if KuraiBombCheckTime==0 { ;スペースが押されないまま受付時間が終了したら、死亡 ;自機死亡処理 pos 185,150 color 255,255,255 mes "MISS!" redraw wait 100 KuraiBombCheckFlag=0 ;食らいボムチェックフラグを降ろす KuraiBombCheckTime=0 ;食らいボムチェック時間をリセット(特に必要ではない) JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」 repeat KNI_MAX ;全弾を消去 KN_f(cnt) = 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 ;↓の移動 ;低速の位置 TE_x = JIKI_x+3 : TE_y = JIKI_y+2 return



ZAP

リンク

2013/12/23(Mon) 22:47:52|NO.58863

ちなみに上のソースでは被弾してからボムが撃てずに死ぬまでの間も、
自機や敵弾の動きは変わりません。

スロー等の演出をするのであれば、KuraiBombCheckFlagの内容によって
自機や敵弾の移動処理に変化を持たせるとかの方法が考えられます。



ミント

リンク

2013/12/24(Tue) 21:51:05|NO.58869

ZAPさん

すいません><
ちょっとお返事まで少々時間がかかりそうです。

自分のプログラム改良してたら不具合発生しちゃって( ̄▽ ̄;
それ改善して落ち着いたら、ソース解析してどういう動きしているのか見ますね。



ミント

リンク

2013/12/25(Wed) 22:38:56|NO.58877

ようやくソースが修正できました。
-------------------------------------------------

screen 0,450,300 ;*****************情報****************** ;自機の座標 JIKI_x = 206 : JIKI_y = 230 KNI_MAX = 50 ;弾の最大数(50) dim KN_f,KNI_MAX ;弾のフラグ dim KN_x,KNI_MAX ;弾のX dim KN_y,KNI_MAX ;弾のY ;****************メインループ*********** *メイン redraw 0 : color : boxf ;****************カウンター************* color ,255 pos 250,20 : mes "弾のヒット数 " + KN_HIT pos 250,40 : mes "ミスカウント " + MISU_c pos 250,60 : mes "弾の動きを止める_F " + UG_STO_f pos 250,80 : mes "自機の動きを止める_F " + JIKI_STOP_f pos 250,100 : mes "ボム時間 " + BOM_J pos 250,120 : mes "弾消し時間 " + BOM_J pos 250,150 : mes "【Xキーでボム】" ;*************************************** gosub *ボム gosub *弾の準備 gosub *弾VS自機 gosub *自機の移動 gosub *弾消し ;***************自機******************** ;自機表示 pos JIKI_x,JIKI_y : mes "□" ;低速表示 color 255,255 pos TE_x,TE_y : mes "#" ;弾表示 repeat KNI_MAX ;弾の最大数(50) color 255, pos KN_x(cnt),KN_y(cnt) : mes "●" loop ;*************低速移動****************** if JIKI_STOP_f = 0 {;自機の動きを止めるフラグが「立って無かったら実行」 JIKI_Spd = 4 ;自機スピード } redraw : await 15 goto *メイン ;****************弾の準備*************** *弾の準備 repeat KNI_MAX ;弾の最大数(50) if UG_STO_f = 0 { ;弾の動きを止めるフラグ KN_M = rnd(100) ;乱数 if KN_f(cnt) = 0 { ;フラグ KN_f(cnt) = 1 ;弾のフラグを「立てる」 KN_x(cnt) = KN_M ;乱数を入れる KN_y(cnt) = 0 ;Y } if KN_f(cnt) = 1 {;フラグが「立ってたら実行」 KN_x(cnt) += 0.02 * rnd(100);Xスピード KN_y(cnt) += 2;Yスピード } if KN_y(cnt) >= 390 { ;弾が下まで行ったら「実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 } }loop return ;*************弾VS自機**************** *弾VS自機 repeat KNI_MAX ;弾の最大数(50) if KN_f(cnt) = 1 {;弾のフラグが「立ってたら実行」 if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){ KN_HIT += 1 ;弾のヒット数 MISU_c++ ;ミスカウンター JIKI_Spd = 0 ;自機のスピードを「無くす」 JIKI_STOP_f = 1 ;自機の動きを止めるフラグを「立てる」 UG_STO_f = 1 ;弾の動きを止めるフラグを「立てる」 if MISU_c < 15 : await 100 ;ミスカウンターが「15未満」ならスローになる if MISU_c >= 15 { ;ミスカウンターが「15」以上だったら「実行」 MISU_c = 0 ;ミスカウンターを「初期化」 UG_STO_f = 0 ;弾の動きを止めるフラグを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」 TE_x = JIKI_x+3 : TE_y = JIKI_y+2 ;低速の位置を「初期化」 TAMA_KSU_f = 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 ;↓の移動 ;低速の位置 TE_x = JIKI_x+3 : TE_y = JIKI_y+2 return ;****************弾消し***************** *弾消し if TAMA_KSU_f = 1 : DR_c += 1 ;弾消しフラグが「立ってたら」、弾消しカウントを数える if DR_c >= 100 { ;弾消しカウントが「100」以上行ったら「実行」 DR_c = 0 ;弾消しカウントを「初期化」 TAMA_KSU_f = 0 ;弾消しフラグを「初期化」 } ;弾を消す repeat KNI_MAX ;弾の最大数(10) if TAMA_KSU_f = 1 { ;弾消しフラグが「立ってたら実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 }loop return ;*****************ボム****************** *ボム getkey Xkey,88 ;Xキー if Xkey = 1 AND BOM_J = 0 { ;Xキーが押されたとき、ボムの時間が「0」とき「実行」 BO_F = 1 ;ボムフラグを「立てる」 } repeat KNI_MAX ;弾の最大数(10) if BO_F = 1 { ;ボムを打ったら「実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 UG_STO_f = 0 ;動きを止めるフラグを「初期化」 MISU_c = 0 ;ミスカウンターを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 }loop if BO_F = 1 : BOM_J++ ;ボムの時間を加算する if BOM_J >= 101 { ;ボムの時間が「101」以上いったら「実行」 BOM_J = 0 ;ボムの時間を「リセット」 BO_F = 0 ;ボムフラグを「初期化」 } return
------------------------------------------------
 ■変更点■
・「MISU_c」カウンターの条件を15に変更 (デバッグするために数値増加)
・当たり判定の中に
TE_x = JIKI_x+3 : TE_y = JIKI_y+2 ;低速の位置を「初期化」
TAMA_KSU_f = 1 ;弾消しフラグを「立てる」
を追加。
・「*弾消し」「*ボム」追加

弾消しや、ボムに関して色々心配させれてたので追加してみた。
これで弾に当たっている最終にボムを打てば弾が吹っ飛ぶ仕組みです。
空ループに関しては、問題が解決したら追加します。

弾を吹っ飛んだり、弾に当たると、弾がキモイ動きをしますが問題ございません。
弾のふっとばしは全て画面外で処理するので大丈夫です。


っとまぁ、ようやく「ZAP」さんのソースを見れます。
ちらっと見た感じだと、私の頭の中のイメージ(仕様)が伝えきれなかった可能性がががががが。
解析までお時間がかかるかも?



ミント

リンク

2013/12/27(Fri) 19:07:32|NO.58912

ZAPさん

ソースありがとうございます。
ふむふむこんなやりかたもあるのか。
弾が動くとアウトなので、動かないようにするフラグを立てる必要がありますね。

やはり私がやりたかった意図が伝わりきれてませんでしたね・・・
っというか今思えば「スロー演出」が必要だったのか?そこも考える必要もあったようです。
そういえばいつも書く「やりたいこと」みたいなのを書いていませんでしたね・・・う〜ん。
ちょいと「No.58877」での私のソースと、ZAPさんのソースとで見比べなからデバッグしてみます。


本ソースに適応して問題が見つからなかったら解決にしたいと思います。
また何かあったら追記しときます。



ZAP

リンク

2013/12/27(Fri) 23:46:48|NO.58919

私の提示したスクリプトでは、極力シンプルにするために、
被弾してから死ぬまでの猶予時間を設けただけにすぎません。
ボムも、敵弾を消去するだけですし。

被弾した際に敵や自機の挙動を変えるのであれば、
どういう流れになるのかイメージできる情報が欲しかったですね。

例えば被弾して食らいボム判定が出現したら、
その間は一定時間敵や自機が止まるのか?スローになるのか?ってことや

そもそものボムの効果はどうなのか、
弾を消すのか、自機が無敵になるだけで弾は消さないのか、
あるいは弾を反射するリフレクトボムみたいな
特殊なギミックを搭載するのか、などなど。

新しいサンプルスクリプトを見ても、最終形としてどういうものを
望んでいるか、まだ解らないんですよね。



ミント

リンク

2013/12/30(Mon) 10:35:58|NO.58981

だいぶ遅くなりましたがなんとか望みどおりの動作になりそうです。
全てのソースに適応してないから不具合がでるかもしれませんが、そのときになったらまた考えます。
もし、その不具合が解決出来そうになかったらまたよろしくお願いいたします。

答えてくれた方々ありがとうございます。
ソースでもはっつけて、さっさと全ソース適応させねば・・・


 ■やりかたかったこと&仕様■ (最初に言えばよかったね・・・)
・弾と当たった時、弾と自機は動かなくなる
・弾と当たった時、時間を数える
・時間が経過したら、自機の残機が減る
・時間経過中にボムを打ったら、自機の残機は減らない
・ボムを打ったら、画面全体の弾を消す
・ボム中は自機は無敵で、ボム時間が経過したら自機無敵は消える

スロー処理はよく考えたら演出面でどうにかなりそうなので、スロー処理の仕様はなくします
(不具合の元になりそうだし、やりたいことは出来ているので)
ZAPさんのソースを元に改造したのがこちらになります。

screen 0,450,300 ;*****************情報****************** ;自機の座標 JIKI_x = 206 : JIKI_y = 230 KNI_MAX = 50 ;弾の最大数(50) dim KN_f,KNI_MAX ;弾のフラグ dim KN_x,KNI_MAX ;弾のX dim KN_y,KNI_MAX ;弾のY ;****************メインループ*********** *メイン redraw 0 : color : boxf ;****************カウンター************* color ,255 pos 250,20 : mes "弾のヒット数 " + KN_HIT pos 250,40 : mes "ミスカウント " + MISU_c pos 250,60 : mes "弾消しカウント " + DR_c pos 250,80 : mes "ボム時間 " + BOM_J pos 250,110 : mes "弾消しフラグ " + TAMA_KSU_f pos 250,130 : mes "弾の動きを止める_F " + UG_STO_f pos 250,150 : mes "自機の動きを止める_F " + JIKI_STOP_f pos 250,170 : mes "食らいボムチェック_F " + KURAI_BM_F pos 250,200 : mes "【Xキーでボム】" ;*************************************** gosub *ボム gosub *弾の準備 gosub *弾VS自機 gosub *自機の移動 gosub *弾消し ;***************自機******************** ;自機表示 pos JIKI_x,JIKI_y : mes "□" ;低速表示 color 255,255 pos TE_x,TE_y : mes "#" ;弾表示 repeat KNI_MAX ;弾の最大数(50) color 255, if KN_f(cnt) = 1 { ;弾フラグが「立ってたら実行」 pos KN_x(cnt),KN_y(cnt) : mes "●" }loop ;*************低速移動****************** if JIKI_STOP_f = 0 {;自機の動きを止めるフラグが「立って無かったら実行」 JIKI_Spd = 4 ;自機スピード } redraw : await 15 goto *メイン ;****************弾の準備*************** *弾の準備 repeat KNI_MAX ;弾の最大数(50) if UG_STO_f = 0 { ;弾の動きを止めるフラグ KN_M = rnd(100) ;乱数 if KN_f(cnt) = 0 { ;フラグ KN_f(cnt) = 1 ;弾のフラグを「立てる」 KN_x(cnt) = KN_M ;乱数を入れる KN_y(cnt) = 0 ;Y } if KN_f(cnt) = 1 {;フラグが「立ってたら実行」 KN_x(cnt) += 0.02 * rnd(100);Xスピード KN_y(cnt) += 2;Yスピード } if KN_y(cnt) >= 390 { ;弾が下まで行ったら「実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 } }loop return ;*************弾VS自機**************** *弾VS自機 repeat KNI_MAX ;弾の最大数(50) if KN_f(cnt) = 1 {;弾のフラグが「立ってたら実行」 if (TE_x < KN_x(cnt)+6) AND (TE_x+2 > KN_x(cnt)) AND (TE_y < KN_y(cnt)+6) AND (TE_y+2 > KN_y(cnt)){ KN_HIT += 1 ;弾のヒット数 JIKI_Spd = 0 ;自機のスピードを「無くす」 JIKI_STOP_f = 1 ;自機の動きを止めるフラグを「立てる」 UG_STO_f = 1 ;弾の動きを止めるフラグを「立てる」 TAMA_KSU_f = 1 ;弾消しフラグを「立てる」 KURAI_BM_F = 1 ;食らいボムチェックフラグを「立てる」 } }loop return ;****************弾消し***************** *弾消し if TAMA_KSU_f = 1 : DR_c += 1 ;弾消しフラグが「立ってたら」、弾消しカウントを数える if DR_c >= 100 { ;弾消しカウントが「100」以上行ったら「実行」 DR_c = 0 ;弾消しカウントを「初期化」 TAMA_KSU_f = 0 ;弾消しフラグを「初期化」 } ;弾を消す repeat KNI_MAX ;弾の最大数(10) if DR_c >= 50 { ;弾消しカウントが「50」以上行ったら「実行」 KN_f(cnt) = 0 ;弾のフラグを「初期化」 }loop return ;*****************ボム****************** *ボム getkey Xkey,88 ;Xキー if Xkey = 1 AND BOM_J = 0 { ;Xキーが押されたとき、ボムの時間が「0」とき「実行」 BO_F = 1 ;ボムフラグを「立てる」 } if BO_F = 1 { ;ボムを打ったら「実行」 repeat KNI_MAX ;弾の最大数(10) KN_f(cnt) = 0 ;弾のフラグを「初期化」 UG_STO_f = 0 ;動きを止めるフラグを「初期化」 MISU_c = 0 ;ミスカウンターを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 KURAI_BM_F = 0 ;食らいボムチェックフラグを「初期化」 loop } else { if KURAI_BM_F = 1 { ;食らいボムチェックフラグが「立ってたら実行」 MISU_c++ ;ミスカウンター if MISU_c = 50 { ;ミスカウンターが「50」になったら「実行」 MISU_c = 0 ;ミスカウンターを「初期化」 JIKI_STOP_f = 0 ;自機の動きを止めるフラグを「初期化」 UG_STO_f = 0 ;弾の動きを止めるフラグを「初期化」 KURAI_BM_c = 0 ;食らいボムチェック時間を「初期化」 KURAI_BM_F = 0 ;食らいボムチェックフラグを「初期化」 JIKI_x = 256 : JIKI_y = 230 ;自機をスタート地点に「戻す」 } } if BO_F = 1 : BOM_J++ ;ボムの時間を加算する if BOM_J >= 101 { ;ボムの時間が「101」以上いったら「実行」 BOM_J = 0 ;ボムの時間を「リセット」 BO_F = 0 ;ボムフラグを「初期化」 } 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 ;↓の移動 ;低速の位置 TE_x = JIKI_x+3 : TE_y = JIKI_y+2 return



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