投稿
BGをREAD,DATAを使ってプログラムで配置したい人用にサンプルをあげてみました。少しでも参考になれば…。
24そうだね
プレイ済み
返信[1]
親投稿
マップをDATAにするやり方は色々あるんでこれが唯一でも正解でもないし、ゲーム内容によって適切な管理方法は変わってきます。 これはDATA自体の視野性も考えましたが、単純にマップ番号をカンマ区切りにする方法もあります。またマップデータを見るとわかりますがマップは同じデータが連続する事が多いので、この連続をフラグ化することでマップデータ自体を圧縮して小さくするという案もあります。 ということで色々あるやり方の一つなのですが、パズル系のゲームなどではステージをこういう感じに持っておくと変更しやすいところもあったりもします。 質問等、あったら答えますが、そんな感じです。ではでは。
0そうだね
プレイ済み
返信[2]
親投稿
sol sol0412
こんな昔の投稿にすみませんww なにがなにを表しているかをおしえてくれませんかね.....? 嫌ならいいですが.......
0そうだね
プレイ済み
返信[3]
親投稿
古い投稿ですが、いいですよー。何が何をと言うのはどういう事を言ってる感じですか? プログラムの各行の内容を解説すれば良い感じですか? それとも考え方を説明すれば良い感じですか?
0そうだね
プレイ済み
返信[4]
親投稿
ついでなので、ちょっとだけ改善したソースも載せておきます。変更点は、 1 タイル登録処理にREPEATを使い終了判定を変更 2 タイル登録処理での文字列追加命令を計算式からINC命令に変更 3 文字のチェックでMID$抜き出しを文字配列インデックス指定に変更 です。まあどれも必須な感じじゃないですが、とくに3は今どき(?)な方法なので変えておきました。
0そうだね
プレイ済み
返信[5]
親投稿
sol sol0412
各行の説明です (めんどくさいこといってすみません)
0そうだね
プレイ済み
返信[6]
親投稿
わかりました。それじゃさっきアップした後者の方のソースを元に何をしているかを行単位で解説します。とりあえず一通り書きますので、それが終わってから質問などがあったら言ってください。 長くなるので投稿は数回に分かれると思います。
0そうだね
プレイ済み
返信[7]
親投稿
1行目:定番の画面消去の命令です。大体始めに実行しておきますね。 2行目:コメント 3行目:マップデータの文字と数値を対応させる為の変数を用意します。変数は、 NM[0] … マップキャラ番号を入れておくための配列。要素数0になっているが、あとからPUSH命令で追加するので始めは0でも大丈夫。(PUSH命令は1次元配列に対しては追加して要素数を増やせるため) MC$ … DATAのマップ用の文字を入れておくための変数。追加していくことで、NM[]配列の要素番号の位置と文字列の対応する文字の位置が同じになるようにする。 始めは空からスタート。 4行目:繰り返し開始のREPEAT命令。UNTILで条件が一致するまではこの間を繰り返すことになる。
0そうだね
プレイ済み
返信[8]
親投稿
5行目:READ命令で、DATAの戦闘から順にC$に文字、Nに数値を読み込みます。 RESTOREを使ってないので始めのDATAは18行目になり、ここには、 マップ用のシンボルとして「記述する記号(文字),BGキャラ番号」の2つひと組の内容として必要なだけ繰り返してDATAにしておきます。 そして最後は「"",-1」としておきます。(これは終わりを示すためのルール) つまり18行では、空行は99、♠は100、●は101のBGキャラ番号になるようにDATA指定しています。 読み込んだC$(マップの文字)はMC$に追加(INC)し、N(BGキャラ番号)はMN配列に追加しておきます。 6行目:読み込んだC$の内容が””(なし)だったらループを抜け、そうでない場合はREPEATを繰り返して、必要なだけマップシンボル用の絵と番号を追加していきます。
0そうだね
プレイ済み
返信[9]
親投稿
ここまででMN配列とMC$文字列にはマップデータのシンボル(文字)をBGキャラ番号に変換するための準備が完了します。 (一応僕はこのマップシンボルのことをタイルとも呼んでるので、2行目のコメントにはそう書いてありますね) つまりどの文字(マーク)がどのBG番号になるかです。 このREPEATを18行の"",-1で抜けるので、次の10行目のREADは19行目(マップ本体)からの読みこみになります。 9行目:FORでBGのY座標を0から15まで繰り返します。その為、DATAは全部で16個(行)必要になりますが、途中でデータが無い場合に抜ける処理があるので必ず16個(行)なくても大丈夫です。 10行目:READ命令でM$に1行分のマップデータ文字列を読み込みます。 その後、IFで、この読み込んだ内容が””(空)だった場合は、BREAK命令でループを抜けるようにしています。
0そうだね
プレイ済み
返信[10]
親投稿
sol sol0412
データってどこにあってもいいのですかね? ~17の命令 18~のDATAはくっついていないといけないのですかね? あとは、写してちょびちょび改造して使える形にします ありがとうございました m(_ _)m (ペコッ ってこんな感じだっけ?w)
0そうだね
プレイ済み
返信[11]
親投稿
11行目:FORで読み込んだM$の文字数分繰り返して次の行からマップを配置していきます。LENは変数の文字数を取得する命令ですが、Xは0から始めるので実際は0〜文字数-1分ループします。 12行目:INSTR命令で、マップ文字(M$の中のX位置)が事前に作ったMC$(マップシンボル文字列)に一致する位置を求めます。位置は変数Nに入ります。もし一致する文字が無い場合は、Nには-1が入ります。 13行目:Nが0以上の場合(一致する文字がある場合)、BGPUTでBGを配置します。この時にMN配列には文字に対応したBGキャラ番号が入っているのでMN[N]とすることで、BGキャラ番号をBGPUTしています。 14行目:FOR(X)ループのNEXTです。 15行目:FOR(Y)ループのNEXTです。
0そうだね
プレイ済み
返信[12]
親投稿
18行目:先ほど説明したようにマップシンボル文字をBGキャラ番号に対応させる為のDATA分になります。 19行目〜:一つのDATAがマップの1行(横1列)になるマップデータです。 16行分用意するか、””(空)指定で終わるまで用意しておきます。 ……とてもざっくりですが、各行の説明はこんな感じです。 駆け足になってしまっている部分もあるので、わからないところなど質問があれば、その場所や内容を言ってもらえれば回答します。 よろしくお願いします。
0そうだね
プレイ済み
返信[13]
親投稿
DATAはどこに置いてあっても大丈夫ですよ〜。 READ命令は始めに見つかったDATAから読み込んでいくので、もし他のDATAなどが混ざっている場合は、DATAの前の行に、 @MAP とかのラベルをつけて、 RESTORE @MAP としてから3行目〜のプログラムを実行すれば確実で、どこにDATAを置いても大丈夫になります。他にDATAが無いのであれば、RESTOREしなくても一番始めに見つかったDATA文から読み込まれるので大丈夫です。
0そうだね
プレイ済み
返信[14]
親投稿
ちょっとオマケ。 タイル[シンボル→No.]登録の部分をもうちょっと詳細に説明。 REPEAT処理で18行目のDATAを読み込むとMN配列とMC$変数は以下のようになります。 MC$=" ♠●" MN[0]=99 MN[1]=100 MN[2]=101 MN[3]=-1 これが何を意味するかというと、 MC$の1文字目(インデックスで言うと0)の空白がMN[0]のBGキャラ番号99に対応している。 MC$の2文字目(インデックスで言うと1)の♠がMN[1]のBGキャラ番号100に対応している。 MC$の3文字目(インデックスで言うと2)の●がMN[2]のBGキャラ番号101に対応している。 ……という風に、文字の位置(インデックス)がちょうどMN配列の要素位置(インデックス)に対応する形になるのです。
0そうだね
プレイ済み
返信[15]
親投稿
それを利用してマップ配置時にマップの文字をBGPUTの際に必要なBGキャラ番号に変換しています。 次にどうやって変換しているかというと、まずREADで横1列分のマップデータを取得します。この内容はM$に入ってますが、それをさらに1文字だけ取り出すために、M$[X]というやり方で1文字分だけ取り出すことが出来ます。Xは文字の位置(0スタート)です。 この取り出した内容は♠などになりますが、このままではBGキャラ番号にならないのでこれを変換します。その時に役に立つのがINSTR命令です。これは文字列の中から指定した文字と一致する位置を取得する事が出来ます。
0そうだね
プレイ済み
返信[16]
親投稿
この命令的には、 変数 = INSTR( [開始位置,] "元文字列", "検索する文字列" ) という使い方になります。 開始位置は始めからにしたいので省略して、元文字列は始めに作ったMC$になります。これに対して検索する文字列はマップから取り出すM$[X]になります。こうすると対応する文字の存在する位置が数値として取得出来るのです。 (見つからなかった場合は-1になります) こうして見つかった位置(N)は事前に作った配列MNのインデックス(位置)と同一になるようにしてあるので、MN[N]とすることでBGキャラ番号に変換できるわけです。 変換できればあとは簡単なのでBGPUTで配置するだけです。
0そうだね
プレイ済み
返信[17]
親投稿
と、大体の概要は説明できたと思います。 とはいえプログラムに慣れてないとイマイチピンとこなかったりわかりにくく感じる部分はあると思うので、質問等があれば書き込んでください! これが少しでもDATAを使ったBGマップに対する理解の役に立てば幸いです。
0そうだね
プレイ済み
返信[18]
親投稿
sol sol0412
BGSCREEN?なんかちがう それで 25×15以上にしても できますかね?
0そうだね
プレイ済み
返信[19]
親投稿
BGSCREENでBGサイズを大きくしても大丈夫ですよ。 ただFORでYが15までしか回してないので、それ以上の縦サイズにする場合は、そのぶんこの15の数を大きくしてください。 横のサイズはDATAの文字の長さに対応しているので増やせばその分横に延びます。
0そうだね
プレイ済み
返信[20]
親投稿
(たぶん)同じプログラムを打ったのですがOutofDATAが出てプログラムが止まります 9行目です 何が悪かったのでしょうか?
0そうだね
プレイ済み
返信[21]
親投稿
11行目が間違ってたので直しましたがそれでも同じエラー吐きます
0そうだね
プレイ済み
返信[22]
親投稿
ごめんなさい僕が間違ってました ちゃんと動きました
0そうだね
プレイ済み
返信[23]
親投稿
返事遅くなってすいません。なんか解決しちゃってましたね…。 ちょっと思ったんですがプログラムの色がかなり見にくいような…。とくにIF THENなどとBGPUTの色が同じに見えるのが…。 色をカスタマイズするのはいいですが、出来るだけ色には差をつけた方がいいですよ。実際の画面ならわかるのかもしれませんが、色が付くことで打ち間違いに気づく場合もありますし、わかりやすく見えるようにしておいた方がいいと思います。
1そうだね
プレイ済み