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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0227
こんとん地形との接触判定について1解決


こんとん

リンク

2015/2/27(Fri) 14:33:53|NO.67562


現在、プレイヤーを動かして地形と接触したら接触箇所によって床なら上に乗ったまま停止し、 壁ならその方向にはもう行けなくするプログラムを作りました。 浮遊している足場1個(マップチップ一つ分)だけの上や横に触れたりした場合は正常に停止するのですが、 床のマップチップが横に並んでいる状態などでその上に立ったりすると床の上に立つと同時に壁にも横から 壁に接触しているとも認識されます。 地形接触の判定が自分のやり方ではマリオなどのように動作させられないため、 正しい地形接触判定はどのようにすればよろしいでしょうか? 自分は以下のようなソースで動かしてみました。 screen 0,800,600,0 ddim player_velset_xy,2 ;プレイヤーの初速度 player_velset_xy(0)=double(0):player_velset_xy(1)=double(0) ddim player_veladd_xy,2 ;プレイヤーの加速度 player_veladd_xy(0)=double(0):player_veladd_xy(1)=double(0) ddim player_veladd_xy,2 ;プレイヤーの最終移動速度(初速+加速+重力) player_vel_xy(0)=double(0):player_vel_xy(1)=double(0) ddim player_xy,2 ;プレイヤーの座標・画面内 player_xy(0)=double(160):player_xy(1)=double(5) ddim player_width,2 ;プレイヤーの幅 player_width(0)=double(159):player_width(1)=double(196) ddim mapWidth,2 ;マップの幅 mapWidth(0) = double(1250):mapWidth(1) = double(1600) // マップの幅 ddim Gravity,max1 ;個々の重力 Gravity(0) = double(1.5) // プレイヤーの重力 ddim window_width,2 ;ウィンドウサイズ window_width(0)=double(ginfo_winx):window_width(1)=double(ginfo_winy) ;MAP中のスクリーンの座標 scrx=double(0):scry=double(0) scrx_f=0 ;Xスクロール中フラグ scry_f=0 ;Yスクロール中フラグ ddim margin,2 ;スクロール開始イマージン margin(0)=double(400):margin(1)=double(300) dim player_mflag,25,4 ;プレイヤーのマップチップの接触フラグ player_mflag(0,0)=0 ;左 player_mflag(0,1)=0 ;右 player_mflag(0,2)=0 ;上 player_mflag(0,3)=0 ;下 ;マップデータ map(0)="0010" map(5)="00000100000000200001"+"00001" map(13)="11111111100011111111"+"10111" map_size=window_width(0)/20 ;マップチップの幅と高さ map_int=1.0+window_width(0)/20 ;マップチップの配置間隔 ;マップチップのXY座標 ddim mapc_x,25,25 ddim mapc_y,25,25 ;マップチップのXY接触判定 dim mapc_pf,25,25 ;マップチップの属性1(地形や壁か) dim mapc_type1,25,25 ;描画部分▼ buffer 2,1250,600:cls 4 for map_cx,0,25 for map_cy,0,25 mapc_type1(map_cx,map_cy)=int(strmid(map(map_cy),map_cx,1)) if strmid(map(map_cy),map_cx,1)="1" { color 5,5,5:boxf (map_cx*map_int) ,(map_cy*map_int) ,(map_cx*map_int+map_size) ,(map_cy*map_int+map_size) mapc_x(map_cx,map_cy)=double(map_cx*map_int) mapc_y(map_cx,map_cy)=double(map_cy*map_int) } if strmid(map(map_cy),map_cx,1)="2" { color 255,0,0:boxf (map_cx*map_int) ,(map_cy*map_int) ,(map_cx*map_int+map_size) ,(map_cy*map_int+map_size) mapc_x(map_cx,map_cy)=double(map_cx*map_int) mapc_y(map_cx,map_cy)=double(map_cy*map_int) } next next ;自機設定 buffer 3:color 0,0,255:boxf 0,0,159,196 gsel 0 repeat redraw 0 color 255,255,255:boxf 0,0,800,600 getkey key1,37 getkey key2,38 getkey key3,39 getkey key4,40 ;ニュートラル if (key1=0 & key2=0 & key3=0) { player_vel_xy(0) = double(0) player_velset_xy(0) = double(0) player_veladd_xy(0) = double(0) } ;移動 if key3>0 { ;→ player_velset_xy(0) = double(5) } if key1>0{ ;← player_velset_xy(0) = double(-5) } if key2>0 { ;↑ player_velset_xy(1) = double(-5) } if key4>0 { ;↓ player_velset_xy(1) = double(0) } ;最終的な移動速度を決定 player_vel_xy(0)=(player_velset_xy(0)+player_veladd_xy(0)) player_vel_xy(1)=Gravity(0)+(player_velset_xy(1)+player_veladd_xy(1)) ;地形接触時の停止 if player_mflag(0,0)=1 & player_vel_xy(0) > 0 { player_vel_xy(0)=double(0) player_mflag(0,0)=0 } if player_mflag(0,1)=1 & player_vel_xy(0) < 0 { player_vel_xy(0)=double(0) player_mflag(0,1)=0 } if player_mflag(0,2)=1 & player_vel_xy(1) > 0 { player_vel_xy(1)=double(0) player_mflag(0,2)=0 } if player_mflag(0,3)=1 & player_vel_xy(1) < 0 { player_vel_xy(1)=double(0) player_mflag(0,3)=0 } ;マップチップ表示 pos 0,0 gmode 2,,,128 gcopy 2,scrx,scry,window_width(0),window_width(1) ;自機 gmode 0 pos player_xy(0),player_xy(1) gcopy 3,0,0,player_width(0),player_width(1) screen_out -5,-5,-5,-5 ;画面外に出ないように ;地形との衝突判定 for map_cx,0,25 for map_cy,0,25 if (player_xy(0) +player_width +scrx) > mapc_x(map_cx,map_cy) & (player_xy(0) + scrx) < ((mapc_x(map_cx,map_cy))+map_size) & (player_xy(1)+player_width(1) + scry) > ((mapc_y(map_cx,map_cy))) & (player_xy(1) + scry) < (mapc_y(map_cx,map_cy)+map_size) { ;地形の左から接触 if (player_xy(0) +player_width +scrx) > mapc_x(map_cx,map_cy) & (player_xy(0) +player_width +scrx) < ((mapc_x(map_cx,map_cy))+map_size) { color 255 pos 100,20 if mapc_type1(map_cx,map_cy)=1 : player_mflag(0,0)=1:mes player_mflag(0,0) }else { } ;地形の右側から接触 if (player_xy(0) + scrx) < ((mapc_x(map_cx,map_cy))+map_size) & (player_xy(0) + scrx) > mapc_x(map_cx,map_cy){ color 255 pos 0,20 if mapc_type1(map_cx,map_cy)=1 : player_mflag(0,1)=1:mes player_mflag(0,1) } ;地形の上から接触 if (player_xy(1)+player_width(1) + scry) > ((mapc_y(map_cx,map_cy))) & (player_xy(1)+player_width(1) + scry) < (mapc_y(map_cx,map_cy)+map_size) { color 255 pos 50,0 if mapc_type1(map_cx,map_cy)=1 : player_mflag(0,2)=1:mes player_mflag(0,2) } ;地形の下から接触 if (player_xy(1) + scry) < (mapc_y(map_cx,map_cy)+map_size) & (player_xy(1) + scry) > ((mapc_y(map_cx,map_cy))) { color 255 pos 50,50 if mapc_type1(map_cx,map_cy)=1 : player_mflag(0,3)=1:mes player_mflag(0,3) } } next next ;スクロール if player_vel_xy(0)>0 { ;→ if scrx < (mapWidth(0) - window_width(0)) { ;マップのスクロールが右端にいくまで if player_xy(0) < (window_width(0) - margin-player_width(0)/2) { ;自機のX座標がスクリーンサイズX - スクロールマージンに達するとスクロール player_xy(0) += player_vel_xy(0) scrx_f=0 }else { ;自機のX座標がスクロール地点まできたら時機は動かさずにスクロールのみする scrx += 5 scrx_f=1 } }else : if player_xy(0)<(window_width(0)) { ;マップのスクロールが右端にきたら画面端に自機がいくまで player_xy(0)+= player_vel_xy(0) scrx_f=0 } } if player_vel_xy(0)<0 { ;← if scrx>0{ ;マップの左端にいくまで if player_xy(0) > (margin(0)-player_width(0)/2) { ;自機のX座標がスクリーンサイズX - スクロールマージンに達するとスクロール player_xy(0) += player_vel_xy(0) }else { ;自機のX座標がスクロール地点まできたら時機は動かさずにスクロールのみする scrx -= 5 } } else : if player_xy(0) > 0 { ;マップのスクロールが左端にきたら画面端に自機がいくまで player_xy(0) += player_vel_xy(0) } } if player_vel_xy(1)<0 { ;↑ if scry>0{ ;マップの上端にいくまで if player_xy(1) > (margin(0)-player_width(1)/2) { ;自機のX座標がスクリーンサイズX - スクロールマージンに達するとスクロール player_xy(1) += player_vel_xy(1) scry_f=0 }else { ;自機のX座標がスクロール地点まできたら時機は動かさずにスクロールのみする scry -= 5 scry_f=1 } } else : if player_xy(1) > 0 { ;マップのスクロールが上端にきたら画面端に自機がいくまで player_xy(1) += player_vel_xy(1) scry_f=0:color 255,255,255:pos 0,220: } } if player_vel_xy(1)>0 & player_mflag(0,2)=0{ ;↓ if scry < (mapWidth(1) - window_width(1)) { ;マップのスクロールが下端にいくまで if player_xy(1) < (window_width(1) - margin(1)-player_width(1)/2) { ;自機のX座標がスクリーンサイズY - スクロールマージンに達するとスクロール player_xy(1) += player_vel_xy(1) scry_f=0 }else { ;自機のX座標がスクロール地点まできたら時機は動かさずにスクロールのみする scry += 2 :color 255:pos 0,200: scry_f=1 } }else : if player_xy(1)<(window_width(1)) { ;マップのスクロールが下端にきたら画面端に自機がいくまで player_xy(1)+= player_vel_xy(1) scry_f=0 } } redraw 1 await 20 loop #deffunc screen_out int s_out1a, int s_out1b, int s_out2a, int s_out2b if player_xy(0) < 0+s_out1a : player_xy(0)=double(s_out1b) ;画面左 if player_xy(0) > window_width(0)-player_width(0) : player_xy(0)=window_width(0)-player_width(0) ;画面右 if player_xy(1) < 0+s_out2a : player_xy(1)=double(s_out2b) ;画面上 if player_xy(1) > window_width(1)-player_width(1) : player_xy(1)=window_width(1)-player_width(1) ;画面下 return



この記事に返信する


こんとん

リンク

2015/2/27(Fri) 16:28:56|NO.67563

すいません。過去のスレの記事を拝見して自己解決致しました。



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