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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0712
ぺーぺーマップでの方向転換5未解決


ぺーぺー

リンク

2016/7/12(Tue) 20:26:39|NO.76161

先日、1度質問しアドバイスをいただいたのですが、うまくいきませんでした。
そもそものところでマップが正常に表示されません。元のスクリプトからコピペしたのがいけなかったのでしょうか…
とりあえずマップの表示をできるようにお願いします。
そしてこれが本題なのですが、壁に半分めり込んだり、動けなくなることがあるので、そちらのほうもよろしくお願いします。

x = 96 : y = 96 : move = 16 : muki = 1 key = 0 : check = 0 map = "00000" map += "01010" map += "00000" map += "01010" map += "00000" //mapを文字列型から数値型の配列変数に変換 dim mapdata,5,5 ;22*21の二次元変数作成 r = 0 ;0…マップ1段目、1…マップ2段目と指定するための変数 i = 0 ;抜き出す文字列のインデックスを指定 repeat 5 repeat 5 mapdata(r,cnt) = int(strmid(map,i,1)) ;mapdata(1,5)…マップ2段目6枚目を示す。 i += 1 await 1 loop r += 1 await 1 loop //mapから通路情報を作成 ;0 = 通路 ;1 = 非通路 ;2を含む = 左が空いた通路 ;4含む = 上が空いた通路 ;8を含む = 右が空いた通路 ;16を含む = 下が空いた通路 //=========================== dim maproad,5,5 ;通路情報調査用 repeat 5 r = cnt repeat 5 maproad(r,cnt) = 1 ;非通路 if mapdata(r,cnt) = 0{ maproad(r,cnt) = 0 ;通路 //調査位置の上下左右 lr = r : lc = cnt-1 ;左 ur = r-1 : uc = cnt ;上 rr = r : rc = cnt+1 ;右 dr = r+1 : dc = cnt ;下 if lc>0 : if mapdata(lr,lc) = 0 : maproad(r,cnt) |= 2 ;左 if ur>0 : if mapdata(ur,uc) = 0 : maproad(r,cnt) |= 4 ;上 if rc<5 : if mapdata(rr,rc) = 0 : maproad(r,cnt) |= 8 ;右 if dr<5 : if mapdata(dr,dc) = 0 : maproad(r,cnt) |= 16 ;下 } await 1 loop await 1 loop buffer 1 ;キャラクター画像読み込み color 100,0,0 boxf buffer 2 ;マップチップ読み込み color 0,100,0 boxf 0,0,32,32 color 0,0,100 boxf 33,33,64,64 screen 0,160,160 repeat redraw 0 stick key,15 if (key = 1) or (key = 2) or (key = 4) or (key = 8) : gosub *move_check gosub *map_comp pos x,y gmode 2,31,31 gcopy 1 redraw 1 await 100 loop stop *move_check if key = 1{ if (check = 4) or (check = 16){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 1 : check = 2 } if key = 2{ if (check = 2) or (check = 8){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 2 : check = 4 } if key = 4{ if (check = 4) or (check = 16){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 3 : check = 8 } if key = 8{ if (check = 4) or (check = 8){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 4 : check = 16 } mx = int(x/32) : my = int(y/32) cx = int((x+31)/32) : cy = int((y+31)/32) if check = 2 : mx = int((x+16)/32) if check = 4 : my = int((y+16)/32) if (maproad(my,mx) & check){ if muki = 1 : x -= move if muki = 2 : y -= move if muki = 3 : x += move if muki = 4 : y += move } return *map_draw i = 0 redraw 0 repeat 5 my = cnt repeat 5 maps = peek(map,i) if maps = '0' : dmap = 0 if maps = '1' : dmap = 1 pos cnt*32,my*32 gmode 2,32,32 gcopy 2,dmap*32,0 i += 1 await 1 loop await 1 loop redraw 1 return *map_comp ;キャラクター周辺マップ再描画 bmx = int(x/32) : bmy = int(y/32) bmapnum = bmx + (bmy*5) bmapcode = peek(map,bmapnum) pos (bmx*32),(bmy*32) gmode 2,32,32 gcopy 2 repeat 4 if cnt = 0 : bmapnum = (bmx-1) + (bmy*5) if cnt = 1 : bmapnum = bmx + ((bmy-1)*5) if cnt = 2 : bmapnum = (bmx+1) + (bmy*5) if cnt = 3 : bmapnum = bmx + ((bmy+1)*5) bmapcode = peek(map,bmapnum) if cnt = 0 : pos ((bmx-1)*32),(bmy*32) if cnt = 1 : pos (bmx*32),((bmy-1)*32) if cnt = 2 : pos ((bmx+1)*32),(bmy*32) if cnt = 3 : pos (bmx*32),((bmy+1)*32) gmode 2,32,32 if bmapcode = '0' : bdmap = 0 if bmapcode = '1' : bdmap = 1 gcopy 2,bdmap*32,0 loop return



この記事に返信する


KA

リンク

2016/7/12(Tue) 23:50:24|NO.76167

前にも言ったけど、一度に完成を目指さないこと。

>>そもそものところでマップが正常に表示されません。
1)まず、正常に表示させましょう。

2)次に移動できる方向が正しく計算されているのか、何らかの表示で検証します。

3)そして、移動させる方向が移動できる方向に制限されるのか確認します。

4)上記の手順を経て、やっと複雑なマップで試せます。

どう考えて書いたのか自分自身が分からないと、コピペだけじゃうまくいきません。
スクリプトに「なぜこうしているのか」コメントを付けましょう。



ぺーぺー

リンク

2016/7/13(Wed) 00:06:40|NO.76168

>>一度に完成を目指さないこと
仰るとおりです。つい欲を出してしまって…
もう一度削って少しずつ投稿します。
このスレは消さずにおいておき、ここに修正後再投稿することにします。



暇人

リンク

2016/7/13(Wed) 23:08:00|NO.76189

>とりあえずマップの表示をできるようにお願いします。

gosub *map_draw
が無い



ぺーぺー

リンク

2016/7/18(Mon) 20:08:25|NO.76260

一応自分で出来るだけのことはしてみました。
修正後に新たに発生しているエラーは
・右端、下端にたどり着く直前に「配列の要素が無効です。」と表示される。
・上方向、左方向に移動していくと途中から進めなくなる。
です。
前のエラーも修正できていません。
すみませんが、協力お願いします。
	delete "hsptmp"
delete "obj" map = "00000" map += "01010" map += "00000" map += "01010" map += "00000" x = 64 : y = 64 : move = 16 : muki = 1 key = 0 : check = 0 //mapを文字列型から数値型の配列変数に変換 dim mapdata,5,5 ;22*21の二次元変数作成 r = 0 ;0…マップ1段目、1…マップ2段目と指定するための変数 i = 0 ;抜き出す文字列のインデックスを指定 repeat 5 repeat 5 mapdata(r,cnt) = int(strmid(map,i,1)) ;mapdata(1,5)…マップ2段目6枚目を示す。 i += 1 await 1 loop r += 1 await 1 loop //mapから通路情報を作成 ;0 = 通路 ;1 = 非通路 ;2を含む = 左が空いた通路 ;4含む = 上が空いた通路 ;8を含む = 右が空いた通路 ;16を含む = 下が空いた通路 //=========================== dim maproad,5,5 ;通路情報調査用 repeat 5 r = cnt repeat 5 maproad(r,cnt) = 1 ;非通路 if mapdata(r,cnt) = 0{ maproad(r,cnt) = 0 ;通路 //調査位置の上下左右 lr = r : lc = cnt-1 ;左 ur = r-1 : uc = cnt ;上 rr = r : rc = cnt+1 ;右 dr = r+1 : dc = cnt ;下 if lc>0 : if mapdata(lr,lc) = 0 : maproad(r,cnt) |= 2 ;左 if ur>0 : if mapdata(ur,uc) = 0 : maproad(r,cnt) |= 4 ;上 if rc<5 : if mapdata(rr,rc) = 0 : maproad(r,cnt) |= 8 ;右 if dr<5 : if mapdata(dr,dc) = 0 : maproad(r,cnt) |= 16 ;下 } await 1 loop await 1 loop buffer 1 ;キャラクター画像読み込み color 100,0,0 boxf buffer 2 ;マップチップ読み込み color 0,100,0 boxf 0,0,32,32 color 0,0,100 boxf 33,0,65,65 screen 0,160,160 gosub *map_draw repeat redraw 0 stick key,15 if (key = 1) or (key = 2) or (key = 4) or (key = 8) : gosub *move_check gosub *map_comp pos x,y gmode 2,31,31 gcopy 1 redraw 1 await 100 loop *map_draw i = 0 redraw 0 repeat 5 my = cnt repeat 5 maps = peek(map,i) if maps = '0' : dmap = 0 if maps = '1' : dmap = 1 gmode 2,32,32 pos cnt*32,my*32 gcopy 2,dmap*33,0 i += 1 await 1 loop await 1 loop redraw 1 return *map_comp ;キャラクター周辺マップ再描画 bmx = int(x/32) : bmy = int(y/32) pos bmx*32,bmy*32 gmode 2,32,32 gcopy 2,mapdata(bmy,bmx)*32,0 repeat 4 gmode 2,32,32 if cnt = 0{ ;左 pos (bmx-1)*32,bmy*32 gcopy 2,mapdata(bmy,bmx-1)*32,0 } if cnt = 1{ ;上 pos bmx*32,(bmy-1)*32 gcopy 2,mapdata(bmy-1,bmx)*32,0 } if cnt = 2{ ;右 pos (bmx+1)*32,bmy*32 gcopy 2,mapdata(bmy,bmx+1)*32,0 } if cnt = 3{ ;下 pos bmx*32,(bmy+1)*32 gcopy 2,mapdata(bmy+1,bmx)*32,0 } await 1 loop return *move_check //入力したキーによって「縦移動から横移動に変更」のような方向転換かどうか調べ、そうであればマップチップ角と座標が一致していなければ無効にする if key = 1{ if (check = 4) or (check = 16){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 1 : check = 2 } if key = 2{ if (check = 2) or (check = 8){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 2 : check = 4 } if key = 4{ if (check = 4) or (check = 16){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 3 : check = 8 } if key = 8{ if (check = 4) or (check = 8){ if (x\32 = 0) and (y\32 = 0) : else : return } muki = 4 : check = 16 } //移動後の座標を仮計算 mx = int(x/32) : my = int(y/32);マップ座標確認 if check = 2 : mx = int((x+16)/32) if check = 4 : my = int((y+16)/32);方向によって一部修正 if (maproad(my,mx) & check){ ;移動可能であれば適用 if muki = 1 : x -= move if muki = 2 : y -= move if muki = 3 : x += move if muki = 4 : y += move } return



ぺーぺー

リンク

2016/7/18(Mon) 20:10:50|NO.76261

>>暇人さん 「gosub *map_draw が無い」
返信が遅くなりすみませんでした。
まさかそんな根本的なことだったとは…
最初から組み直したら走ったので頭を捻ってましたが納得です。ありがとうございました。



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