コードの無駄な部分と重複している部分をまとめたりしました。
床面の当たり判定はできたのですが、
頭、壁への当たり判定が出来ず困っています。
出来るだけ簡単な書き方で教えていただければ幸いです。
頭の判定をぶつかったらキャラを下に強制移動だと壁に当たった瞬間
地面にもぐってしまうので、仮想で移動してブロックにめり込まなければ移動
めり込めば移動は無効の処理がいいのではないかと思いました。
仕様ですが、最初に左に移動すると配列がオーバーするので初期値より左に移動しないください。
x1=0.0 y1=0.0 ; 画面左上の座標 x2=480.0 y2=480.0 ; 画面右下の座標 #define α_G 0.98 //重力加速度 char_size=16.0 ; キャラのサイズ ; キャラの座標 Char_x = 240.0 Char_y = 300.0 ; XY方向のキャラ座標加算値 vx_Char = 1.0 vy_Char = 0.0 ; ブロックを崩すフラグ(1=崩す) bk=0 ; キャラの滞空フラグ(0,1)=(着地,落下) IsBallJumping = 1 // ●---head---● // | | // | | // | | // | | // ●---leg----● block_size=10.0 ; ブロック1個の一辺長さ(正方形) glid_x=0 :glid_y=0 ; ブロックの表示開始位置(左上) ; ブロックの配置数(X,Y) blnum_x=x2 / block_size + 2 ; ブロックのx方向の個数 blnum_y=y2 / block_size ; 〃 y 〃 screen 0,x2,y2 title "キャラ移動" dim world_wall ,1000 ,blnum_y ; ワールドブロック dim wall ,blnum_x ,blnum_y ; ブロックを表示するフラグ 0=表示、1=表示しない ;< ブロックの存在の設定 > repeat 1000 ;右端20列を穴にする cnt1 = cnt repeat blnum_y world_wall(cnt1,cnt) = 1 loop loop ranran=39 repeat 1000 cnt1=cnt world_wall(cnt1,ranran) = 0 if ranran =39: ranran=ranran +rnd(2) loop repeat blnum_x ;右端20列を穴にする cnt1 = cnt repeat 40 wall(cnt1,cnt) = 1 world_wall(cnt1,cnt) = wall(cnt1,cnt) loop loop *main redraw 0 gradf 0,0,x2,y2,1,0,128 ; 画面クリア //////////////////////////////// // 矢印でブロック配置・撤去 // //////////////////////////////// getkey cleak_R ,39;右 getkey cleak_L ,37;左 getkey cleak_UP ,38;上 getkey cleak_DOWN,40;下 getkey item_1,49:if item_1=1:item=0;アイテムスロット1 getkey item_2,50:if item_2=1:item=1;アイテムスロット2 getkey item_3,51:if item_3=1:item=2;アイテムスロット3 getkey item_4,52:if item_4=1:item=3;アイテムスロット4 getkey item_5,53:if item_5=1:item=4;アイテムスロット5 getkey item_6,54:if item_6=1:item=5;アイテムスロット6 getkey item_7,55:if item_7=1:item=6;アイテムスロット7 if (cleak_R=1)&(cleak_UP=0)&(cleak_DOWN=0)&(cleak_L=0) { set_blx=bl_legx+10:set_bly=bl_legy-1+glid_y repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_L=1)&(cleak_UP=0)&(cleak_DOWN=0)&(cleak_R=0){ set_blx=bl_legx-11:set_bly=bl_legy-1 repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_UP=1)&(cleak_L=0)&(cleak_R=0)&(cleak_DOWN=0){ set_blx=bl_legx:set_bly=bl_heady-10 repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_DOWN=1)&(cleak_L=0)&(cleak_R=0)&(cleak_UP=0){ set_blx=bl_legx:set_bly=bl_legy+1 repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_DOWN=0)&(cleak_L=0)&(cleak_R=1)&(cleak_UP=1){ set_blx=bl_legx+10:set_bly=bl_heady repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_DOWN=0)&(cleak_L=1)&(cleak_R=0)&(cleak_UP=1){ set_blx=bl_legx-10:set_bly=bl_heady repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_DOWN=1)&(cleak_L=1)&(cleak_R=0)&(cleak_UP=0){ set_blx=bl_legx-10:set_bly=bl_legy+1 repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } if (cleak_DOWN=1)&(cleak_L=0)&(cleak_R=1)&(cleak_UP=0){ set_blx=bl_legx+10:set_bly=bl_legy+1 repeat blnum_x cntx=cnt if(cntx*10 <= set_blx) & (set_blx <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= set_bly) & (set_bly <= cnty*10+9){ wall(cntx,cnty) = item } loop } loop } repeat blnum_x cntx=cnt if (cntx*10 <= Char_x) & (Char_x <= cntx*10+9){ repeat blnum_y cnty=cnt if (cnty*10 <= Char_y) & (Char_y <= cnty*10+9){ } loop } loop //////////////////// // ブロックの描画 // //////////////////// color 200,200,0 repeat blnum_y cy = cnt y_check =(block_size * cnt ) + glid_y repeat blnum_x cx = cnt x_check =(block_size * cnt) + glid_x if wall(cx,cy) = 0 { ;0はブロック存在 1はブロック無し sukima = 1;1ならスキマ無し、2ならスキマ有 boxf x_check, y_check, (x_check + block_size - sukima ), (y_check + block_size - sukima ) } loop loop //glidが10ドット動くとワールド壁から配列を1つずらして //配列に代入させる if glid_x <= -10{ glid_x =0 repeat blnum_x cnt1 = cnt repeat blnum_y //ワールド壁へ表示分の返却 world_wall(cnt1+cnt_move, cnt) = wall(cnt1 , cnt) loop loop repeat blnum_x cnt1 = cnt repeat blnum_y //ワールド壁から表示分の渡し wall(cnt1 , cnt) = world_wall(cnt1+cnt_move+1, cnt) loop loop cnt_move=cnt_move+1 } if glid_x>=10{ glid_x=0 repeat blnum_x cnt1 = cnt repeat blnum_y //ワールド壁へ表示分の返却 world_wall(cnt1+cnt_move, cnt) = wall(cnt1 , cnt) loop loop repeat blnum_x cnt1 = cnt repeat blnum_y //ワールド壁から表示分の渡し wall(cnt1 , cnt) = world_wall(cnt1+cnt_move-1, cnt) loop loop cnt_move=cnt_move-1 } /* //上下の移動の場合 ・まだ手付かず if glid_y>=10{ glid_y=0 repeat blnum_x cnt1 = cnt repeat blnum_y //ワールド壁へ表示分の返却 world_wall(cnt1+cnt_move, cnt) = wall(cnt1 , cnt) loop loop repeat blnum_x cnt1 = cnt repeat blnum_y //ワールド壁から表示分の渡し wall(cnt1 , cnt) = world_wall(cnt1+cnt_move-1, cnt) loop loop cnt_move=cnt_move-1 ] */ ///////////////////////////////// // // // ブロック当たり判定 // // // ///////////////////////////////// repeat blnum_x cntx=cnt repeat blnum_y cnty=cnt if wall(cntx,cnty)=0{ bl_headx = Char_x + (char_size/2) bl_heady = Char_y - (glid_y) bl_legx = Char_x + (char_size/2) bl_legy = Char_y + (char_size ) - (glid_y) - 2 //頭が当たる判定 if (cntx*10 <= bl_headx) & (bl_headx <= cntx*10+9){ if(cnty*10 <= bl_heady) & (bl_heady <= cnty*10+9){ IsBallJumping = 1 vx_char=0 } } //足場判定 if (cntx*10<= bl_legx)&(bl_legx <=cntx*10+9){ if(cnty*10<= bl_legy)&(bl_legy <=cnty*10+9){ IsBallJumping = 0 Char_y = cnty*10-15 } } } loop loop //////////////// // キャラ移動 // //////////////// ;vx_Char = 1.0 //左移動 getkey A_move,65 if A_move=1{ ;仮想移動をしてブロックに当たらなければ移動:当たれば移動を無効 ;pre_glid_x = glid_x + vx_Char if HIT_head = 0{ glid_x = glid_x + vx_Char //vx_Charは進行速度 } } //右移動 getkey D_move,68 if D_move=1{ glid_x = glid_x - vx_Char } //スペースキーでジャンプ getkey spase_jump,32//スペースキー if (IsBallJumping = 0){ vy_Char = 0.0 if (spase_jump = 1){ vy_Char = vy_Char - 8.0 Char_y = (Char_y) + (vy_Char) } }else{ vy_Char + α_G ;落下限界速度(ブロック突抜け対策) if (vy_Char + α_G)>9:vy_Char=9 } ;< 移動処理 > Char_y + vy_Char IsBallJumping = 1 //画面外離脱制御 if Char_x <= x1 : Char_x = x1 if Char_x >= ( x2 - char_size) : Char_x = x2 - char_size if Char_y <= y1 : Char_y = y1 if Char_y >= ( y2 - char_size) : Char_y = y2 - char_size //////////////////// // 自分キャラ表示 // //////////////////// ; ボールを表示 pos Char_x,Char_y:color 255,255,255 font msgothic,char_size mes "●" pos 0,0:color 255,255,255 mes "glid_x:"+glid_x pos 0,20:color 255,255,255 mes "glid_y:"+glid_y pos 0,40:color 255,255,255 mes "world grid:"+cnt_move redraw 1 await 16 goto *main *gameover objsize 180,32 pos 150,330:button "終わり",*owari stop *owari end