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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0315
ミント配列の要素が無効です って出てしまう9解決


ミント

リンク

2014/3/15(Sat) 17:59:08|NO.60678

少しお久しぶりです。

STG製作でまたつまずいてしまいました・・・orz
なんで配列の要素がないと怒られてしまうのかわかりません(。´Д⊂)
いつもならわかりそうなのに・・・なんだろうこの最近のスランプ気味なのは・・・

 ■不具合■
ボスの1段階目のHPをなくした後に自機弾を撃つと、
「配列の要素が無効です」ってエラーが表示されてしまう。
(BS_HIT(0)が5行った後に自機弾(Zキー)を出すとエラーになってしまう)

 ■仕様■
・ボスは1体 (1体なので描画は複数おこなう必要はない)
・ボスのHPを複数用意することにより、ボスのHP切り替えをしている
・ボスのHPは、段階ごとに違う (例:1段階:5、2段階:10)
・1段階のボスに自機弾を当ててダメージを与えると、2段階に移項する
・ボスの1段階目のHPがなくなったとき、ボスは中心点に移動する
・ボスが中心点に移動するときは、一定のスピードで移動する (ワープはNG)
・中心点は固定の位置にある
----------------------------------------------
;ボスを中心点に移動させる
から
return
手前までコメントアウトすればわかると思うけど、
「ボスを中心点に移動させる」さえなければ正常に動作するんだ。

しかしこれを入れると、何故かエラーが表示されてしますorz
どこか間違っていると思うので指摘やアドバイスをお願いいたします><


screen 0,400,400 ;******************情報***************** ;自機の情報 JIKI_x = 160 : JIKI_y = 300 ;ボスの情報 BS_MAX = 3 ;ボスの最大数(3) 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 ;ボスが移動する中心点 TUSN_x = 256 : TUSN_y = 100 ;***************ボスの配置************** BS_x(0,0) = 160, 160, 160 BS_y(0,0) = 160, 130, 110 ;**************ボスのHP*************** BS_HP(0,0) = 5,10,15 ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 20,20 : mes "BS_HIT(0) " + BS_HIT(0) pos 20,40 : mes "BS_HIT(1) " + BS_HIT(1) pos 20,60 : mes "BS_HIT(2) " + BS_HIT(2) pos 20,90 : mes "BS_f(0) " + BS_f(0) pos 20,110 : mes "BS_f(1) " + BS_f(1) pos 20,130 : mes "BS_f(2) " + BS_f(2) pos 20,160 : mes "BS_x(0) " + BS_x(0) // pos 20,180 : mes "BS_x(1) " + BS_x(1) // pos 20,180 : mes "BS_x(2) " + BS_x(2) ;*************ラベルジャンプ************ gosub *ボス処理 gosub *ボスVS自機弾 gosub *自機弾の移動 ;*************************************** ;自機表示 pos JIKI_x,JIKI_y color 255,255, : mes "自" ;自機弾を表示 pos JK_SHOT_x,JK_SHOT_y color 255,,255 : mes "弾" ;ボス表示 pos BS_x,BS_y color 255 : mes "ボス" ;中心点 pos TUSN_x,TUSN_y color ,255,255 : mes "中" redraw 1 : await 15 goto *メイン ;*****************ボス処理************** *ボス処理 repeat BS_MAX ;ボスの最大数(3) if BS_f(cnt) = 0 { ;ボスのフラグが「立ってなかったら実行」 BS_f(cnt) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(cnt) >= BS_HP(cnt) { BS_f(cnt) = -1 ;ボスのフラグを-1にする }loop ;ボスを中心点に移動させる if BS_HIT(0) >= BS_HP(0) { ;ボスのHPが減ったら実行 if BS_IDO_f = 0 { ;ボス移動フラグが「立って無かったら実効」 BS_IDO_f = 1 ;ボス移動フラグを「立てる」 BS_V = atan(TUSN_y - BS_y , TUSN_x - BS_x) ;中心とボスとの角度を求める BS_xv = cos(BS_V) * 2 ;ボスXの移動量(2) BS_yv = sin(BS_V) * 2 ;ボスYの移動量(2) BS_x = double(BS_x) ;ボスの初期座標 BS_y = double(BS_y) ;ボスの初期座標 } if BS_IDO_f = 1 { ;ボス移動フラグが「立ってたら実行」 BS_x = BS_xv + BS_x ;ボスXの座標 BS_y = BS_yv + BS_y ;ボスYの座標 if (TUSN_x < BS_x+31) and (TUSN_x+28 > BS_x) and (TUSN_y < BS_y+32) and (TUSN_y+32 > BS_y) { BS_S = 0 ;ボスの移動量を無くす BS_x = 256 : BS_y = 100 ;ボスの座標を固定させる } } } return ;************ボスVS自機弾************* *ボスVS自機弾 repeat BS_MAX ;ボスの最大数(3) if BS_f(cnt) = 1 AND JK_SHOT_f = 1 { ;ボスがいて、自機弾がある場合「実行」 if (BS_x(cnt) < JK_SHOT_x+15) AND (BS_x(cnt)+46 > JK_SHOT_x) AND (BS_y(cnt) < JK_SHOT_y+11) AND (BS_y(cnt)+30 > JK_SHOT_y) { JK_SHOT_f = 0 ;自機弾フラグを「戻す」 BS_HIT(cnt) += 1 ;自機弾の火力 } }loop return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and JK_SHOT_f = 0 { JK_SHOT_f = 1 ;自機弾フラグを「立てる」 JK_SHOT_x = JIKI_x ;自機のX座標を代入 JK_SHOT_y = JIKI_y ;自機のY座標を代入 } if JK_SHOT_f = 1 : JK_SHOT_y -= 15 ;自機弾フラグが立ってたら、自機弾を↑に移動させる if JK_SHOT_y < 0 : JK_SHOT_f = 0 ;自機弾が一番上まで行ったら、自機弾フラグを「戻す」 return



この記事に返信する


暇人

リンク

2014/3/15(Sat) 18:27:31|NO.60681

明らかに変な所
> dim BS_x,BS_MAX ;X
> dim BS_y,BS_MAX ;Y

>BS_x(0,0) = 160, 160, 160
>BS_y(0,0) = 160, 130, 110

> BS_x = double(BS_x) ;ボスの初期座標
> BS_y = double(BS_y) ;ボスの初期座標

整数型の一次元で使いたいのか、二次元配列で使いたいのか実数型で使いたいのか・・・



YSR

リンク

2014/3/15(Sat) 20:00:17|NO.60686

NO.60678を走らせてZキーを押しまくる

エラー7(93行目)

デバッガ(「knowbug」(http://prograpark.ninja-web.net/CollectField/#var_vector))
によると、BS_xとBS_yが配列でなくなっていた(しかもdouble型)

……つまり、整数型配列にうっかり実数を代入したから配列でなくなり、エラーが発生した、と。
暇人さんの言う通りですね(注:配列でなくなってしまうのは仕様)。

そもそもなんでボス座標を段階ごとに分けたのに、後半ではそれを忘れているんですか?
と言うか「現在のボスの段階」を表す変数が無いとおかしいと思います。



ミント

リンク

2014/3/16(Sun) 07:24:24|NO.60702

暇人さん

>>明らかに変な所
他のソースで大丈夫だろうと勝手に決め付けてたけど、
よく考えて見れば実数値型じゃないのはおかしいね。
このソースと該当ソース直してこなきゃ・・・

>>整数型の一次元で使いたいのか、二次元配列で使いたいのか実数型で使いたいのか・・・
ぎゃあああああああああああああああああ


ありがとうございます!
いや〜なんでこんなミスをしてしまったのかorz



ミント

リンク

2014/3/18(Tue) 07:31:49|NO.60760

YSRさん
最近忙しくって返事おくれました(´・ω・`)

>>デバッガ(「knowbug」(http://prograpark.ninja-web.net/CollectField/#var_vector))
こんなソフトがあるとは・・・時間があるときに使ってみようかな。

>>……つまり、整数型配列にうっかり実数を代入したから配列でなくなり、エラーが発生した、と。
はい・・・そのとおりでした(´・ω・`)
整数型ではなく実数型で用意して、ボス座標を160.0とかにすれば大丈夫ですね。


>>そもそもなんでボス座標を段階ごとに分けたのに、後半ではそれを忘れているんですか?
後半ってこれのことかな?
if BS_HIT(0) >= BS_HP(0) { ;ボスのHPが減ったら実行
仕様の中に入れ忘れてたけど、移動するボスは1体です。

>>と言うか「現在のボスの段階」を表す変数が無いとおかしいと思います。
相手の弾を消す、ボスの移動管理、そのほか色々フラグを使うと思うのですが、

>>if BS_HIT(0) >= BS_HP(0) { ;ボスのHPが減ったら実行
これで判定するのではなく
>>if BS_HIT(cnt) >= BS_HP(cnt) {
>> GRKIH_f(cnt) = 1 ;撃破フラグ
>>}
と言う風に用意して、「if BS_HIT(0) <= BS_HP(0)」ではなく「GRKIH_f(cnt) = 1」で
判定をしたほうがいいという意味なのでしょうか?

あ、必要っぽいわこれ。朝10のソースだから内容はちっと待ってね
------------------------

screen 0,400,400 ;******************情報***************** ;自機の情報 JIKI_x = 160 : JIKI_y = 300 ;ボスの情報 BS_MAX = 3 ;ボスの最大数(3) dim BS_f,BS_MAX ;ボスフラグ dim BS_HIT,BS_MAX ;ヒット数 dim BS_HP,BS_MAX ;HP ;ボスが移動する中心点 TUSN_x = 160 : TUSN_y = 100 ;***************ボスの配置************** BS_x(0) = 160.0 : BS_x(1) = 160.0 : BS_x(2) = 160.0 BS_y(0) = 160.0 : BS_y(1) = 100.0 : BS_y(2) = 100.0 ;**************ボスのHP*************** BS_HP(0) = 5 : BS_HP(1) = 10 : BS_HP(2) = 15 ;***************メインループ************ *メイン redraw 0 : color : boxf ;************ゲームカウンター*********** color ,255 pos 20,20 : mes "BS_HIT(0) " + BS_HIT(0) pos 20,40 : mes "BS_HIT(1) " + BS_HIT(1) pos 20,60 : mes "BS_HIT(2) " + BS_HIT(2) pos 20,90 : mes "BS_f(0) " + BS_f(0) pos 20,110 : mes "BS_f(1) " + BS_f(1) pos 20,130 : mes "BS_f(2) " + BS_f(2) pos 20,160 : mes "BS_x(0) " + BS_x(0) ;*************ラベルジャンプ************ gosub *ボス処理 gosub *ボスVS自機弾 gosub *自機弾の移動 ;*************************************** ;自機表示 pos JIKI_x,JIKI_y color 255,255, : mes "自" ;自機弾を表示 pos JK_SHOT_x,JK_SHOT_y color 255,,255 : mes "弾" ;ボス表示 pos BS_x,BS_y color 255 : mes "ボス" ;中心点 pos TUSN_x,TUSN_y color ,255,255 : mes "中" redraw 1 : await 15 goto *メイン ;*****************ボス処理************** *ボス処理 repeat BS_MAX ;ボスの最大数(3) if BS_f(0) = 0 {;ボスのフラグが「立ってなかったら実行」 BS_f(0) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(0) >= BS_HP(0) { if BS_f(1) = 0 {;ボスのフラグが「立ってなかったら実行」 BS_f(1) = 1 ;ボスのフラグを「立てる」 } } if BS_HIT(1) >= BS_HP(1) { if BS_f(2) = 0 {;ボスのフラグが「立ってなかったら実行」 BS_f(2) = 1 ;ボスのフラグを「立てる」 } } if BS_HIT(cnt) >= BS_HP(cnt) { ;ボスのHPがなくなったら実行する BS_f(cnt) = -1 ;ボスのフラグを-1にする }loop ;ボスが動く if BS_HIT(0) <= BS_HP(0) { ;ボスのHPが減ったら「実行しない」 BS_UGO_c += 1 ;ボスカウント if BS_UGO_c > 100 : BS_x + 1 ;→に移動する if BS_UGO_c > 200 : BS_x - 1 ;止める if BS_UGO_c > 300 : BS_x - 1 ;真ん中に移動する if BS_UGO_c > 400 : BS_x + 1 ;止める if BS_UGO_c > 500 : BS_x - 1 ;←に移動する if BS_UGO_c > 600 : BS_x + 1 ;止める if BS_UGO_c > 700 : BS_x + 1 ;真ん中に移動する if BS_UGO_c > 799 : BSUGO_c = 0 ;リセットする } ;ボスを中心点に移動させる if BS_HIT(0) >= BS_HP(0) { ;ボスのHPが減ったら実行 if BS_IDO_f = 0 { ;ボス移動フラグが「立って無かったら実効」 BS_IDO_f = 1 ;ボス移動フラグを「立てる」 BS_V = atan(TUSN_y - BS_y , TUSN_x - BS_x) ;中心とボスとの角度を求める BS_xv = cos(BS_V) * 2 ;ボスXの移動量(2) BS_yv = sin(BS_V) * 2 ;ボスYの移動量(2) BS_x = double(BS_x) ;ボスの初期座標 BS_y = double(BS_y) ;ボスの初期座標 } if BS_IDO_f = 1 { ;ボス移動フラグが「立ってたら実行」 BS_x = BS_xv + BS_x ;ボスXの座標 BS_y = BS_yv + BS_y ;ボスYの座標 if (TUSN_x < BS_x+31) and (TUSN_x+28 > BS_x) and (TUSN_y < BS_y+32) and (TUSN_y+32 > BS_y) { BS_S = 0 ;ボスの移動量を無くす BS_x = 160.0 : BS_y = 100.0 ;ボスの座標を固定させる } } } return ;************ボスVS自機弾************* *ボスVS自機弾 repeat BS_MAX ;ボスの最大数(3) if BS_f(cnt) = 1 AND JK_SHOT_f = 1 { ;ボスがいて、自機弾がある場合「実行」 if (BS_x(cnt) < JK_SHOT_x+15) AND (BS_x(cnt)+46 > JK_SHOT_x) AND (BS_y(cnt) < JK_SHOT_y+11) AND (BS_y(cnt)+30 > JK_SHOT_y) { JK_SHOT_f = 0 ;自機弾フラグを「戻す」 BS_HIT(cnt) += 1 ;自機弾の火力 } }loop return ;************自機弾の移動*************** *自機弾の移動 getkey keyZ,90 ;キーチェック,Zキー if keyZ and JK_SHOT_f = 0 { JK_SHOT_f = 1 ;自機弾フラグを「立てる」 JK_SHOT_x = JIKI_x ;自機のX座標を代入 JK_SHOT_y = JIKI_y ;自機のY座標を代入 } if JK_SHOT_f = 1 : JK_SHOT_y -= 15 ;自機弾フラグが立ってたら、自機弾を↑に移動させる if JK_SHOT_y < 0 : JK_SHOT_f = 0 ;自機弾が一番上まで行ったら、自機弾フラグを「戻す」 return



MillkeyStars

リンク

2014/3/18(Tue) 08:21:38|NO.60761

というか、これって同時にボスが3体仕様なのかなー



ミント

リンク

2014/3/19(Wed) 07:15:49|NO.60773

MillkeyStarさん
>というか、これって同時にボスが3体仕様なのかなー
・ボスは1体 (1体なので描画は複数おこなう必要はない)
なんだけど、「NO.60678」のシースだと3体存在しちゃっているから、

if BS_f(0) = 0 {;ボスのフラグが「立ってなかったら実行」 BS_f(0) = 1 ;ボスのフラグを「立てる」 } if BS_HIT(0) >= BS_HP(0) { if BS_f(1) = 0 {;ボスのフラグが「立ってなかったら実行」 BS_f(1) = 1 ;ボスのフラグを「立てる」 } } if BS_HIT(1) >= BS_HP(1) { if BS_f(2) = 0 {;ボスのフラグが「立ってなかったら実行」 BS_f(2) = 1 ;ボスのフラグを「立てる」 } }
というふうに個別に指定して1体1体当たり判定があるようにしてみた。
これを本番ソースに適応してみて、問題あればフラグでの管理とかを考えてみますわー。
しかし、最近忙しいせいでプログラムミスが増えてしまっている(´・ω・`)



MillkeyStars

リンク

2014/3/19(Wed) 10:59:45|NO.60774

>>これを本番ソースに適応してみて、問題あればフラグでの管理とかを考えてみますわー。
ではなく、最初から考えないと処理が複雑になりすぎてわからなくなるよ。

//フラグ種類
BS_f = -1 : 未出現フラグ
BS_f = 0 : 出現演出用フラグ
BS_f = 1 : 出現完了状態(出現で自機からの攻撃を受け付ける状態)
BS_f = 2 : 消滅演出用フラグ
BS_f = 3 : BS_f 自身を -1 に戻す作業

上記だと、大体ありえるフラグを列挙してみた。
実際は、BS_f(a) などで、BS_f の配列番号を操作すればいいだけ。
a = 0 から始まるわけだから、BS_f のフラグが 3 になった時点で a を加算し、BS_f(a) のフラグを出現に変えてあげればいい。

この場合の a は、ボス番号(0〜2)で、計3体
んで最終的に、a = 2 : BS_f(2) = 3 になったら a を 0 に戻せば最初に戻る。


BS_MAX = 3 dim BS_f,BS_MAX //ボスの出現処理 a = 0 BS_f(a) = 0 *main //ボス出現演出用 if BS_f(a) = 0{ mes "ボス出現演出中 : "+a await 500 BS_f(a) = 1 } //ボス出現完了状態 if BS_f(a) = 1{ mes "ボス出現完了状態" await 1000 BS_f(a) = 2 } //ボス消滅演出状態 if BS_f(a) = 2{ mes "ボス消滅演出状態" await 1000 BS_f(a) = 3 } //ボス消滅完了状態(ボスが3体倒された場合の処理もここで行うこと) if BS_f(a) = 3{ mes "ボス消滅完了状態" await 1000 BS_f(a) = -1 if (a = 2) : a = 0 : mes "完全殲滅" a++ } await 100 goto *main



ミント

リンク

2014/3/22(Sat) 22:55:01|NO.60842

MillkeyStarsさん

>>//フラグ種類
>>BS_f = -1 : 未出現フラグ
>>BS_f = 0 : 出現演出用フラグ
>>BS_f = 1 : 出現完了状態(出現で自機からの攻撃を受け付ける状態)
>>BS_f = 2 : 消滅演出用フラグ
>>BS_f = 3 : BS_f 自身を -1 に戻す作業

こんなに使うものなのかー。今まで
>>BS_f = 0 : 準備フラグ
>>BS_f = 1 : 表示したり、ダメージを与えられる
>>BS_f = 2 : 消す用フラグ
っていう感じで今まで作ってたけど、新しくフラグを用意したほうがいいのかしら。
っというかソース直してたんだけど、ちょっと問題発生したから修正してくる〜
MillkeyStarsさんありがとうございます。

なんで忙しい時にプログラミングの質問したし!と思うかもしれないけど、
仕事が急に忙しくなって(´・ω・`)



ミント

リンク

2014/3/28(Fri) 07:10:19|NO.61011

_・)チラ

問題は発生しなくなったけど、フラグなのかダメージを調べるのか・・・
それによって仕様をどうするかも決めないといけないことが判明。
(統一感を図るため考えないといけない)

>ではなく、最初から考えないと処理が複雑になりすぎてわからなくなるよ。
まさにこれ。
土台をしっかり考えなおしたいのでしばらくこもってきます。

地道に本番ソースを分解して改造してきます。
本題の配列に関しては解決できているので解決済みにします。
皆さんありがとうございます。



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