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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0326
べりー当たり判定について5未解決


べりー

リンク

2014/3/26(Wed) 10:15:43|NO.60963

前回教えていただいたのですが、書き方が難しくて分かりませんでした。
コードの無駄な部分と重複している部分をまとめたりしました。

床面の当たり判定はできたのですが、
頭、壁への当たり判定が出来ず困っています。

出来るだけ簡単な書き方で教えていただければ幸いです。

頭の判定をぶつかったらキャラを下に強制移動だと壁に当たった瞬間
地面にもぐってしまうので、仮想で移動してブロックにめり込まなければ移動
めり込めば移動は無効の処理がいいのではないかと思いました。

仕様ですが、最初に左に移動すると配列がオーバーするので初期値より左に移動しないください。


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



この記事に返信する


べりー

リンク

2014/3/28(Fri) 19:27:43|NO.61025

よろしくお願いします。



y.tack

リンク

2014/3/28(Fri) 19:53:35|NO.61028

>仕様ですが、最初に左に移動すると配列がオーバーするので初期値より左に移動しないください。
移動する前に値が0でないか判定して
0なら左に行かないようにしましょう

>;仮想移動をしてブロックに当たらなければ移動:当たれば移動を無効
仮想移動の考え方を全面的に適用すれば解決しそうなかんじします

>頭の判定をぶつかったらキャラを下に強制移動だと壁に当たった瞬間
上ボタンを押したか?の判定と頭の判定をAND演算して
判定した時、下に移動じゃなく上への仮想移動を無効にしましょう



y.tack

リンク

2014/3/28(Fri) 20:18:26|NO.61030

少々参照しただけで恐縮なんですが
大槻有一郎著
HSP3.0ゲームプログミング教室
という書籍にシュティングゲームとマップ型アクションゲームのサンプルと解説が
載っています
参照したのは少々なんですが
当たり判定も書いてるかんじです



べりー

リンク

2014/3/29(Sat) 09:39:13|NO.61032

y.tackyさん

 仮想移動をしようと考えたのですが、どの様にすればいいのか分かりませんでした。
 左に移動して配列がマイナス値でエラーがでるのですが、マイナス値はもうひとつの
 配列を用意する予定です。

 教えていただいた書籍をさがしてみます、有難うございました。



y.tack

リンク

2014/3/29(Sat) 15:38:34|NO.61043

拙い説明で申し訳ない
書籍は
HSP3.0わくわくゲームプログラミング教室
ですね
Amazonで検索かけたら出てきますよ
「わくわく」が抜けてました



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