|
 |
|
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

| |
|
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 が無い」
返信が遅くなりすみませんでした。
まさかそんな根本的なことだったとは…
最初から組み直したら走ったので頭を捻ってましたが納得です。ありがとうございました。
|
|