|
|
|
2016/6/4(Sat) 20:10:40|NO.75710
移動途中で移動方向設定のスクリプトが正常に作動しなくなります。
どこを載せていいのかわからなかったので全文載せます。すみません。
delete "hsptmp"
delete "obj"
#module ;モジュール作成
#deffunc dimmix array at ;ユーザー定義命令作成
ax = p ;変数の要素数を取得
repeat ax ;要素数の回数繰り返し
randomize ;要素入れ替えをランダム化
q = cnt + rnd(ax - cnt)
randomize
temp = at(q)
randomize
at(q) = at(cnt)
randomize
at(cnt) = temp
await 1
loop
return
#global ;モジュール作成終了
x = 32*10 : y = 32*16 : move = 16
gf = 0 : kai = 0 : mot = 0
//マップチップ読み込み
buffer 9,32*3,32
width ,,32*22,0
color 0,0,128
boxf 0,0,31,31
color 128,0,0
boxf 32,0,63,31
color 0,128,0
boxf 64,0,95,31
//マップデータ作成
map = "111111111111111111111"
map += "100000000010000000001"
map += "101110111010111011101"
map += "101110111010111011101"
map += "100000000000000000001"
map += "101110101111101011101"
map += "100000100010001000001"
map += "111110111010111011111"
map += "000010100000001010000"
map += "111110102202201011111"
map += "000000002000200000000"
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
//マップ描画
screen 0,32*21,32*22
width ,,0,0
title "0"
redraw 0
repeat 22
r = cnt
repeat 21
dmap = mapdata(r,cnt) ;マップ情報取得
pos (cnt*32),(r*32)
gmode 2,32,32
gcopy 9,(dmap*32),0
if maproad(r,cnt) = 1 : pos cnt*32+10,r*32+10 : mes "■"
if maproad(r,cnt) & 2 : pos cnt*32+10,r*32+10 : mes "←"
if maproad(r,cnt) & 4 : pos cnt*32+10,r*32+10 : mes "↑"
if maproad(r,cnt) & 8 : pos cnt*32+10,r*32+10 : mes "→"
if maproad(r,cnt) & 16 : pos cnt*32+10,r*32+10 : mes "↓"
await 1
loop
await 1
loop
redraw 1
//キャラクター読み込み
buffer 1
color 50,50,50
boxf 0,0,31,31
color 100,100,100
boxf 32,0,63,31
//キャラクター描画
gsel 0
repeat
gosub *map_comp
gosub *move_check
pos x,y
gmode 2,31,31
if gf = 0{
gcopy 1,0,0
gf = 1
}else{
gcopy 1,32,0
gf = 0
}
await 100
loop
//キャラクター移動とその判定
*move_check
//行動方向検索・指定(最初のみ)
if kai = 0{
mx = int(x/32) : my = int(y/32) ;現在マップ割り出し
pat = 0,0,0,0 : p = 0 ;次処理の下準備
//マップデータ参照
if maproad(my,mx) & 2{
pat(p) = 2
p += 1
}
if maproad(my,mx) & 4{
pat(p) = 4
p += 1
}
if maproad(my,mx) & 8{
pat(p) = 8
p += 1
}
if maproad(my,mx) & 16{
pat(p) = 16
p += 1
}
dimmix pat ;変数内の要素をシャッフル
repeat (p-1)
if pat(cnt) ! 0{
mot = pat(cnt)
break
}
loop
kai = -1
}
x = limit(x,0,ginfo_winx-31)
y = limit(y,0,ginfo_winy-31) ;x,y範囲指定
mx = int(x/32) : my = int(y/32) ;マップ位置割り出し
if mot = 2 : mx = int((x+16)/32)
if mot = 4 : my = int((y+16)/32) ;移動方向によってデータ修正
pat = 0,0,0,0 : p = 0
if mot = 2 : bmot = 8
if mot = 4 : bmot = 16
if mot = 8 : bmot = 2
if mot = 16 : bmot = 4 ;引き返す向きを仮定
if maproad(my,mx) & 2{
pat(p) = 2
p += 1
}
if maproad(my,mx) & 4{
pat(p) = 4
p += 1
}
if maproad(my,mx) & 8{
pat(p) = 8
p += 1
}
if maproad(my,mx) & 16{
pat(p) = 16
p += 1
} ;移動可能情報取得
*re_shuffle
dimmix pat ;変数内の要素をシャッフル
foreach pat
if pat(cnt) = 0{
continue
}else{
if pat(cnt) = bmap : continue ;引き返す向きを選択したら再選択
mot = pat(cnt) ;移動方向決定
break
}
await 1
loop
if mot = 2 : x -= move
if mot = 4 : y -= move
if mot = 8 : x += move
if mot = 16 : y += move ;移動方向によって座標修正
return
//キャラクター周辺マップの再描画
*map_comp
return
| |
|
2016/6/5(Sun) 18:25:55|NO.75729
とりあえず
> if pat(cnt) = bmap : continue ;引き返す向きを選択したら再選択
の変数名が間違ってる
他の問題として
半端な座標でも方向を変えるようにしてるので
半分壁にめり込んで進んでしまう
|
|
2016/6/5(Sun) 21:18:17|NO.75738
>>暇人
あ、本当ですね。ありがとうございます。
修正したところ発生していたエラーは見られなくなりました。
ただ、
>>半端な座標でも方向を変えるようにしてるので半分壁にめり込んで進んでしまう
これに関しては、mx,myの指定のあとのif群で調整できていると思うのですが。
原因が思いつかないのですが…
|
|
2016/6/5(Sun) 21:59:16|NO.75740
角から下に移動した場合
次のフレームでも角のマップを参照してしまってずれた状態で進む
(32+16)/32は1で次の場所には移動してないため起こる現象
逆に上移動は(32-16)/32で0になるので角から抜ける
> x = limit(x,0,ginfo_winx-31)
の上野行に
if (x\32)=0 and (y\32)=0 {
挿入して
> if mot = 2 : x -= move
の上に
}
を挿入すると
とりあえず問題無くなる
後関係ないけどrandomizeは最初に一回実行すれば良い
|
|
2016/6/5(Sun) 22:36:37|NO.75741
>>暇人
ありがとうございます。やってみます。
> if mot = 2 : x -= moveの上に
の下のコードが } しかなくどうすればいいのか…
申し訳ないのですが、再投稿していただけると助かります。
|
|
2016/6/5(Sun) 22:42:20|NO.75742
いや
そのままだけど・・・
(x\32)=0 and (y\32)=0 の時だけ{}間のスクリプトを実行するのが目的
|
|
2016/6/5(Sun) 23:20:32|NO.75743
>>if (x\32)=0 and (y\32)=0 {
ここの } を見逃してました。すみません
迷路内をきちんと移動するようにはなりましたが、同じルートを周回してしまいます。
もし可能ならこちらについてもヒントを頂けませんか?
|
|
2016/6/6(Mon) 00:02:08|NO.75744
それはdimmixが機能して無いから
モジュール内でモジュール外の変数から代入しようとしてる
変数pをパラメータとして渡すか p@ として直接利用するか
|
|
2016/6/6(Mon) 20:34:16|NO.75749
>>暇人
ありがとうございます。おかげさまで問題なく動くようになりました。
ただ、敵の数を4体に増やそうとしたところ
>>配列の要素が無効です。
と表示され、走らなくなりました。
他のサイトなどでも調べ、いろいろと解決策を試してはみたのですが、直りませんでした。
delete "hsptmp"
delete "obj"
#module ;モジュール作成
#deffunc dimmix array at ;ユーザー定義命令作成
mx = length(at) ;変数の要素数を取得
repeat mx ;要素数の回数繰り返し
randomize ;要素入れ替えをランダム化
r = cnt + rnd(mx - cnt)
temp = at(r)
at(r) = at(cnt)
at(cnt) = temp
loop
return
#global
x = 32*4,32*14,32*15,32*5 : y = 32*2,32*7,32*15,32*17
gf = 0,0,0,0 : kai = 0,0,0,0 : mot = 0,0,0,0 ;要素で指定し、repeat管理を簡易化
move = 16
//マップチップ読み込み
buffer 1,32*3,32
color 0,0,128
boxf 0,0,31,31
color 128,0,0
boxf 32,0,63,31
color 0,128,0
boxf 64,0,95,31
//マップデータ作成
map = "111111111111111111111"
map += "100000000010000000001"
map += "101110111010111011101"
map += "101110111010111011101"
map += "100000000000000000001"
map += "101110101111101011101"
map += "100000100010001000001"
map += "111110111010111011111"
map += "000010100000001010000"
map += "111110102202201011111"
map += "000000002000200000000"
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
//マップ描画
screen 0,32*21,32*22
width ,,((ginfo(20)-(32*21))/2),((ginfo(21)-(32*22))/2)
title "0"
redraw 0
repeat 22
r = cnt
repeat 21
dmap = mapdata(r,cnt) ;マップ情報取得
pos (cnt*32),(r*32)
gmode 2,32,32
gcopy 1,(dmap*32),0
if maproad(r,cnt) = 1 : pos cnt*32+10,r*32+10 : mes "■"
if maproad(r,cnt) & 2 : pos cnt*32+10,r*32+10 : mes "←"
if maproad(r,cnt) & 4 : pos cnt*32+10,r*32+10 : mes "↑"
if maproad(r,cnt) & 8 : pos cnt*32+10,r*32+10 : mes "→"
if maproad(r,cnt) & 16 : pos cnt*32+10,r*32+10 : mes "↓"
await 1
loop
await 1
loop
redraw 1
//キャラクター読み込み
buffer 2
color 50,50,50
boxf 0,0,31,31
color 100,100,100
boxf 32,0,63,31
buffer 3
color 100,100,100
boxf 0,0,31,31
color 150,150,150
boxf 32,0,63,31
buffer 4
color 150,150,150
boxf 0,0,31,31
color 200,200,200
boxf 32,0,63,31
buffer 5
color 200,200,200
boxf 0,0,31,31
color 240,240,240
boxf 32,0,63,31
//キャラクター描画
gsel 0
repeat
repeat 4
ccnt = cnt ;複数キャラクター管理用変数
gosub *map_comp
gosub *move_check
pos x(ccnt),y(ccnt)
gmode 2,31,31
if gf(ccnt) = 0{
gcopy (2+ccnt),0,0
gf(ccnt) = 1
}else{
gcopy (2+ccnt),32,0
gf(ccnt) = 0
}
await 100
loop
await 1
loop
//キャラクター移動とその判定
*move_check
//行動方向検索・指定(最初のみ)
if kai(ccnt) = 0{
mx = int(x(ccnt)/32) : my = int(y(ccnt)/32) ;現在マップ割り出し
pat = 0,0,0,0 : p = 0 ;次処理の下準備
//マップデータ参照
if maproad(my,mx) & 2{
pat(p) = 2
p += 1
}
if maproad(my,mx) & 4{
pat(p) = 4
p += 1
}
if maproad(my,mx) & 8{
pat(p) = 8
p += 1
}
if maproad(my,mx) & 16{
pat(p) = 16
p += 1
}
dimmix pat ;変数内の要素をシャッフル
repeat (p-1)
if pat(cnt) ! 0{
mot(ccnt) = pat(cnt)
break
}
await 1
loop
kai(ccnt) = -1
}
if (x(ccnt)\32)=0 and (y(ccnt)\32)=0 {
x(ccnt) = limit(x(ccnt),0,ginfo_winx-31)
y(ccnt) = limit(y(ccnt),0,ginfo_winy-31) ;x,y範囲指定
mx = int(x(ccnt)/32) : my = int(y(ccnt)/32) ;マップ位置割り出し
if mot(ccnt) = 2 : mx = int((x(ccnt)+16)/32)
if mot(ccnt) = 4 : my = int((y(ccnt)+16)/32) ;移動方向によってデータ修正
pat = 0,0,0,0 : p = 0
if mot(ccnt) = 2 : bmot = 8
if mot(ccnt) = 4 : bmot = 16
if mot(ccnt) = 8 : bmot = 2
if mot(ccnt) = 16 : bmot = 4 ;引き返す向きを仮定
if maproad(my,mx) & 2{
pat(p) = 2
p += 1
}
if maproad(my,mx) & 4{
pat(p) = 4
p += 1
}
if maproad(my,mx) & 8{
pat(p) = 8
p += 1
}
if maproad(my,mx) & 16{
pat(p) = 16
p += 1
} ;移動可能情報取得
dimmix pat ;変数内の要素をシャッフル
foreach pat
if pat(cnt) = 0{
continue
}else{
if pat(cnt) = bmot : continue ;引き返す向きを選択したら再選択
mot(ccnt) = pat(cnt) ;移動方向決定
break
}
await 1
loop
}
if mot(ccnt) = 2 : x(ccnt) -= move
if mot(ccnt) = 4 : y(ccnt) -= move
if mot(ccnt) = 8 : x(ccnt) += move
if mot(ccnt) = 16 : y(ccnt) += move ;移動方向によって座標修正
return
//キャラクター周辺マップの再描画
*map_comp
bmx = int(x(ccnt)/32) : bmy = int(y(ccnt)/32)
bmapnum = bmx + (bmy*21)
bmapcode = int(peek(map,bmapnum))
pos (bmx*32),(bmy*32)
gmode 2,32,32
gcopy 1,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 1,0+(bdmap*32),0
loop
return
またしてもすみません。全文掲載です。
「変数の型が…」というようなことだったのでいろいろと触ってみたのですが…
ヒントをいただけると助かります。何度もすみません。
| |
|
2016/6/6(Mon) 21:08:07|NO.75750
エラーになったらその周辺で使われてる変数等を表示したり
logmes等つかって見えるようにした方が良い
> repeat (p-1)
> if pat(cnt) ! 0{
pが0の時にループ回数が-1で無限になってしまって
cntが4の時にエラーが出る
pが0になってる原因は
> x = 32*4,32*14,32*15,32*5 : y = 32*2,32*7,32*15,32*17
の位置が道以外を指してるから
後randomizeはループ内じゃなくメインループ前に一回だけ実行すれば良い
|
|
2016/6/6(Mon) 22:04:55|NO.75751
>>暇人
ありがとうございます。おかげさまで完成しました。
これからもお願いします。
|
|