>ですがこの計算式(右、左、上、下を調べてどの数値かを確認する)
キャラの大きさを足してから
>キャラの座標÷チップ一枚の大きさ=キャラのチップ位置を表す変数
この計算をすれば良い
「どの数値かを確認する」って言うのはマップを表示する時に使ったマップデータを参照する事
#define CHIPSIZE 64
#define MAPMAXX 10
#define MAPMAXY 8
mysizex=CHIPSIZE //自分のサイズ
mysizey=CHIPSIZE
mycsx=mysizex-1 //自分の左上を基点にして右下端の判定をする時キャラサイズをそのまま使うと隣のブロックを最小してしまうので-1(キャラがウィンドウ座標0にいてキャラ右端を64としたら64で割ると1になってしまう)
mycsy=mysizey-1
myspx=4 //自分の速度
myspy=4
//4が障害物、100以上が自分
map_txt={"
1,4,4, 1,1,1,1,1,1,1
1,4,1, 1,1,1,1,4,1,1
2,4,2, 2,2,2,4,2,2,2
2,2,2, 2,4,2,4,2,4,4
2,2,2, 2,4,2,4,2,2,4
3,3,3,103,3,3,3,3,3,4
4,3,3, 4,4,4,3,3,3,4
4,4,3, 3,3,3,3,4,4,4"}
dim map,MAPMAXX,MAPMAXY
buffer 1
//テキストデータをそのまま判定にも使うと面倒(個人的にだが)なので配列に入れなおす。ついでにbufferに背景を作成
split map_txt,"\n",map_y_txt
repeat MAPMAXY
split map_y_txt(cnt),",",map_x_txt
mapy=cnt
repeat MAPMAXX
map(cnt,mapy)=int(map_x_txt(cnt))
if map(cnt,mapy)=4 {//障害物
gradf cnt*CHIPSIZE,mapy*CHIPSIZE,CHIPSIZE,CHIPSIZE,((cnt+mapy)\2),$444444,$888888
}else{//障害物以外
if map(cnt,mapy)>=100 {//自分
mypx=cnt*CHIPSIZE:mypy=mapy*CHIPSIZE
map(cnt,mapy)=map(cnt,mapy)\100 //座標をセットしたらクリア(100未満を背景マップチップとして指定できる)
}
gradf cnt*CHIPSIZE,mapy*CHIPSIZE,CHIPSIZE-1,CHIPSIZE-1,1,$880077-$220000*map(cnt,mapy),$880055-$220000*map(cnt,mapy)
}
loop
loop
gsel 0
repeat
redraw 0
pos 0,0
celput 1,0
stick stk,$F
//移動量を求めるための準備(判定後の処理に必要になってくる)
mypx_old=mypx
mypy_old=mypy
if stk&1 {mypx-myspx}
if stk&4 {mypx+myspx}
if stk&2 {mypy-myspy}
if stk&8 {mypy+myspy}
//マップデータ外に出さない処理
mypx=limit(mypx,0,CHIPSIZE*MAPMAXX-CHIPSIZE)
mypy=limit(mypy,0,CHIPSIZE*MAPMAXY-CHIPSIZE)
//自分の左上のグリッド座標(マップ左上が0,0で右下最大がMAPMAXX-1,MAPMAXY-1 、0からなので使用チップ数-1になる)
myg_lx=mypx/CHIPSIZE
myg_uy=mypy/CHIPSIZE
//自分の右下のグリッド座標(myg_lx,myg_dyで左下、myg_rx,myg_uyが右上になる)
myg_rx=(mypx+mycsx)/CHIPSIZE
myg_dy=(mypy+mycsy)/CHIPSIZE
color 255,255,255
pos 0,0
if map(myg_lx,myg_uy)=4 {mes strf("X=%d,Y=%d",myg_lx,myg_uy):gradf myg_lx*CHIPSIZE,myg_uy*CHIPSIZE,CHIPSIZE,CHIPSIZE,1,$aa4444,$aa8888}//左上
if map(myg_rx,myg_uy)=4 {mes strf("X=%d,Y=%d",myg_rx,myg_uy):gradf myg_rx*CHIPSIZE,myg_uy*CHIPSIZE,CHIPSIZE,CHIPSIZE,1,$aa4444,$aa8888}//右上
if map(myg_lx,myg_dy)=4 {mes strf("X=%d,Y=%d",myg_lx,myg_dy):gradf myg_lx*CHIPSIZE,myg_dy*CHIPSIZE,CHIPSIZE,CHIPSIZE,1,$aa4444,$aa8888}//左下
if map(myg_rx,myg_dy)=4 {mes strf("X=%d,Y=%d",myg_rx,myg_dy):gradf myg_rx*CHIPSIZE,myg_dy*CHIPSIZE,CHIPSIZE,CHIPSIZE,1,$aa4444,$aa8888}//右下
gradf mypx,mypy,mysizex,mysizey,1,$55ddee,$55ddee
redraw 1
await 16
loop
判定が出来れば思い通りにキャラを動かせる訳じゃない
シューティングみたいに当たったらどちらか消せば済む物じゃないので
判定は一回じゃ済まない事が多い
判定も判定後の処理も色々方法があるので色々試してみると良い