プレイ日記
マップ切り替えできません
3そうだね
プレイ済み
返信[1]
親投稿
つばさ☆ nsm2116
BGを置く処理書いてないじゃん。
2そうだね
プレイ済み
返信[2]
親投稿
もう一つ、DEFの中身が空気
0そうだね
プレイ済み
返信[3]
親投稿
otta777 otta777a
@KAIDANに処理が移った場合に画面を消去してLOAD命令で フォントデータとスプライトデータをダイアログ表示をせずに読み込む 処理を無限に繰り返すようになってます。 想定通りの動作ですか? またIF命令を使用してますがその前でA=0を実行しているので必ず条件が 成立します。IF~ENDIFを使わなくても結果は同じになります。
1そうだね
プレイ済み
返信[4]
親投稿
具体的に言うと 「@KAIDANに来てから、MAKEMAP$の中身を(画面写真の中身)に変えて@MAINLOOPを実行」 という感じ。 しかし、@KAIDAN移動後MAKEMAP$の中身を変えるのに失敗し、MAKEMAP2$という変数を作って表示ししたがまだ出てこず、おまけに画面を変えるためにACLSしたのでGRPを再びよみこみなおし…そして移動もできないので「画面が真っ暗になって無限ループ」「階段に行ってマップを切り替えるはずが階段に触れた瞬間動けなくなる」「エラー」の3種類しか自分にはできませんでした… 移動処理をGOSUB?makemap$の中身を変えて主人公が動けて@BAGも問題なく動作すればゲーム本編の基本システムはほぼ完成するのですが…
2そうだね
プレイ済み
返信[5]
親投稿
つばさ☆ nsm2116
DEFでBGを置くようにすればどう? プログラム見てないからちゃんとA=0になってるか知らないけど。
1そうだね
プレイ済み
返信[6]
親投稿
otta777 otta777a
ACLSだとスプライトもフォントも初期化されてしまうんでVer3.3.0以降 限定ですがACLS TRUE,TRUE,TRUEでスプライト画像初期化、 BG画像初期化、SPDEF初期化、フォント初期化を無効にした方が 良いかと思います。 LOAD命令でスプライトやフォントのデータを読み込まずに済みます。 602行目のGOTO @MAINLOOP_2としている部分はGOTO @MAINLOOPの 間違いではないですか?@MAINLOOP_2にジャンプすると無限ループになります。 @MAINLOOP付近のプログラムやマップの表示をどうしているかが 分からないんでこれ以上は現状分かりません。
2そうだね
プレイ済み
返信[7]
親投稿
つばさ☆ nsm2116
あ、もしかして MAKEMAP$配列を@KAIDANで変更。 @MAINLOOPに飛ばす。 そこにまたMAKEMAP$を初期のBGに変更してたはず。それでBGを配列を通りに置いているからか、@MAINLOOP先に処理がないかです。
1そうだね
プレイ済み
返信[8]
親投稿
つばさ☆ nsm2116
詳しくは分からないので。@MAINLOOP先のプログラムを見せるか 公開キーを発行してくれると説明しやすいです。
1そうだね
プレイ済み
返信[9]
親投稿
失敗するたびにセーブせずに終わってたので再現はしましたが多少違います 今のプログラムは「@KAIDANに移動後MAKEMAP$の中身を変えようとしてEND」のはずです テストしてませんがmakemapは変わってないはず。 ループもつけてないので階段に触れたら終わり、というところかな?
1そうだね
プレイ済み
返信[10]
親投稿
そして画面写真を貼り忘れるという
1そうだね
プレイ済み
返信[11]
親投稿
今やってみたけどどうやらエラーが。 VAR MAKEMAP$[15]が2回目だからかな。 VARとかDIMとかDEFとかまだわからんなぁ
0そうだね
プレイ済み
返信[12]
親投稿
2重宣言エラーなのでその通りかと。 VARとDIMは「この名前の変数を使うよ(配列のときは要素数も一緒に)」宣言するものですね
0そうだね
プレイ済み
返信[13]
親投稿
なお、DEF-END内で宣言するとDEFの外を無視して使える変数ができます(ローカル変数)
0そうだね
プレイ済み
返信[14]
親投稿
otta777 otta777a
まずユーザー定義命令や関数は同じ名前は使えません。 現状特に動作に影響の無いユーザー定義命令MAKEMAPが2カ所 あるためにエラーが発生します。 同様に同じ名前の配列変数の宣言も出来ません。 同じ配列変数に他の数値や文字列を格納する場合は配列の宣言は しなくても上書きをする事は出来ます。 例) DIM A[10] A[0]=5:A[1]=10 処理 REM DIM A[10] この行は不要 A[0]=10:A[1]=20
0そうだね
プレイ済み
返信[15]
親投稿
くう TTK79054
はい 1回目の所でDef していたので階段で2回目したからですね。 プログラム改造してぇ
0そうだね
プレイ済み
返信[16]
親投稿
くう TTK79054
あ、違うかも 配列かw
0そうだね
プレイ済み
返信[17]
親投稿
出来ました。ありがとうございます!!! 前のマップにいた人を消すにはSPHIDEですか?SPOFSで画面外に隠すんですか?
1そうだね
プレイ済み
返信[18]
親投稿
つばさ☆ nsm2116
使わないからSPCLRでいいと思う。SPHIDEだと使える管理番号が埋められるからね。
0そうだね
プレイ済み
返信[19]
親投稿
SPCLR 3ではだめなんですね…(消したい人間はSPSET 3,○○でSPSETしました)
1そうだね
プレイ済み
返信[20]
親投稿
つばさ☆ nsm2116
なぜそうなるしw SPOFS,SPHIDEだとSPで容量食う気がするしSPCLRの方がすっきりするけどどうやったらそうなるしw
0そうだね
プレイ済み
返信[21]
親投稿
左上にある階段で最初のマップに戻りたいけどMAINLOOPに@MAP02(@KAIDANから変更しました)に移動する処理があるから瞬間的に座標変わるだけ
1そうだね
プレイ済み
返信[22]
親投稿
つばさ☆ nsm2116
それGRP4を初期化してるだけでしょ。
0そうだね
プレイ済み
返信[23]
親投稿
1そうだね
プレイ済み
返信[24]
親投稿
つばさ☆ nsm2116
てか疲れたから徹底的に改造してOK? マップはいっぱいあるのに1つ1つ判定してたらきりがない。
0そうだね
プレイ済み
返信[25]
親投稿
つばさ☆ nsm2116
GRP4初期化=つまりSPをプチコン起動時と同じ状態にしてる。
0そうだね
プレイ済み
返信[26]
親投稿
つばさ☆ nsm2116
ですよね~~
0そうだね
プレイ済み
返信[27]
親投稿
ACLSなどしていませぬ (多分)
1そうだね
プレイ済み
返信[28]
親投稿
確認してきましたがMAINLOOP内で1回CLSするくらいでGRP初期化はしていません。
2そうだね
プレイ済み
返信[29]
親投稿
つばさ☆ nsm2116
改造しました。 バグとか不具合は確認してませんw けど一応階段で降りたり登ったりできましたよ。 すごく複雑になってました。 @MAINLOOPの位置がすごい変なところにw
1そうだね
プレイ済み
返信[30]
親投稿
つばさ☆ nsm2116
ん。返信こないってことは気付いてないのか。よし通知をだそう。
0そうだね
プレイ済み
返信[31]
親投稿
あ、すいません すごいですね!!ありがとうございます。 しかし、マップを切り替えるたびに@MAINLOOPに移動していたら…IF文が大量に発生するのでは!? そして、マップ2種類で同じ階段を使っているのに行き先が違う… IF 自分はMAP02に居る&&階段に触れている THEN goto @map01 IF 自分はMAP01に居る&&階段に触れている THEN goto @map02 みたいな?
2そうだね
プレイ済み
返信[32]
親投稿
つばさ☆ nsm2116
いや全然発生しないよ。 GOSUBもしくはGOTOは文字列でラベルを指定できるじゃん。 んで@MAP01に行くとMAP$="02"にしていされる。んで階段に触れると GOTO "MAP"+MAP$としてます。 逆に@MAP02に行くとMAP$="01"になるのでGOTO @MAP01となり初期に戻ります。ただし1つのマップに複数階段があることは考えていませんのでするには配列を使うといいと思います。
0そうだね
プレイ済み
返信[33]
親投稿
つばさ☆ nsm2116
あ、ちなみに僕 学校ではほとんどひとりぼっちなので構ってほしいアピールをMiiverseではよく使います。構ってくれないってすごく悲しい。
0そうだね
プレイ済み
返信[34]
親投稿
あーいや、それぞれのマップで IF 自分はマップ35にいる && この人とぶつかった THEN 処理 IF 自分はマップ16にいる && 自販機に触れた THEN…的な感じで大量に発生する予感がしたので。 そして、ライバルを決めさせたらセーブデータの壁に詰ま~るセンター 画面写真の通り
1そうだね
プレイ済み
返信[35]
親投稿
つばさ☆ nsm2116
簡単ですよ。 例 マップが13とします。 そしてあらかじめ用意しておいた二次元配列を使います。 FOR I=0 TO そのマップの当たり判定の数-1 IF (X+Y)==二次元[13,I] THEN GOTO "HANTEI"+STR$(I) NEXT みたいな感じ。 二次元配列の中には判定する座標のXとYを足した数を入れればいいと思います。それだと1ドットしか判定できないのでIF文は少し工夫が必要です。(四角判定すればいいだけ。) マップが多いと二次元の配列の書き込みに時間が掛かりますが自分はこれしか思い付かないのでそれで許してくだせぇ。
2そうだね
プレイ済み
返信[36]
親投稿
つばさ☆ nsm2116
上のは判定方法。セーブはこちら ちょい意味が分かりませんが、プレイヤーの座標をセーブしたいのであればSTR$関数で数値を文字列に変換してセーブする文字列変数に入れればいいと思います。ただし、それだと読み込むときの区別ができないので1つ1つのデータの間に、「,」などを入れましょうそして、読み込むときはINSTR関数で「,」を探してそこは何々のデータみたいな感じで読み取ります。自分は数値配列セーブ、DATセーブじゃないと上手くプログラムが組めませんw
2そうだね
プレイ済み
返信[37]
親投稿
つばさ☆ nsm2116
追記 ライバルの名前、所持金、プレイ時間なども上と同じようにします。 分からない所があれば言ってください。 正直、日本語壊れかけてて自分も読みにくいw
2そうだね
プレイ済み
返信[38]
親投稿
つばさ☆ nsm2116
言い忘れ。 そのマップの判定するものの数は配列を使います(1次元)。 マップ13だったら 配列[13]=判定の数 てか結構書いたけど意外と簡単。
2そうだね
プレイ済み
返信[39]
親投稿
つばさ☆ nsm2116
またまた言い忘れ。 二次元配列の座標指定がめんどかったらBG単位座標でしましょう。それならキャラクターの座標を/16するかBGCOORDで変換し、四角で判定しなくてもよくなります。これだと一つ一つ判定ができない。ディスプレイ単位だったら細かく判定できるんだよなー。
1そうだね
プレイ済み
返信[40]
親投稿
←配列を1度も使ったことない人
2そうだね
プレイ済み
返信[41]
親投稿
つばさ☆ nsm2116
ステージメーカーでどんな敵を追加しようかな~♪
0そうだね
プレイ済み
返信[42]
親投稿
当たり判定の工夫 ・絵と飛び先を紐づけると便利 もし「デパートの絵」ならば「デパートに入る」 こうするとデパートを建てまくるときに便利…え、そんなにデパートがないって?
0そうだね
プレイ済み