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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0705
ぺーぺーマップと合った曲がり方2解決


ぺーぺー

リンク

2016/7/5(Tue) 20:55:48|NO.76124

お世話になります。
マップ上でキャラクターの方向転換をさせているのですが、壁にめり込まないように曲がらせたいです。
自分で組んだものだと、時々壁にめり込んでしまったり、フリーズしたりしてしまいます。
フリーズの原因はキャラクターの角がマップの角と合っていないと曲がれないようにしているためだと思われます。
壁にめり込む原因も仮座標計算が不十分なためなのですが、変更したり、付け加えたりすると動かなくなってしまうので困っています。

delete "hsptmp" delete "obj" #module ;モジュール作成 #deffunc dimmix array at ;ユーザー定義命令作成 mx = length(at) ;変数の要素数を取得 randomize ;要素入れ替えをランダム化 repeat mx ;要素数の回数繰り返し r = cnt + rnd(mx - cnt) temp = at(r) at(r) = at(cnt) at(cnt) = temp loop return #global *start x = 320 : y = 512 : move = 16 : muki = 1 xt = 32*4,32*13,32*1,32*5 : yt = 32*1,32*6,32*15,32*17 key = 0 : check = 0 : gf = 0 kai = 0,0,0,0 : mot = 0,0,0,0 ;要素で指定し、repeat管理を簡易化 sdim map,462 map = "111111111111111111111" map += "100000000010000000001" map += "101110111010111011101" map += "101110111010111011101" map += "100000000000000000001" map += "101110101111101011101" map += "100000100010001000001" map += "111110111010111011111" map += "000010100000001010000" map += "111110102202201011111" map += "000010002000200010000" map += "111110102222201011111" map += "000010100000001010000" map += "111110101111101011111" map += "100000000010000000001" map += "101110111010111011101" map += "100010000000000010001" map += "111010101111101010111" map += "100000100010001000001" map += "101111111010111111101" map += "100000000000000000001" map += "111111111111111111111" ;マップデータ作成 //mapを文字列型から数値型の配列変数に変換 dim mapdata,22,21 ;22*21の二次元変数作成 r = 0 ;0…マップ1段目、1…マップ2段目を指定するための変数 i = 0 ;抜き出す文字列のインデックスを指定 repeat 22 repeat 21 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,22,21 ;通路情報調査用 repeat 22 r = cnt repeat 21 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<21 : if mapdata(rr,rc) = 0 : maproad(r,cnt) |= 8 ;右 if dr<22 : if mapdata(dr,dc) = 0 : maproad(r,cnt) |= 16 ;下 } await 1 loop await 1 loop *main cls //キャラクター画像読み込み buffer 1 color 240,0,0 boxf 0,0,31,31 color 0,240,0 boxf 32,32,63,63 buffer 2 color 240,0,0 boxf 0,0,31,31 color 0,240,0 boxf 32,32,63,63 buffer 3 color 240,0,0 boxf 0,0,31,31 color 0,240,0 boxf 32,32,63,63 buffer 4 color 240,0,0 boxf 0,0,31,31 color 0,240,0 boxf 32,32,63,63 //マップチップ読み込み buffer 5 color 100,100,100 boxf 0,0,32,32 color 200,200,200 boxf 32,32,64,64 color 150,150,150 boxf 64,64,96,96 screen 0,672,704 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 if gf = 0 { gcopy muki,0,0;画像コピー gf = 1 }else{ gcopy muki,32,0;画像コピー gf = 0 } 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 22 my = cnt repeat 21 maps = peek(map,i) if maps = '0' : dmap = 0 if maps = '1' : dmap = 1 if maps = '2' : dmap = 2 pos cnt*32,my*32 gmode 2,32,32 gcopy 5,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*21) bmapcode = peek(map,bmapnum) pos (bmx*32),(bmy*32) gmode 2,32,32 gcopy 5,0,0 repeat 4 if cnt = 0 : bmapnum = (bmx-1) + (bmy*21) if cnt = 1 : bmapnum = bmx + ((bmy-1)*21) if cnt = 2 : bmapnum = (bmx+1) + (bmy*21) if cnt = 3 : bmapnum = bmx + ((bmy+1)*21) 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 if bmapcode = '2' : bdmap = 2 gcopy 5,0+(bdmap*32),0 loop return *game_clear stop *game_over stop
よろしくお願いします。



この記事に返信する


KA

リンク

2016/7/6(Wed) 20:05:53|NO.76131

こういう場合の常套手段は「簡略化」です。

1:マップ数を減らして、上と右しか行けない様にしてみる。
 それで問題がなければ
2:上下左右がある最小マップ「田」で試す。
 それで問題が無ければ
3:複雑なマップで試す。

というか、おかしい部分が分かっているのなら、その部分だけ
再現できるスクリプトにしてみましょう。

たぶんマップ2×2の一方向でも再現できるはずです。



ぺーぺー

リンク

2016/7/7(Thu) 17:00:07|NO.76132

>KAさん
返信遅くなりました。
分かりました。試してみます。
一応解決にしますが、「田」で試してダメだったときはまた質問させていただきますので、その時はお願いします。



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