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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0819
ミントフラグの管理について5解決


ミント

リンク

2012/8/19(Sun) 19:31:52|NO.48689

どうもお久しぶりです。


STG作っているのですがどうもフラグ管理がうまくいかなくって困っています。
今回説明が難しいのでこういう形式にしてみました。わかりづらかったらすいませんorz

結論を言うと・・・
【1匹敵を倒す → アイテム下降中に取得する → 2匹目の敵を倒す → アイテムが上昇しない】
です。

そんなわけでアドバイス等ありましたら教えてほしいです。
それではよろしくお願いいたします。
 


 〜悩んでいる箇所〜
・アイテムを取得したときフラグを0だと、121行目のアイテム上下カウントが機能しない。
(アイテム消しのフラグ管理は194行目「AI_f(cnt) = 0」)

・「AI_f(cnt) = 0」が3とかだと「if AI_f(cnt) not= 0」という式なので0以外で実行しちゃう。


 〜仕様〜
1:敵を倒すとアイテムが2個出ます。
2:そのアイテムは上昇したのち下降します。
3:アイテムの種類によって点数が違います(P=10点、点=5万点)
4:その種類は177行目の「AI_f(cnt)」で決定します。
5:なので0以外の実行になっております(1番=P)(2番=点)
6:アイテム取得エリアに触ると、アイテムを自動取得します (東方の一番上エリア再現)
-------------------------

/*/ 〜個人的な解釈〜 アイテムを取得したさい「AI_f(cnt) = 0」にしてその番号(cnt)を実行させない。 アイテム発生が「if AI_c == 2 : break」2回しかおこなわれない。 例)AI_f(1) = 1, AI_f(2) = 2 → 2回ループしたのち脱出→ 取得 AI_f(1) = 0 , 取得 AI_f(2) = 0 なのでcnt(0)から数えられてしまうので「AI_TIM(cnt)」の「cnt(0)」が実行されるみたい? /*/ ///コメントを外すと、別フラグが起動します ((別フラグ起動)で検索)/// ///ですが邪魔なだけになっちゃいそうなので消しちゃっていいです。無駄な考えだと思いますのでorz/// screen 0,640,480 ;自機の情報 JIKI_x = 100 : JIKI_y = 450 ;自機の座標 MY_Spd = 3 ;スピード ;敵の情報 TK_MAX = 5 ;敵の最大数(5) dim TK_f,TK_MAX ;フラグ dim TK_x,TK_MAX ;X dim TK_y,TK_MAX ;Y ;敵のアイテム AI_MAX = 100 ;アイテムの最大数(100) dim AI_f,AI_MAX ;フラグ dim AI_x,AI_MAX ;X dim AI_y,AI_MAX ;Y dim AI_Jc,AI_MAX ;アイテムの上昇 dim AI_TI_dai,AI_MAX ;アイテム数値代入用 // dim AI_TIM_f,AI_MAX ;アイテムタイム用フラグ (別フラグ起動) ;取得点数の情報 dim TN_G_f,AI_MAX ;フラグ dim TN_G_x,AI_MAX ;X dim TN_G_y,AI_MAX ;Y dim AI_TIM,AI_MAX ;点数を表示するカウント ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 0,0 : mes "【アイテムフラグ】 " pos 20,20 : mes "AI_f(0) " + AI_f(0) pos 20,40 : mes "AI_f(1) " + AI_f(1) pos 20,60 : mes "AI_f(2) " + AI_f(2) pos 20,80 : mes "AI_f(3) " + AI_f(3) pos 20,100 : mes "AI_f(4) " + AI_f(4) pos 20,120 : mes "AI_f(5) " + AI_f(5) pos 20,140 : mes "AI_f(6) " + AI_f(6) pos 20,160 : mes "AI_f(7) " + AI_f(7) pos 20,180 : mes "AI_f(8) " + AI_f(8) pos 20,200 : mes "AI_f(9) " + AI_f(9) /*/ (別フラグ起動) pos 150,0 : mes "【アイテムタイム用フラグ】 " pos 180,20 : mes "AI_TIM_f(0) " + AI_TIM_f(0) pos 180,40 : mes "AI_TIM_f(1) " + AI_TIM_f(1) pos 180,60 : mes "AI_TIM_f(2) " + AI_TIM_f(2) pos 180,80 : mes "AI_TIM_f(3) " + AI_TIM_f(3) pos 180,100 : mes "AI_TIM_f(4) " + AI_TIM_f(4) pos 180,120 : mes "AI_TIM_f(5) " + AI_TIM_f(5) pos 180,140 : mes "AI_TIM_f(6) " + AI_TIM_f(6) pos 180,160 : mes "AI_TIM_f(7) " + AI_TIM_f(7) pos 180,180 : mes "AI_TIM_f(8) " + AI_TIM_f(8) pos 180,200 : mes "AI_TIM_f(9) " + AI_TIM_f(9) /*/ ;*************************************** gosub *自機弾の移動 gosub *自機移動 gosub *敵の処理 ;あたり判定 gosub *敵VS自機弾 gosub *敵アイテムVS自機 gosub *アイテム回収 ;アイテムあたり判定(アイテム自動回収) UE_ERA_x = 30 : UE_ERA_y = 220 ;エリア座標 color 100,100,100 : boxf UE_ERA_x, UE_ERA_y, 410, 400 ;アイテムを取得したとき点数表示 repeat AI_MAX ;アイテムの最大数(100) if TN_G_f(cnt) = 1 { ;点数表示のフラグ pos TN_G_x(cnt), TN_G_y(cnt) ;座標 if AI_TI_dai(cnt) = 1 : color 255, : mes "10" ;P if AI_TI_dai(cnt) = 2 : color ,255,255 : mes "50000" ;点 ///↓コメントアウトを消した場合これを消す↓/// (別フラグ起動) AI_TIM(cnt) += 1 ;アイテムを表示するカウント if AI_TIM(cnt) >= 100 { AI_TIM(cnt) = 0 ;アイテムを表示するカウントをリセットする TN_G_f(cnt) = 0 ;点数表示を消す } ///↑コメントアウトを消した場合これを消す↑/// (別フラグ起動) }loop ;アイテムの表示タイム /*/ (別フラグ起動) repeat AI_MAX ;アイテムの最大数(100) if AI_TIM_f(cnt) = 1 { ;アイテムタイム用フラグ AI_TIM(cnt) += 1 ;アイテムを表示するカウント if AI_TIM(cnt) >= 100 { AI_TIM(cnt) = 0 ;アイテムを表示するカウントをリセットする TN_G_f(cnt) = 0 ;点数表示を消す AI_TIM_f(cnt) = 0;アイテムタイム用フラグ } }loop /*/ ;敵アイテム表示 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;0以外の時実行 (==と逆の意味) pos AI_x(cnt), AI_y(cnt) ;座標 if AI_f(cnt) = 1 : color 255, : mes "P" if AI_f(cnt) = 2 : color ,255,255 : mes "点" }loop ;アイテムの上下 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;0以外の時実行 (==と逆の意味) if AI_Jc(cnt) <= 100 { ;上昇カウンター AI_y(cnt) -= 1 ;アイテムを↑に移動させる AI_Jc(cnt) += 1 ;上昇カウンターを数える } } if AI_Jc(cnt) >= 100 : AI_y(cnt) += 1 ;カウントが100以上になったら、アイテムを↓に移動させる loop ;自機表示 pos JIKI_x,JIKI_y : color 255,,255 : mes "自" ;敵の表示 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 1 { ;フラグ pos TK_x(cnt), TK_y(cnt) color 255 : mes "敵" }loop ;自機弾を表示 if SHOT = 1 { ;フラグ pos SX,SY : color 255,255 : mes "弾" } redraw 1 : await 15 goto *メイン ;****************敵の処理*************** *敵の処理 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 0 { ;敵のフラグ TK_f(cnt) = 1 ;敵のフラグ TK_x(cnt) = 100 ;1匹目敵X if cnt = 1 : TK_x(cnt) = 160 ;2匹目の敵X if cnt = 2 : TK_x(cnt) = 220 ;3匹目の敵X if cnt = 3 : TK_x(cnt) = 280 ;4匹目の敵X if cnt = 4 : TK_x(cnt) = 340 ;5匹目の敵Y TK_y(cnt) = 410 ;敵Y }loop return ;*************敵VS自機弾************** *敵VS自機弾 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 1 AND SHOT = 1 { if (TK_x(cnt) < SX+11) and (TK_x(cnt)+58 > SX) and (TK_y(cnt) < SY+11) and (TK_y(cnt)+45 > SY) { SHOT = 0 ;自機弾フラグ TK_f(cnt) = 2 ;敵を消す ;アイテム AI_c = 0 ;アイテムフラグをオンにした回数 TK_c = cnt ;cntの値を保持 (敵の数を収納) ;敵のアイテム情報 if TK_f(cnt) = 2 { ;で敵が消えたら実行する repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) = 0 { ;アイテムフラグ AI_f(cnt) = rnd(2) + 1 ;アイテムのフラグ(値はアイテムの種類) AI_TI_dai(cnt) = AI_f(cnt) ;アイテム数値(代入用) AI_x(cnt) = TK_x(TK_c) + AI_c*15 ;アイテムのX AI_y(cnt) = TK_y(TK_c) ;アイテムのY AI_c ++ if AI_c == 2 : break ;同時に表示するアイテムの上限数に達したらループを抜ける }loop } } }loop return ;************敵アイテムVS自機********* *敵アイテムVS自機 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;アイテムが0以外なら、実行 if (JIKI_x < AI_x(cnt)+16) and (JIKI_x+29 > AI_x(cnt)) and (JIKI_y < AI_y(cnt)+16) and (JIKI_y+42 > AI_y(cnt)) { AI_f(cnt) = 0 ;アイテムを消す //AI_TIM_f(cnt) = 1 ;アイテムタイム用フラグ (別フラグ起動) ;点数表示 if KOU_TEN_f = 1 { ;高得点のフラグ TN_G_f(cnt) = 1 ;点数表示のフラグをオン TN_G_x(cnt) = AI_x(cnt) ;アイテムXを,点数表示Xに代入 TN_G_y(cnt) = AI_y(cnt) ;アイテムYを,点数表示Yに代入 } } }loop return ;*************アイテム回収************** *アイテム回収 if(UE_ERA_x < JIKI_x+8) AND (UE_ERA_x+380 > JIKI_x ) AND (UE_ERA_y < JIKI_y+7) AND (UE_ERA_y+180 > JIKI_y) { KOU_TEN_f = 1 ;高得点のフラグ }else{ KOU_TEN_f = 0 ;高得点のフラグ } repeat AI_MAX ;アイテムの最大数(100) if KOU_TEN_f = 1 { ;高得点エリアに侵入したら、アイテムが自機によってくる DK_angle = 0.0 ;実数型で初期化。角度を入れる変数。 DK_angle = atan( JIKI_x - AI_x(cnt), JIKI_y - AI_y(cnt) ) ;アイテムと自機との角度を求める AI_x(cnt) += 40.0 * sin( DK_angle ) ;0.0はアイテムの移動速さ AI_y(cnt) += 40.0 * cos( DK_angle ) ;0.0はアイテムの移動速さ }loop return ;**************自機移動***************** *自機移動 stick key,15 if key & 1 : JIKI_x - MY_Spd ;←のスピード if key & 2 : JIKI_y - MY_Spd ;↑のスピード if key & 4 : JIKI_x + MY_Spd ;→のスピード if key & 8 : JIKI_y + MY_Spd ;↓のスピード return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and SHOT = 0 { SHOT = 1 ;フラグ SX = JIKI_x ;X SY = JIKI_y ;Y } if SHOT = 1 : SY -= 15 ;スピード if SY < 0 : SHOT = 0 ;↑までいったらフラグを戻す return



この記事に返信する


暇人

リンク

2012/8/19(Sun) 20:12:20|NO.48690

> dim AI_Jc,AI_MAX ;アイテムの上昇
AI_Jc(cnt)は使いまわすんだから使用開始か終わりに初期化(0を代入)する必要がある
データ表示しとけば直ぐに分かったと思う



ミント

リンク

2012/8/20(Mon) 21:00:38|NO.48705

>>暇人さん
>>AI_Jc(cnt)は使いまわすんだから使用開始か終わりに初期化(0を代入)する必要がある
あぁ、なるほど!その方法なら(cnt)内が0番でも動作できるのですね。
うわー・・・やっちまったなー・・・もったいない。

*敵アイテムVS自機
の当たり判定のところに「AI_Jc(cnt) = 0 ;アイテムの上昇を戻す」入れて問題なかったのでおkです!


>>データ表示しとけば直ぐに分かったと思う
まったくそのとおりですね。
自分の中で「フラグの管理?」「それとも条件式を変える?」という考えで
頭の中をぐるぐる回ってました。



今度迷ったときは全てのデーターを表示して確認するのがよさそうですね (`・ω・´)
勉強になりました!ありがとうございます!!


 〜余談〜
しかしチェック中に新しい物を発見してしまった・・・
【1匹敵を倒す → アイテムを取得 → その後2匹目を即効で倒す →
1匹目のアイテム点数表示が、2匹目のアイテム情報が代入されてしまっている】

こちら別問題ですので、悩んできますね!



ミント

リンク

2012/8/22(Wed) 20:39:22|NO.48752

一応余談の不具合?解決報告。



>>【1匹敵を倒す → アイテムを取得 → その後2匹目を即効で倒す →
>>1匹目のアイテム点数表示が、2匹目のアイテム情報が代入されてしまっている】
どうやらアイテムの情報を0にするタイミングが悪かったみたいです。


「AI_f(cnt) = 0」を

if AI_TIM(cnt) >= 100 { AI_TIM(cnt) = 0 ;アイテムを表示するカウントをリセットする TN_G_f(cnt) = 0 ;点数表示を消す AI_f(cnt) = 0 ;アイテムを消す }
ここにいれればおkでした。
しかしこれだと「自動取得」によって(AI_f(cnt) = 0)が表示タイムすぎるまで存在してしまうため
(AI_f(cnt) = 0)を再度取得してしまいます。

そこでゲーム画面外に吹っ飛ばす案が浮かびました。
けれどそれだけだと「自動取得」によって吸収してしまうので、吹っ飛ばし単品だとNGです。


そこで「AI_TME_f(cnt) = 1 ;取得させないフラグ」を新しく製作。
「if AI_TME_f(cnt) = 0 」条件式を入れれば(0)番とかがフラグ1立っていると
「自動取得」は実行されない仕組みです。

まだまだ無駄があると思いますが無事解決できました。

screen 0,640,480 ;自機の情報 JIKI_x = 50 : JIKI_y = 430 ;自機の座標 MY_Spd = 3 ;スピード ;敵の情報 TK_MAX = 5 ;敵の最大数(5) dim TK_f,TK_MAX ;フラグ dim TK_x,TK_MAX ;X dim TK_y,TK_MAX ;Y ;敵のアイテム AI_MAX = 100 ;アイテムの最大数(100) dim AI_f,AI_MAX ;フラグ dim AI_x,AI_MAX ;X dim AI_y,AI_MAX ;Y dim AI_Jc,AI_MAX ;アイテムの上昇 dim AI_TI_dai,AI_MAX ;アイテム数値代入用 dim AI_TME_f,AI_MAX ;自動取得させないためのフラグ ;取得点数の情報 dim TN_G_f,AI_MAX ;フラグ dim TN_G_x,AI_MAX ;X dim TN_G_y,AI_MAX ;Y dim AI_TIM,AI_MAX ;点数を表示するカウント ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 0,0 : mes "【アイテムフラグ】 " pos 20,20 : mes "AI_f(0) " + AI_f(0) pos 20,40 : mes "AI_f(1) " + AI_f(1) pos 20,60 : mes "AI_f(2) " + AI_f(2) pos 20,80 : mes "AI_f(3) " + AI_f(3) pos 150,0 : mes "【アイテム数値代入用】 " pos 180,20 : mes "AI_TI_dai(0) " + AI_TI_dai(0) pos 180,40 : mes "AI_TI_dai(1) " + AI_TI_dai(1) pos 180,60 : mes "AI_TI_dai(2) " + AI_TI_dai(2) pos 180,80 : mes "AI_TI_dai(3) " + AI_TI_dai(3) pos 330,0 : mes "【取得点数の情報】 " pos 350,20 : mes "TN_G_f(0) " + TN_G_f(0) pos 350,40 : mes "TN_G_f(1) " + TN_G_f(1) pos 350,60 : mes "TN_G_f(2) " + TN_G_f(2) pos 350,80 : mes "TN_G_f(3) " + TN_G_f(3) pos 480,0 : mes "【アイテム上昇】 " pos 500,20 : mes "AI_Jc(0) " + AI_Jc(0) pos 500,40 : mes "AI_Jc(1) " + AI_Jc(1) pos 500,60 : mes "AI_Jc(2) " + AI_Jc(2) pos 500,80 : mes "AI_Jc(3) " + AI_Jc(3) ;*************************************** gosub *自機弾の移動 gosub *自機移動 gosub *敵の処理 ;あたり判定 gosub *敵VS自機弾 gosub *敵アイテムVS自機 gosub *アイテム回収 ;アイテムあたり判定(アイテム自動回収) UE_ERA_x = 30 : UE_ERA_y = 220 ;エリア座標 color 100,100,100 : boxf UE_ERA_x, UE_ERA_y, 410, 400 ;アイテムを取得したとき点数表示 repeat AI_MAX ;アイテムの最大数(100) if TN_G_f(cnt) = 1 { ;点数表示のフラグ pos TN_G_x(cnt), TN_G_y(cnt) ;座標 if AI_TI_dai(cnt) = 1 : color 255, : mes "10" ;P if AI_TI_dai(cnt) = 2 : color ,255,255 : mes "50000" ;点 AI_TIM(cnt) += 1 ;アイテムを表示するカウント if AI_TIM(cnt) >= 100 { AI_TIM(cnt) = 0 ;アイテムを表示するカウントをリセットする TN_G_f(cnt) = 0 ;点数表示を消す AI_f(cnt) = 0 ;アイテムを消す AI_TME_f(cnt) = 0 ;取得させないフラグ AI_Jc(cnt) = 0 ;アイテムの上昇を戻す } }loop ;敵アイテム表示 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;0以外の時実行 (==と逆の意味) pos AI_x(cnt), AI_y(cnt) ;座標 if AI_f(cnt) = 1 : color 255, : mes "P" if AI_f(cnt) = 2 : color ,255,255 : mes "点" }loop ;アイテムの上下 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;0以外の時実行 (==と逆の意味) if AI_Jc(cnt) <= 100 { ;上昇カウンター AI_y(cnt) -= 1 ;アイテムを↑に移動させる AI_Jc(cnt) += 1 ;上昇カウンターを数える } } if AI_Jc(cnt) >= 100 : AI_y(cnt) += 1 ;カウントが100以上になったら、アイテムを↓に移動させる loop ;自機表示 pos JIKI_x,JIKI_y : color 255,,255 : mes "自" ;敵の表示 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 1 { ;フラグ pos TK_x(cnt), TK_y(cnt) color 255 : mes "敵" }loop ;自機弾を表示 if SHOT = 1 { ;フラグ pos SX,SY : color 255,255 : mes "弾" } redraw 1 : await 15 goto *メイン ;****************敵の処理*************** *敵の処理 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 0 { ;敵のフラグ TK_f(cnt) = 1 ;敵のフラグ TK_x(cnt) = cnt*40 + 50 ;敵X TK_y(cnt) = 380 ;敵Y }loop return ;*************敵VS自機弾************** *敵VS自機弾 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 1 AND SHOT = 1 { if (TK_x(cnt) < SX+11) and (TK_x(cnt)+58 > SX) and (TK_y(cnt) < SY+11) and (TK_y(cnt)+45 > SY) { SHOT = 0 ;自機弾フラグ TK_f(cnt) = 2 ;敵を消す ;アイテム AI_c = 0 ;アイテムフラグをオンにした回数 TK_c = cnt ;cntの値を保持 (敵の数を収納) ;敵のアイテム情報 if TK_f(cnt) = 2 { ;で敵が消えたら実行する repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) = 0 { ;アイテムフラグ AI_f(cnt) = rnd(2) + 1 ;アイテムのフラグ(値はアイテムの種類) AI_TI_dai(cnt) = AI_f(cnt) ;アイテム数値(代入用) AI_x(cnt) = TK_x(TK_c) + AI_c*15 ;アイテムのX AI_y(cnt) = TK_y(TK_c) ;アイテムのY AI_c ++ if AI_c == 2 : break ;同時に表示するアイテムの上限数に達したらループを抜ける }loop } } }loop return ;************敵アイテムVS自機********* *敵アイテムVS自機 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;アイテムが0以外なら、実行 if (JIKI_x < AI_x(cnt)+16) and (JIKI_x+29 > AI_x(cnt)) and (JIKI_y < AI_y(cnt)+16) and (JIKI_y+42 > AI_y(cnt)) { ;点数表示 if KOU_TEN_f = 1 { ;高得点のフラグ TN_G_f(cnt) = 1 ;点数表示のフラグをオン TN_G_x(cnt) = AI_x(cnt) ;アイテムXを,点数表示Xに代入 TN_G_y(cnt) = AI_y(cnt) ;アイテムYを,点数表示Yに代入 } AI_x(cnt) = 500 ;アイテムを画面外に飛ばす AI_TME_f(cnt) = 1 ;取得させないフラグ } }loop return ;*************アイテム回収************** *アイテム回収 if(UE_ERA_x < JIKI_x+8) AND (UE_ERA_x+380 > JIKI_x ) AND (UE_ERA_y < JIKI_y+7) AND (UE_ERA_y+180 > JIKI_y) { KOU_TEN_f = 1 ;高得点のフラグ }else{ KOU_TEN_f = 0 ;高得点のフラグ } repeat AI_MAX ;アイテムの最大数(100) if AI_TME_f(cnt) = 0 { ;取得させないフラグ if KOU_TEN_f = 1 { ;高得点エリアに侵入したら、アイテムが自機によってくる DK_angle = 0.0 ;実数型で初期化。角度を入れる変数。 DK_angle = atan( JIKI_x - AI_x(cnt), JIKI_y - AI_y(cnt) ) ;アイテムと自機との角度を求める AI_x(cnt) += 40.0 * sin( DK_angle ) ;0.0はアイテムの移動速さ AI_y(cnt) += 40.0 * cos( DK_angle ) ;0.0はアイテムの移動速さ } }loop return ;**************自機移動***************** *自機移動 stick key,15 if key & 1 : JIKI_x - MY_Spd ;←のスピード if key & 2 : JIKI_y - MY_Spd ;↑のスピード if key & 4 : JIKI_x + MY_Spd ;→のスピード if key & 8 : JIKI_y + MY_Spd ;↓のスピード return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and SHOT = 0 { SHOT = 1 ;フラグ SX = JIKI_x ;X SY = JIKI_y ;Y } if SHOT = 1 : SY -= 15 ;スピード if SY < 0 : SHOT = 0 ;↑までいったらフラグを戻す return



暇人

リンク

2012/8/23(Thu) 19:37:37|NO.48768

NO.48752のは本番に実装すると致命的なバグがあるね
得点表示ない時にはAI_f(cnt) = 0 がされないから
どんどん使える数が減る

後、これはバグと言うよりちょっとゲーム的に良くないんじゃないかと思うところ
アイテムと得点表示の要素数を同期してるから
アイテム数+得点表示数=AI_MAX
になってしまってる


取得した時にアイテム削除するので不要になった配列や処理をコメントアウトして
得点表示をアイテム要素とは完全に切り離したやりかた
/**/のある行が変更や追加部分(/*この間に変更前の処理を書いてる*/)

screen 0,640,480 ;自機の情報 JIKI_x = 50 : JIKI_y = 430 ;自機の座標 MY_Spd = 3 ;スピード ;敵の情報 TK_MAX = 5 ;敵の最大数(5) dim TK_f,TK_MAX ;フラグ dim TK_x,TK_MAX ;X dim TK_y,TK_MAX ;Y ;敵のアイテム AI_MAX = 100 ;アイテムの最大数(100) dim AI_f,AI_MAX ;フラグ dim AI_x,AI_MAX ;X dim AI_y,AI_MAX ;Y dim AI_Jc,AI_MAX ;アイテムの上昇 ;dim AI_TI_dai,AI_MAX ;アイテム数値代入用 ;dim AI_TME_f,AI_MAX ;自動取得させないためのフラグ ;取得点数の情報 dim TN_G_f,AI_MAX ;フラグ dim TN_G_x,AI_MAX ;X dim TN_G_y,AI_MAX ;Y dim AI_TIM,AI_MAX ;点数を表示するカウント ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 0,0 : mes "【アイテムフラグ】 " pos 20,20 : mes "AI_f(0) " + AI_f(0) pos 20,40 : mes "AI_f(1) " + AI_f(1) pos 20,60 : mes "AI_f(2) " + AI_f(2) pos 20,80 : mes "AI_f(3) " + AI_f(3) pos 150,0 : mes "【アイテム表示数】 " pos 180,20 : mes "aicnt " + aicnt pos 150,40 : mes "【取得点表示数】 " pos 180,60 : mes "tngcnt " + tngcnt pos 330,0 : mes "【取得点数の情報】 " pos 350,20 : mes "TN_G_f(0) " + TN_G_f(0) pos 350,40 : mes "TN_G_f(1) " + TN_G_f(1) pos 350,60 : mes "TN_G_f(2) " + TN_G_f(2) pos 350,80 : mes "TN_G_f(3) " + TN_G_f(3) pos 480,0 : mes "【アイテム上昇】 " pos 500,20 : mes "AI_Jc(0) " + AI_Jc(0) pos 500,40 : mes "AI_Jc(1) " + AI_Jc(1) pos 500,60 : mes "AI_Jc(2) " + AI_Jc(2) pos 500,80 : mes "AI_Jc(3) " + AI_Jc(3) ;*************************************** gosub *自機弾の移動 gosub *自機移動 gosub *敵の処理 ;あたり判定 gosub *敵VS自機弾 gosub *敵アイテムVS自機 gosub *アイテム回収 ;アイテムあたり判定(アイテム自動回収) UE_ERA_x = 30 : UE_ERA_y = 220 ;エリア座標 color 100,100,100 : boxf UE_ERA_x, UE_ERA_y, 410, 400 ;アイテムを取得したとき点数表示 tngcnt=0 /**/ repeat AI_MAX ;アイテムの最大数(100) if TN_G_f(cnt) not= 0 /*if TN_G_f(cnt) = 1*/{ ;点数表示のフラグ tngcnt++ /**/ pos TN_G_x(cnt), TN_G_y(cnt) ;座標 if TN_G_f(cnt) = 1 /*if AI_TI_dai(cnt) = 1*/: color 255, : mes "10" ;P if TN_G_f(cnt) = 2 /*if AI_TI_dai(cnt) = 2*/: color ,255,255 : mes "50000" ;点 AI_TIM(cnt) += 1 ;アイテムを表示するカウント if AI_TIM(cnt) >= 100 { AI_TIM(cnt) = 0 ;アイテムを表示するカウントをリセットする TN_G_f(cnt) = 0 ;点数表示を消す ;AI_f(cnt) = 0 ;アイテムを消す ;AI_TME_f(cnt) = 0 ;取得させないフラグ ;AI_Jc(cnt) = 0 ;アイテムの上昇を戻す } }loop ;敵アイテム表示 aicnt=0 /**/ repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;0以外の時実行 (==と逆の意味) aicnt++ /**/ pos AI_x(cnt), AI_y(cnt) ;座標 if AI_f(cnt) = 1 : color 255, : mes "P" if AI_f(cnt) = 2 : color ,255,255 : mes "点" }loop ;アイテムの上下 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;0以外の時実行 (==と逆の意味) if AI_Jc(cnt) <= 100 { ;上昇カウンター AI_y(cnt) -= 1 ;アイテムを↑に移動させる AI_Jc(cnt) += 1 ;上昇カウンターを数える } } if AI_Jc(cnt) >= 100 : AI_y(cnt) += 1 ;カウントが100以上になったら、アイテムを↓に移動させる loop ;自機表示 pos JIKI_x,JIKI_y : color 255,,255 : mes "自" ;敵の表示 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 1 { ;フラグ pos TK_x(cnt), TK_y(cnt) color 255 : mes "敵" }loop ;自機弾を表示 if SHOT = 1 { ;フラグ pos SX,SY : color 255,255 : mes "弾" } redraw 1 : await 15 goto *メイン ;****************敵の処理*************** *敵の処理 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 0 { ;敵のフラグ TK_f(cnt) = 1 ;敵のフラグ TK_x(cnt) = cnt*40 + 50 ;敵X TK_y(cnt) = 380 ;敵Y }loop return ;*************敵VS自機弾************** *敵VS自機弾 repeat TK_MAX ;敵の最大数(5) if TK_f(cnt) = 1 AND SHOT = 1 { if (TK_x(cnt) < SX+11) and (TK_x(cnt)+58 > SX) and (TK_y(cnt) < SY+11) and (TK_y(cnt)+45 > SY) { SHOT = 0 ;自機弾フラグ TK_f(cnt) = 2 ;敵を消す ;アイテム AI_c = 0 ;アイテムフラグをオンにした回数 TK_c = cnt ;cntの値を保持 (敵の数を収納) ;敵のアイテム情報 if TK_f(cnt) = 2 { ;で敵が消えたら実行する repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) = 0 { ;アイテムフラグ AI_f(cnt) = rnd(2) + 1 ;アイテムのフラグ(値はアイテムの種類) ;AI_TI_dai(cnt) = AI_f(cnt) ;アイテム数値(代入用) AI_Jc(cnt) =0 //**// AI_x(cnt) = TK_x(TK_c) + AI_c*15 ;アイテムのX AI_y(cnt) = TK_y(TK_c) ;アイテムのY AI_c ++ if AI_c == 2 : break ;同時に表示するアイテムの上限数に達したらループを抜ける }loop } } }loop return ;************敵アイテムVS自機********* *敵アイテムVS自機 repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 { ;アイテムが0以外なら、実行 if (JIKI_x < AI_x(cnt)+16) and (JIKI_x+29 > AI_x(cnt)) and (JIKI_y < AI_y(cnt)+16) and (JIKI_y+42 > AI_y(cnt)) { ;点数表示 if KOU_TEN_f = 1 { ;高得点のフラグ TN_G_f(TN_G_no) = AI_f(cnt) /*TN_G_f(cnt) = 1*/;点数表示のフラグをオン TN_G_x(TN_G_no) = AI_x(cnt) /*TN_G_x(cnt) = AI_x(cnt)*/;アイテムXを,点数表示Xに代入 TN_G_y(TN_G_no) = AI_y(cnt) /*TN_G_y(cnt) = AI_y(cnt)*/;アイテムYを,点数表示Yに代入 } ;AI_x(cnt) = 500 ;アイテムを画面外に飛ばす ;AI_TME_f(cnt) = 1 ;取得させないフラグ AI_f(cnt) = 0 /**/ TN_G_no=(TN_G_no+1)\AI_MAX /**/;0〜AI_MAX未満をループさせる }else{ if AI_y(cnt)>480 { AI_f(cnt) = 0 }/**/;画面外 } }loop return ;*************アイテム回収************** *アイテム回収 if(UE_ERA_x < JIKI_x+8) AND (UE_ERA_x+380 > JIKI_x ) AND (UE_ERA_y < JIKI_y+7) AND (UE_ERA_y+180 > JIKI_y) { KOU_TEN_f = 1 ;高得点のフラグ }else{ KOU_TEN_f = 0 ;高得点のフラグ } repeat AI_MAX ;アイテムの最大数(100) if AI_f(cnt) not= 0 /*if AI_TME_f(cnt) = 0*/{ if KOU_TEN_f = 1 { ;高得点エリアに侵入したら、アイテムが自機によってくる DK_angle = 0.0 ;実数型で初期化。角度を入れる変数。 DK_angle = atan( JIKI_x - AI_x(cnt), JIKI_y - AI_y(cnt) ) ;アイテムと自機との角度を求める AI_x(cnt) += 40.0 * sin( DK_angle ) ;0.0はアイテムの移動速さ AI_y(cnt) += 40.0 * cos( DK_angle ) ;0.0はアイテムの移動速さ } } loop return ;**************自機移動***************** *自機移動 stick key,15 if key & 1 : JIKI_x - MY_Spd ;←のスピード if key & 2 : JIKI_y - MY_Spd ;↑のスピード if key & 4 : JIKI_x + MY_Spd ;→のスピード if key & 8 : JIKI_y + MY_Spd ;↓のスピード return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and SHOT = 0 { SHOT = 1 ;フラグ SX = JIKI_x ;X SY = JIKI_y ;Y } if SHOT = 1 : SY -= 15 ;スピード if SY < 0 : SHOT = 0 ;↑までいったらフラグを戻す return
同時に得点表示出来るのはAI_MAX(別にアイテム最大数と合わせる必要は無いが)だが
上限まで得点表示されて更に得点表示が必要になった場合は
先に表示された物から入れ替わるようになってる



ミント

リンク

2012/8/25(Sat) 15:12:25|NO.48809

少し返事遅れました。
わざわざ返事ありがとうございます!

実は自分のNO.48752書いた10分後ぐらいに「AI_TI_dai」っていらねーじゃんって気がついた。
そのことについて書こうか、それともNO.48752を消して書き直そうか思ってたけど、理解してたしそのままにしてました!



>>得点表示ない時にはAI_f(cnt) = 0 がされないから
>>どんどん使える数が減る
そういえばそうですね・・・

ユーザーが敵を倒してアイテムをすっぽかしまくったら・・・
さらにそれを溜め込んで敵が沢山いるところこでボムしたら・・・やばいことがおきるね。


>>アイテムと得点表示の要素数を同期してるから
>>アイテム数+得点表示数=AI_MAX
何故自分のソースはいつも何かと合体してしまうんだろうか・・・
気をつけるか、何か対策しないとやばいわね。
(とか言いつつ結構前の質問したときもなっている。涙目)



ソースの方もありがとうございます。

 「AI_Jc(cnt)」
アイテム出したときに(cnt)の番号を戻すことによって、
次発生しても大丈夫な仕組みなんですね。

 「AI_f(cnt) = 0」
前回の場合、実行してしまうと上昇しなくなってた。
けれど今回↑で言った処理をしたおかげで、所得したときに「AI_f(cnt) = 0」が出来るようになった。

 「TN_G_no = (TN_G_no+1) \ AI_MAX」
おぉー、これはいいですねー。
もし敵のアイテムの最大が4つしかないとき(デバッグ用で4つと考える)
5つめを取得したとしても、(TN_G_no)を0番から数えるため、0番の情報が上書きされるのですね。


なるほど〜これなら私でも理解できて使えこなせそうですね。
本スクリプトの適応は時間かかりますがやってきます。
しかし久しぶりに見たけど敵情報だけで1600行とかひどいな・・・いつ直そう・・・
(直しても成長した頃に直したくなる。それに今は1面でもいいので完成させたほうが精神的にも)



本当にわざわざお答えいただきありがとうございます!
1面だけですが「調整、修正、画像、文字」っといったものを修理中なのです。
なのでそのうちできると思いますのでがんばってきます!



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