プレイ日記
スクリーンデータってなんじゃい 多分これがOut of rangeの原因
5そうだね
プレイ済み
返信[1]
親投稿
☆TAKA☆ ParasolWaddleDee
スマイルツールで確認できる、BGチップの番号のことですよ!
3そうだね
プレイ済み
返信[2]
親投稿
ぴくと kanau1203
16ビット値でいろいろBGの設定ができるようですね
1そうだね
プレイ済み
返信[3]
親投稿
もしかして:INSTR()は探した文字が見つからないとき、-1を返す
1そうだね
プレイ済み
返信[4]
親投稿
DATAの位置が違うのかな~と位置を変えてみるとエラーがOut of rangeからType mismuchに変わった。もちろんエラーが出た行も。
1そうだね
プレイ済み
返信[5]
親投稿
ほっぺ tkytbrgb
bgput 0,x,y,18+4096 とかでもいける。この場合は18番(将棋の歩)を90度回転させている bgput 0,x,y,18+8192 '180度回転 bgput 0,x,y,18+12288 '270度回転
1そうだね
プレイ済み
返信[6]
親投稿
文字列と数値が混ざったデータで、READ時にアウトオブレンジが出る場合は、読み込む位置が間違ってることが多い。
0そうだね
プレイ済み
返信[7]
親投稿
よく見たら「データ終わりの印」まで配列にPUSHされてるね
1そうだね
プレイ済み
返信[8]
親投稿
otta777 otta777a
Z=INSTR(ST$,M$[X]):IF Z!=-1 THEN BGPUT 0,X,Y,Z として変換テーブルに無い文字があった場合はZに-1が 代入されるのでBGPUTを実行しないように細工をした方が いいかと思います。 あとマップデータを見直しして変換テーブルに無いキャラクターが 無いか確認した方がいいですね。
0そうだね
プレイ済み
返信[9]
親投稿
otta777 otta777a
Type mismatchになる理由はデータを読み始める前に RESTORE命令でデータの先頭の位置を指定していないため それより前にある他のデータを読み込もうとして変数の型が 合わないためだと思います。
2そうだね
プレイ済み
返信[10]
親投稿
マギー M191246
全然違ったら、ごめんなさい。 最初に出てたOut of rangeって BGSCREENの設定とか、 関係なさそうですか?
0そうだね
プレイ済み
返信[11]
親投稿
BGSCREENまず使ってなかった件 そして@MAP02にDATA文字列を並べていたのを@MAP01に移したら(主人公が居るのは@MAP02)Typeが出る行が変わった
0そうだね
プレイ済み
返信[12]
親投稿
マップデータみたけど設定してない記号は恐らくない RETURNで読み込む位置を指定していない…?
0そうだね
プレイ済み
返信[13]
親投稿
今、思ったけど「文字-BG番号対応表」は起動時に1回だけ読めばいいよね。配列変数に記憶するんだから。
1そうだね
プレイ済み
返信[14]
親投稿
otta777 otta777a
BGを表示する部分を Z=INSTR(ST$,M$[X]):IF Z!=-1 THEN BGPUT 0,X,Y,Z ELSE LOCATE 0,0:? X,Y:STOP として設定してない記号が使われたらその時のX,Yの値を 表示してプログラムの実行を中断してみるのはどうでしょうか? マップデータの読み込みについては読み込むマップデータの先頭に ラベル付けてマップデータを読み込む前にRESTORE命令で そのラベル名を指定する必要があります。 RESTORE命令を使わないとREAD命令ではプログラムの先頭から 順番にDATA命令のデータを読み込もうとするため読み込みをしたい データの前に別のデータがある場合はRESTORE命令で読み込む データの位置を指定する必要があります。
1そうだね
プレイ済み
返信[15]
親投稿
マギー M191246
マップデータにエンドマークが ないようですけど 処理は変えてませんよね?
1そうだね
プレイ済み
返信[16]
親投稿
マギー M191246
Out of rangeエラーが出たとき 例えば、 Out of range in 0:○○(BGPUT:3) といった表示は、出ていなかったでしょうか? このときの最後の数字は、 問題がある引数の場所を表していて 例えば、この場合だったら 3番目の引数=Y座標の指定に 問題があることがわかります。
1そうだね
プレイ済み
返信[17]
親投稿
RESTORE(だっけ?) こういう事じゃないのか…
1そうだね
プレイ済み
返信[18]
親投稿
@MAP02直後のDATAを見てみて、たぶん違うデータ。
1そうだね
プレイ済み
返信[19]
親投稿
RESTOREしている(はずの)DATAを別ラベルにしたらPUSHやINCでTypeが起きたので、とりあえずエラーの行を次々無効化しているとBGPUTする行がエラーになってしまった。当然この行を消すとこうなるわけで
1そうだね
プレイ済み
返信[20]
親投稿
うむ。試行錯誤でなんか遠くの方に進んでいる気がする…
2そうだね
プレイ済み
返信[21]
親投稿
INSTRがZ=-1を返した
1そうだね
プレイ済み
返信[22]
親投稿
otta777 otta777a
その状況で ? "<";M$[X];">" とすれば何のキャラでZが-1になったか分かります。
1そうだね
プレイ済み
返信[23]
親投稿
<X>
0そうだね
プレイ済み
返信[24]
親投稿
そういえば配列時代に階段を置く文字の設定した時の「TBX=X:TBY=Y」はどうすればいいんだ?
0そうだね
プレイ済み
返信[25]
親投稿
otta777 otta777a
そのマップの変換テーブルデータにマップデータの"X"に対応する データが無いのではないでしょうか? DATA "X",XのBGキャラクターデータ,1 これが抜けていませんか?
0そうだね
プレイ済み
返信[26]
親投稿
怪しいと思いフォント読み込まずにやったらなんと「X」ではなく「×」だった でも「×」は抜けていない
0そうだね
プレイ済み
返信[27]
親投稿
otta777 otta777a
マップを表示しているループ内のBGPUT命令の次の行で IF INSTR("昇り階段と下り階段のキャラクタ文字",M$[X])!=-1 THEN TBX=X:TBY=Y を追加すればいいと思います。 が、この場合マップ1画面に階段は1個までの制限が付きます。
1そうだね
プレイ済み
返信[28]
親投稿
マギー M191246
Type mismatchを無効化している今は INSTRが返す-1は、あまり意味がないので 無視していいと思います。 RESTORE @ラベル が示すラベルは、そのラベルで これからREADするDATAの場所を 示すものなので 読んでほしいデータの前に そのラベルを置いておく必要があります。
0そうだね
プレイ済み
返信[29]
親投稿
Typeを無効化せずにやるなんて言われても有効にするとエラーで確認もできない
0そうだね
プレイ済み
返信[30]
親投稿
RESTOREの前にラベルを持ってきてみた
0そうだね
プレイ済み
返信[31]
親投稿
全MAPを今のやつにしたらINCが指定された変数が存在しないと言われて起動すらできなくなった…
0そうだね
プレイ済み
返信[32]
親投稿
マギー M191246
ていうか、まだ、その変数は 確認しなくていいです。 もし、マップデータの中に テーブルにないデータがあったら INSTRから、-1が返り それを配列の添え字([]の中に入れる数字)に することになるので その時は Subscript out of rangeの エラーが出るはずです。 だから、その変数の確認は そのエラーが出てからでいいと思います。
0そうだね
プレイ済み
返信[33]
親投稿
マギー M191246
プログラムの順番は @ラベル(テーブル用) DATA (テーブルデータ) … RESTORE @ラヘル(テーブル用) (テーブルデータ読み込みループ) の順にするといいです。 (マップデータも同様。)
2そうだね
プレイ済み
返信[34]
親投稿
otta777 otta777a
1935行目からのスクリーンショットでは1959行目のRESTOREで 指定したラベルとその先で読み込むデータの型が合っていないので Type mismatchになります。 1961行目でREAD S$,C,AとしているためデータはDATA "P",193,1 のような文字列,数値,数値という形式で無いと型が合いません。
0そうだね
プレイ済み
返信[35]
親投稿
マギー M191246
『READ S$,C,A』 が、はいっているループが テーブルデータ読み込みループです。 こちらは、プログラムのはじめのあたりで 1回だけ通ったら済む方です。 『READ M$』 が、はいっているループが マップデータ読み込みループです。 こちらが、ステージが変わる時に通る方です。
0そうだね
プレイ済み
返信[36]
親投稿
マギー M191246
他のプログラムをされているみたいですけど とりあえず、最初に気にされていた スクリーンデータについて、 少しだけ書いておきます。 ためしにダイレクトで スクリーンデータのところに デタラメな数字を入れて、例えば BGPUT 0,0,0,-5 などとしても、エラーにならずに 何かしら表示されるので Out of rangeの原因に なることはないだろうということが わかります。
0そうだね
プレイ済み
返信[37]
親投稿
最近低浮上なのであんまりできてませんorz 他のプログラムが終わったのですが宿題が終わってないんだよね
1そうだね
プレイ済み
返信[38]
親投稿
DIMを追加したら、2回目のPUSHでType mismuchが起きた。 てかDIMしてなかったのか
0そうだね
プレイ済み
返信[39]
親投稿
訂正 Typemismuchじゃなかった
0そうだね
プレイ済み
返信[40]
親投稿
otta777 otta777a
DIM命令での配列の宣言はサブルーチンの中で行うのを止めて プログラムの冒頭で行った方が良いと思います。 Undefined variableは宣言をせずに配列変数を使用した場合に出ます。 これは推測ですが@MAP01のサブルーチンの中でDIM命令による 配列変数の宣言をしているため@MAP02のサブルーチンの中でも DIM命令による配列変数の宣言を行うとDuplicate variableになってしまい @MAP02のサブルーチンの中でDIM命令による配列変数の宣言を しないようにすると@MAP02を先に呼び出しした場合に undefine variableになってしまうという状況になっていませんか?
1そうだね
プレイ済み
返信[41]
親投稿
DIMをプログラムの先頭に置いた結果。 BGPUTはされず、主人公が表示されない状態でのゲームスタートが出来た。 少し右に歩いたらこのエラーが。PUSHで起きてるみたい。
0そうだね
プレイ済み
返信[42]
親投稿
てか、SPSETしてないのに左上にいちごが表示されてるのはなぜ?
0そうだね
プレイ済み
返信[43]
親投稿
otta777 otta777a
1972行目から1978行目のREPEAT~UNTILの間にREAD命令で データを読み取る処理が無いためUNTILの条件を満たさず 無限ループとなってしまっています。 READ S$,C,Aがあったと思われますが削除してしまいましたか?
1そうだね
プレイ済み
返信[44]
親投稿
なんかプログラムの最初のほうで1度だけ書けばいいと言われたから本当に最初の方に書いてたけどとりあえずMAP01のループ内に入れた。するとMAP02でエラーが
0そうだね
プレイ済み
返信[45]
親投稿
otta777 otta777a
すいません、今気がつきましたが Z=INSTR(ST$,M$[X]):IF Z!=-1 THEN BGPUT 0,X,Y,Z としているところは Z=INSTR(ST$,M$[X]):IF Z!=-1 THEN BGPUT 0,X,Y,CD[Z] に直して下さい。
0そうだね
プレイ済み
返信[46]
親投稿
マギー M191246
プログラム全体の配置と流れは ざっくりと、こんな感じになるかな。 配列宣言(DIM) テーブル読み込みループとデータ(ラベル) マップ1読み込みループとデータ(ラベル) (マップ1プレイ) マップ2読み込みループとデータ(ラベル) (マップ2プレイ) …
1そうだね
プレイ済み
返信[47]
親投稿
ここにおいたらBGPUTはされない 毎回毎回BGPUTでエラーが出てる点BGPUTに問題があるのがわかる
0そうだね
プレイ済み
返信[48]
親投稿
マギー M191246
書き方がまぎらわしかったかも知れませんね。 ポイントは、配列宣言と テーブルデータ読み込み(ループ)が プログラムの中で最初に1回だけ、 また、マップデータ読み込み(ループ)が ゲームの流れによって必要なときに 実行されるようにするということです。 それと、ループの直前に RESTORE ラベル (そのループならマップデータ用のラベル) を、セットで付けるようにしておくと 覚えやすいかも知れません。
1そうだね
プレイ済み
返信[49]
親投稿
こういうことではないのかぁ…
1そうだね
プレイ済み
返信[50]
親投稿
ループの不正な抜け出しとかあかん… (メモリを圧迫する、ただしプチコン3号では対策されている?) REPEAT~UNTILは DIMやACLSなどの「初期化」のあたりに書くんやで
0そうだね
プレイ済み
返信[51]
親投稿
訂正 そのREPEAT~UNTILは DIMやACLSなどの「初期化」のあたりに書くんやで
0そうだね
プレイ済み
返信[52]
親投稿
マギー M191246
そのループは、まるごとそこには いらないと思います。 それと、プログラムの中のコメント文に MAP02~とありますけど もし、MAP01の中に同じものを いれているなら それもいらない気がします。
0そうだね
プレイ済み
返信[53]
親投稿
DIMの後ろに置いてみたらBGPUTされない
0そうだね
プレイ済み
返信[54]
親投稿
そういや@BGPUTって何?
0そうだね
プレイ済み
返信[55]
親投稿
BGPUTは@BGPUTに含まれている 1回でいいと言われたから分離したやつだけど GOTOを挟んでなかったらされないどころかそもそもされてない つけてなかったかな
1そうだね
プレイ済み
返信[56]
親投稿
1932行目ww
0そうだね
プレイ済み
返信[57]
親投稿
繰り返す途中で別の場所にジャンプしちゃダメっしょ
0そうだね
プレイ済み
返信[58]
親投稿
1930行目が原因で、REPEAT~UNTILが無意味になってる
0そうだね
プレイ済み
返信[59]
親投稿
ここに同じのあったから@BGPUT内のを消したけどBGPUTはされてないね
1そうだね
プレイ済み
返信[60]
親投稿
@BGPUTの中のUNTILのあとにRETURNをつけて、GOSUBで呼ぶようにすればよさそう
1そうだね
プレイ済み
返信[61]
親投稿
マギー M191246
めろんさんのコメント 「DIMの後ろに置いて…」の 画像の中のループ READ命令が消えたままになっています。
2そうだね
プレイ済み
返信[62]
親投稿
RETURN GOSUB @BGPUT ラベルで分離しないといけないのかこれ (ちなみにエラーは出ずにBGPUTされない)
1そうだね
プレイ済み
返信[63]
親投稿
READを置いてみたら何故かDEF WINDOWSがエラーに
1そうだね
プレイ済み
返信[64]
親投稿
マギー M191246
REPEATはループの始まり、 UNTILがループの終わりで 条件に合わなければREPEATの所に戻ります。 READ命令は、続く変数名の変数に DATA文のデータを読み込みます。 画像を見ると、 「REPEAT」がREAD命令にくっついて 増え過ぎているみたいです。
0そうだね
プレイ済み
返信[65]
親投稿
マギー M191246
READ命令は、そのあとから使う変数に 値を入れるために実行するので その変数を使う式などより前に 書いておかないといけないです。 それと このループの中で使う変数は S$,C,Aだから、READの後ろには M$ではなく、S$,C,Aを続けます。
1そうだね
プレイ済み
返信[66]
親投稿
マギー M191246
あと GOSUB文の前に RESTORE そのマップデータ用ラベル を入れておけば マップを読み込む順番が変わった時でも エラーにならないようになると思います。
0そうだね
プレイ済み
返信[67]
親投稿
ここに入れるのもありかな? まずREPARTでエラー 次に@GOSUBでエラー @GOSUB削除で成功がBGPUTはされません。
0そうだね
プレイ済み
返信[68]
親投稿
REPARTが増えすぎてる…? どのREPARTを消してもエラーになるんだけど…
0そうだね
プレイ済み
返信[69]
親投稿
それぞれのマップデータの後ろにはこれがついています
0そうだね
プレイ済み
返信[70]
親投稿
RESTORE @MAPデータラベルの後ろにGOSUB@BGPUTをつけたらtype mismuch
0そうだね
プレイ済み
返信[71]
親投稿
マギー M191246
例えば DATA 1 @DT DATA 2 DATA 3 RESTORE @DT C=0:REPEAT READ A:PRINT A INC C UNTIL C>1 を、実行すると 2 3 と、表示されますけど…(続く)
0そうだね
プレイ済み
返信[72]
親投稿
マギー M191246
DATA 1 @DT DATA 2 DATA 3 C=0:REPEAT RESTORE @DT READ A:PRINT A INC C UNTIL C>1 と、RESTOREを中に入れて実行すると 2 2 と表示されることになってしまいます。
0そうだね
プレイ済み
返信[73]
親投稿
マギー M191246
「DIMの後ろに置いて…」の所のループ内と 「READを置いて…」の所のループ内を見ると REPEAT:READ M$ が、増えているようです。 ここでは、(前のプログラムの)126行目の REPEATのすぐ下に READ S$,C,A を、追加すればいいかと思います。
0そうだね
プレイ済み
返信[74]
親投稿
マギー M191246
それぞれのマップデータの後ろに 今ついているループは テーブル読み込みループで ここで実行しても意味がないので REPEATからUNTIL文までは消していいです。 RESTORE文は、それぞれのマップデータの GOSUB文の前に移動するといいです。
0そうだね
プレイ済み
返信[75]
親投稿
マギー M191246
@BGPUTの中のループで使うデータは M$に入ってないといけないので ここのREAD文は、READ M$に戻します。
0そうだね
プレイ済み
返信[76]
親投稿
とりあえず ・READ M$に変更 ・意味のないUNTILを削除 ・READ S$,C,Aを追加 そしてBGPUTがエラー
0そうだね
プレイ済み
返信[77]
親投稿
BGPUTがエラー…もしかして原因はこれ?
0そうだね
プレイ済み
返信[78]
親投稿
あ、えらいことになっとるね @BGPUTのなかで@BGPUT呼んだらクルクル回っちゃうのかしこま
0そうだね
プレイ済み
返信[79]
親投稿
otta777 otta777a
INSTR(ST$,M$[X])の値が-1になってないか疑わしいですね。 1966行の先頭にREM命令を挿入してプログラムを実行したときに プログラムが停止して画面の左上に数字が2個表示された場合は ダイレクトモードで ? ST$,M$,M$[X] と入力してそれぞれの変数の中身を確認してみて下さい。
1そうだね
プレイ済み
返信[80]
親投稿
SHUHEI Syuhei36
こめのこ 色々進展してますな・・・!
0そうだね
プレイ済み
返信[81]
親投稿
SHUHEI Syuhei36
現時点での公開キー頂けませんか? 途中からだともう何が何だかさっぱりで・・・
0そうだね
プレイ済み
返信[82]
親投稿
マギー M191246
最後の画面のGOSUB文を 消してみてください。 それと @BGPUTのすぐ下に Y=0 を追加しておいてください。 よくみると、変数名X,Yが、 他のところで使われているみたいなので 別の名前に変えたほうがいいです。
0そうだね
プレイ済み
返信[83]
親投稿
1966行を無効化してもZ=INSTRがエラーになるんだよね… まぁでも一応全変数の中身確認
0そうだね
プレイ済み
返信[84]
親投稿
あ、求めるのは?ST$,M$,M$[X]でしたね。 ということでやってみた
0そうだね
プレイ済み
返信[85]
親投稿
otta777 otta777a
ST$の中身の後ろの方にMAPのデータが入っているのも気になりますが 今回問題になっている部分とは別の問題なので先にBGPUT命令の エラーについてですが… BGSCREEN命令でBGスクリーンのサイズを指定しているところが あると思いますがそこで指定した高さよりBGPUT命令で指定した Y座標が大きいためにOut of rangeになってると思います。
1そうだね
プレイ済み
返信[86]
親投稿
おっ! @BGPUTのすぐ下にY=0を追加したら… BGが復活しましたあああああ! 当たり判定消えてるけど←
2そうだね
プレイ済み
返信[87]
親投稿
ちなみにBGSCREENは使ってません SHUHEIs»現時点でのマミモンです。
2そうだね
プレイ済み
返信[88]
親投稿
SHUHEI Syuhei36
ありがとうございます!DLしました。 午後からお勉強するので、それが終わり次第参戦しまする。
2そうだね
プレイ済み
返信[89]
親投稿
ちなみに、 ACLSのあとにBGSCREENが無い場合は画面サイズに合わせられます。 上画面で0≦X≦24、0≦Y≦14
0そうだね
プレイ済み
返信[90]
親投稿
otta777 otta777a
ダウンロードして中身を見てみたんですが、変数X,Yって何の数値を 入れていますか? サブルーチン@BGPUTの中身を良く確認してみて下さい。
1そうだね
プレイ済み
返信[91]
親投稿
otta777 otta777a
プレイヤーとBGキャラの当たり判定が効かない件はBGを描くレイヤーと BGを判定するレイヤーが違っているためだと思いますよ。
1そうだね
プレイ済み
返信[92]
親投稿
DATA文の記述法 MAKEMAP$時代の変数BGHANTEIによる判定
1そうだね
プレイ済み
返信[93]
親投稿
BGHANTEIの第一引数にレイヤーを入れるのね BGHANTEI(ここ,x1,y1,x2,y2)
0そうだね
プレイ済み
返信[94]
親投稿
マギー M191246
当たり判定は、 @BGPUTの中の BGPUT 0,~ を BGPUT 1,~ にすると、よくなるみたいです。
0そうだね
プレイ済み
返信[95]
親投稿
BGHANTEI 「ここ,」は「SP」 これはつばさ☆さんの自作命令です。 ちなみにさいしょからはじめる時の画面を改造したのだが 何故かライバルの名前が入力ず名無しにしかできない&それが主人公の名前になる それだけではない、その後ゲームを始めると真っ白な画面で何もできない 再起動してつづきからはじめてもマップの座標位置も読み込んでくれないので壁の外にいる…
0そうだね
プレイ済み