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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0418
デモニカマップ遷移について。3解決


デモニカ

リンク

2014/4/18(Fri) 18:16:46|NO.61571

マップデータの「3」に重なったら、マップAからマップBに移行するようにしたいのですが
「配列の要素が無効です。」
メッセージが出て上手くいきません。

*draw_map_1_A
// 配列変数[ マップ ]を用意する dim map, 20, 20 map(0, 0) = 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 map(0, 1) = 1,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,2,1 map(0, 2) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 3) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 4) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 5) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 6) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 7) = 1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 8) = 1,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 9) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 10) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 11) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 12) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 13) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 14) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 15) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 16) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 17) = 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 map(0, 18) = 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 map(0, 19) = 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 mx = 0 // X座標を保持するための変数 my = 0 // Y座標を保持するための変数 repeat length(map) repeat length2(map) // マップデータが0の場合地面を描写 if map(mx, my) = 0 { color 200, 200, 200 pos mx*16, my*16 gcopy 1, 0,0, 16,16 } // マップデータが1の場合壁を描写 if map(mx, my) = 1 { color 200, 200, 200 pos mx*16, my*16 gcopy 1,32,0, 16,16 } // マップデータが2の場合壁を描写 if map(mx, my) = 2 { color 200, 200, 200 pos mx*16, my*16 gcopy 1,16,0, 16,16 } // マップデータが3の場合入り口を描写 if map(mx, my) = 3 { color 200, 200, 200 pos mx*16, my*16 gcopy 1,0,0, 16,16 map_1_in=1 } mx += 1 loop if map(mx, my) = 3 :gosub*draw_map_1_B my += 1 : mx = 0 loop return

何故なんでしょうか?



この記事に返信する


YSR

リンク

2014/4/18(Fri) 18:43:25|NO.61572

 バグの原因は、内側のループを抜けた時点ではmx = 20になっているからです。
エラー発生箇所に書かれているコード(if map(mx, my) = 3 :gosub*draw_map_1_B)に
何かしら間違いはありませんか?
 また、「1を足す」という操作は、インクリメント記述によって簡潔に記述できます。
つまり、「mx += 1」は「mx++」と同じ意味です。それに、せっかくrepeat〜loopを
使っているのですから、システム変数であるcntを利用すると、コードの記述量を
減らすことができます。

 なお、コードを貼り付ける前に、問題が発生する最小のコードに
なるように余計な部分を削っておくことを推奨します。
 そして、バグの原因を知りたい場合、質問する前に、そのエラー発生箇所から
「なぜそうなるのか」をいろいろ考えてみるといいでしょう。



(’’

リンク

2014/4/18(Fri) 23:42:39|NO.61581

その変な部分のネストが一つ外れてます。
描画部分なのにオブジェクト側で行うような検出をしてるってことでしょうか。
repeatはYSRさんの言うようにcntというシステム側の変数があるのでmx、myをインクリメントするのではなくcntを使うのがいいと思います。



mx+=1

リンク

2014/4/29(Tue) 16:40:44|NO.61761

これは、
if map(mx,my)=3:gosub *draw_map_1_B
の行に来た時点で、mxの値が20になってしまっているのです。

debugウィンドウを出すようにして、ループの間にlogmes str(mx)を入れてmxの値を追いかけてみると解るのですが、
if map(mx,my)=3:gosub 〜
は、
if map(20,my)=3:gosub 〜
と書いたのと同じ動きをしているのです

さて、どー治すか
HSPにはcntとといって、repat〜loopで回っている数を自動的に入れてくれる変数があるので、これをつかいましょう。

repeat length(map)
my=cnt ;myにはrepeat length(map)のループ回数が入る
repeat Length2(map)
mx=cnt ;mxにはrepat length2(map)のループ回数が入る

//mx+=1 ;mx+=1は無しんこにする
loop
if map(mx,my)=3:gosub 〜
//my+=1:mx=0 ;この行も無しんこにする
loop

これで、エラーはでなくなるはず。

でも、これだと、やっていることは
if map(19,my)=3:gosub 〜
と同じになるので、(マップの右端に3が来たときだけ*draw_map_1_Bに飛ぶようになってしまう)
if map(mx,my)=3:gosub*draw_map_1_B の置き場所を考えなくてはいけません



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