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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1015
Spider横スクロールアクション改善しました・・・6解決


Spider

リンク

2011/10/15(Sat) 06:03:47|NO.42390

buffer 2
color : boxf 32 , 0 , 63 , 31 color 200 , 0 , 0 : boxf 64 , 0 , 95 , 31 screen 0 , 640 , 320 sdim map , 5000 sdim mapget , 20 dim ax , 200 dim ay , 200 dim FloorX , 1000 dim FloorY , 1000 notesel map //noteload "maps1.txt" map= " "+"\n" map+=" 000 000 "+"\n" map+=" 00000 "+"\n" map+=" "+"\n" map+=" 00000 00000 "+"\n" map+=" "+"\n" map+=" 00000 00000 "+"\n" map+=" "+"\n" map+=" "+"\n" map+=" M " noteget mapget , 0 /*メインループ*/ *Mainloop gosub *MyPositionSarch repeat redraw 0 if (cnt = 0) : MyX = MyX0 if (cnt = 0) : MyY = MyY0 gosub *MapDraw gosub *MyActivity gosub *HitCeack //仮座標を本座標にする MyX = MyX0 MyY = MyY0 redraw 1 await 16 loop /*マップデータの中から主人公の位置をサーチ*/ *MyPositionSarch x = 0 : y = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) if (buf = 'M'){ MyX0 = x * 32 MyY0 = y * 32 break } x++ if (x = 20) : x = 0 : y++ loop return /*マップの描写*/ *MapDraw color 255 , 255 , 255 boxf x = 0 : y = 0 number = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) //全てのマップチップの座標を取得 ax(cnt) = x * 32 ay(cnt) = y * 32 if (buf = ' '){ gx = 0 gy = 0 } if (buf = '0'){ gx = 1 gy = 0 //普通の床の座標を取得 FloorX(number) = ax(cnt) FloorY(number) = ay(cnt) number++ } pos x * 32 , y * 32 gcopy 2 , gx * 32 , gy * 32 , 32 , 32 x++ if (x = 20) : x = 0 : y++ loop return /*主人公の活動*/ *MyActivity pos MyX , MyY gcopy 2 , 64 , 0 , 32 , 32 if (land = 1) and (sp < 0) : sp = 0 if (land = 0){ MyY0 = MyY0 - sp sp-- } stick key , 5 if (key & 1) : MyX0 = MyX0 - 7 if (key & 4) : MyX0 = MyX0 + 7 if (MyY0 >= 288) : MyY0 = 288 : land = 1 if (key = 2) or (key = 3) or (key = 6) and (land = 1){ land = 0 sp = 15 } //当たり判定用の座標の変数の作成 MeTop = MyY0 MeLeft = MyX0 MeRight = MyX0 + 31 MeEnd = MyY0 + 31 return /*当たり判定*/ *HitCeack repeat number DotA = 0 DotB = 0 DotC = 0 DotD = 0 //四隅の点の情報を取得 if (MeTop / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotA = 1 if (MeEnd / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotB = 1 if (MeEnd / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotC = 1 if (MeTop / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotD = 1 Dot = DotA + DotB + DotC + DotD land = 0 //落下中に床に衝突 if (DotB = 1) and (DotC = 1){ MyY0 = FloorY(cnt) - 32 sp = 0 } if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){ if (Dot = 1) and ((DotB = 1) or (DotC = 1)){ if (MyY0 - MyY > 0){ if (MeEnd >= FloorY(cnt)){ MyY0 = FloorY(cnt) - 32 sp = 0 } } } } if (DotB = 1) or (DotC = 1) : land = 1 //ジャンプ中に天井に衝突 if (DotA = 1) and (DotD = 1){ MyY0 = FloorY(cnt) + 32 sp = 0 } if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){ if (Dot = 1) and ((DotA = 1) or (DotD = 1)){ if (MyY0 - MyY < 0){ MyY0 = FloorY(cnt) + 32 sp = 0 } } } //左に移動中の壁衝突 if (DotA = 1) and (DotB = 1){ MyX0 = FloorX(cnt) + 32 } if (MeEnd > FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){ if (Dot = 1) and ((DotA = 1) or (DotB = 1)){ if (key & 1){ MyX0 = FloorX(cnt) + 32 } } } //右に移動中の壁衝突 if (DotC = 1) and (DotD = 1){ MyX0 = FloorX(cnt) - 32 } if (MeEnd > FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){ if (Dot = 1) and ((DotC = 1) or (DotD = 1)){ if (key & 4){ MyX0 = FloorX(cnt) - 32 } } } loop return

ORZさんの指摘どうり書かせていただきました。
で、問題は、
当たり判定のところなのですが、

.黒い床ではジャンプできない。
.落下時に黒い床の側面に衝突すると、上に乗る。
.黒い床に着陸するときするとき右を押していれば左に、
  左を押していれば右に升目ピッタリになるように動く。
  (つまり、升目ピッタリなら動かない)

靴蓮△燭屬鷄Α左の当たりは判定が甘いんだと思いますが、
機兇蓮原因がさっぱり分かりません・・・

どうか教えてください!!!



この記事に返信する


Spider

リンク

2011/10/15(Sat) 06:31:44|NO.42391

これじゃあ靴了遒靴茲Δありませんね。
すみません、訂正です。


buffer 2
color : boxf 32 , 0 , 63 , 31 color 200 , 0 , 0 : boxf 64 , 0 , 95 , 31 screen 0 , 640 , 320 sdim map , 5000 sdim mapget , 20 dim ax , 200 dim ay , 200 dim FloorX , 1000 dim FloorY , 1000 notesel map //noteload "maps1.txt" map= " "+"\n" map+=" 000 000 "+"\n" map+=" 00000 "+"\n" map+=" "+"\n" map+=" 00000 00000 "+"\n" map+=" "+"\n" map+=" 00000 "+"\n" map+=" "+"\n" map+=" "+"\n" map+=" 00000 M 00000 " noteget mapget , 0 /*メインループ*/ *Mainloop gosub *MyPositionSarch repeat redraw 0 if (cnt = 0) : MyX = MyX0 if (cnt = 0) : MyY = MyY0 gosub *MapDraw gosub *MyActivity gosub *HitCeack //仮座標を本座標にする MyX = MyX0 MyY = MyY0 redraw 1 await 16 loop /*マップデータの中から主人公の位置をサーチ*/ *MyPositionSarch x = 0 : y = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) if (buf = 'M'){ MyX0 = x * 32 MyY0 = y * 32 break } x++ if (x = 20) : x = 0 : y++ loop return /*マップの描写*/ *MapDraw color 255 , 255 , 255 boxf x = 0 : y = 0 number = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) //全てのマップチップの座標を取得 ax(cnt) = x * 32 ay(cnt) = y * 32 if (buf = ' '){ gx = 0 gy = 0 } if (buf = '0'){ gx = 1 gy = 0 //普通の床の座標を取得 FloorX(number) = ax(cnt) FloorY(number) = ay(cnt) number++ } pos x * 32 , y * 32 gcopy 2 , gx * 32 , gy * 32 , 32 , 32 x++ if (x = 20) : x = 0 : y++ loop return /*主人公の活動*/ *MyActivity pos MyX , MyY gcopy 2 , 64 , 0 , 32 , 32 if (land = 1) and (sp < 0) : sp = 0 if (land = 0){ MyY0 = MyY0 - sp sp-- } stick key , 5 if (key & 1) : MyX0 = MyX0 - 7 if (key & 4) : MyX0 = MyX0 + 7 if (MyY0 >= 288) : MyY0 = 288 : land = 1 if (key = 2) or (key = 3) or (key = 6) and (land = 1){ land = 0 sp = 15 } //当たり判定用の座標の変数の作成 MeTop = MyY0 MeLeft = MyX0 MeRight = MyX0 + 31 MeEnd = MyY0 + 31 return /*当たり判定*/ *HitCeack repeat number DotA = 0 DotB = 0 DotC = 0 DotD = 0 //四隅の点の情報を取得 if (MeTop / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotA = 1 if (MeEnd / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotB = 1 if (MeEnd / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotC = 1 if (MeTop / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotD = 1 Dot = DotA + DotB + DotC + DotD land = 0 //落下中に床に衝突 if (DotB = 1) and (DotC = 1){ MyY0 = FloorY(cnt) - 32 sp = 0 } if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){ if (Dot = 1) and ((DotB = 1) or (DotC = 1)){ if (MyY0 - MyY > 0){ if (MeEnd >= FloorY(cnt)){ MyY0 = FloorY(cnt) - 32 sp = 0 } } } } if (DotB = 1) or (DotC = 1) : land = 1 //ジャンプ中に天井に衝突 if (DotA = 1) and (DotD = 1){ MyY0 = FloorY(cnt) + 32 sp = 0 } if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){ if (Dot = 1) and ((DotA = 1) or (DotD = 1)){ if (MyY0 - MyY < 0){ MyY0 = FloorY(cnt) + 32 sp = 0 } } } //左に移動中の壁衝突 if (DotA = 1) and (DotB = 1){ MyX0 = FloorX(cnt) + 32 } if (MeEnd > FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){ if (Dot = 1) and ((DotA = 1) or (DotB = 1)){ if (key & 1){ MyX0 = FloorX(cnt) + 32 } } } //右に移動中の壁衝突 if (DotC = 1) and (DotD = 1){ MyX0 = FloorX(cnt) - 32 } if (MeEnd > FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){ if (Dot = 1) and ((DotC = 1) or (DotD = 1)){ if (key & 4){ MyX0 = FloorX(cnt) - 32 } } } loop return



たんす

リンク

2011/10/15(Sat) 09:10:56|NO.42392

まず、変数や条件判断部分にコメントが付いていないので非常に読み解きにくかったです。

>.黒い床ではジャンプできない。
変数landが着地しているかのフラグだと思いますが、
219行目の
if (DotB = 1) or (DotC = 1) : land = 1

ここでしか着地処理がなされておらず、次の”普通の床”を調べたときに194行目で
land = 0
また空中に飛ばされています。



暇人

リンク

2011/10/15(Sat) 22:16:09|NO.42431

>??黒い床ではジャンプできない。

gosub *MyActivity
の下に  mes land を挿入してみれば何故ジャンプできないかは直ぐに分かる
まず変数を常に表示させて思った通りの値なってるか確認が大事


???は同じ理由で現象が出て
斜めから当たった時には縦か横どっちかを優先させる必要がある
落下中に下のブロックに当たり上に戻され
右移動中にブロックに当たり左に戻される
この結果ブロックの角に移動する事になりブロックの区切りに飛び
次の操作で入力方向に移動する事で乗り上げた形になる

これを改善させるのは色々方法はあると思うが
まずありえない事を削って行く
落下中で前回位置が衝突ブロックより低い位置にいたなら上に戻す処理はやらないなど

ジャンプアクションで当たり判定の調整は面倒だから
自分を方向キーで8方向移動できるようにしてチェックした方が
問題が見つけやすい

後、障害物を元に自分の判定するのは何か面倒な気がする・・・



Spider

リンク

2011/10/16(Sun) 08:15:52|NO.42442

たんすさん、暇人さんの
意見のおかげで気解決しました!!!
ありがとうございます!!!



Spider

リンク

2011/10/16(Sun) 08:55:49|NO.42443

暇人さんのおかげで、なんと
兇皺魴茲靴泙靴拭ただただ感謝です。



Spider

リンク

2011/10/16(Sun) 09:56:03|NO.42445

靴皺魴茲任ました。

暇人さんなどの意見で目が覚めたかのように
できるようになりました。(一か月悩んだ価値はあったなあ・・・)

協力してくださった皆様、
本当にありがとうございました!!!!

まだまだいろいろな面で未熟ですので
かなり迷惑をかけたと思います。

下は今の状態です。

buffer 2
color : boxf 32 , 0 , 63 , 31 color 200 , 0 , 0 : boxf 64 , 0 , 95 , 31 screen 0 , 640 , 320 sdim map , 5000 sdim mapget , 20 dim ax , 200 dim ay , 200 dim FloorX , 1000 dim FloorY , 1000 notesel map //noteload "maps1.txt" map= " "+"\n" map+=" 000 000 "+"\n" map+=" 00000 "+"\n" map+=" "+"\n" map+=" 00000 00000 "+"\n" map+=" "+"\n" map+=" 00000 "+"\n" map+=" "+"\n" map+=" "+"\n" map+=" 00000 M 00000 " noteget mapget , 0 /*メインループ*/ *Mainloop gosub *MyPositionSarch repeat redraw 0 if (cnt = 0) : MyX = MyX0 if (cnt = 0) : MyY = MyY0 gosub *MapDraw gosub *MyActivity mes land gosub *HitCeack //仮座標を本座標にする MyX = MyX0 MyY = MyY0 redraw 1 await 16 loop /*マップデータの中から主人公の位置をサーチ*/ *MyPositionSarch x = 0 : y = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) if (buf = 'M'){ MyX0 = x * 32 MyY0 = y * 32 break } x++ if (x = 20) : x = 0 : y++ loop return /*マップの描写*/ *MapDraw color 255 , 255 , 255 boxf x = 0 : y = 0 number = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) //全てのマップチップの座標を取得 ax(cnt) = x * 32 ay(cnt) = y * 32 if (buf = ' '){ gx = 0 gy = 0 } if (buf = '0'){ gx = 1 gy = 0 //普通の床の座標を取得 FloorX(number) = ax(cnt) FloorY(number) = ay(cnt) number++ } pos x * 32 , y * 32 gcopy 2 , gx * 32 , gy * 32 , 32 , 32 x++ if (x = 20) : x = 0 : y++ loop return /*主人公の活動*/ *MyActivity pos MyX , MyY gcopy 2 , 64 , 0 , 32 , 32 if (land = 1) and (sp < 0) : sp = 0 if (land = 0){ MyY0 = MyY0 - sp sp-- } stick key , 5 if (key & 1) : MyX0 = MyX0 - 7 if (key & 4) : MyX0 = MyX0 + 7 if (MyY0 >= 288) : MyY0 = 288 : land = 1 if (key = 2) or (key = 3) or (key = 6) and (land = 1){ land = 0 sp = 15 } //当たり判定用の座標の変数の作成 MeTop = MyY0 MeLeft = MyX0 MeRight = MyX0 + 31 MeEnd = MyY0 + 31 return /*当たり判定*/ *HitCeack repeat number DotA = 0 DotB = 0 DotC = 0 DotD = 0 //四隅の点の情報を取得 if (MeTop / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotA = 1 if (MeEnd / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotB = 1 if (MeEnd / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotC = 1 if (MeTop / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotD = 1 Dot = DotA + DotB + DotC + DotD //land変数クリア if (cnt = 0) : land = 0 //落下中に床に衝突 if (DotB = 1) and (DotC = 1){ MyY0 = FloorY(cnt) - 32 sp = 0 } if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){ if (Dot = 1) and ((DotB = 1) or (DotC = 1)){ if (MyY0 - MyY > 0){ if (MeEnd >= FloorY(cnt)){ if (MyY + 31 < FloorY(cnt)){ MyY0 = FloorY(cnt) - 32 sp = 0 } } } } } //着地してるかどうかの判定 if ((Dot = 0)or((DotB = 1)or(DotC = 1))){ if (MeTop = FloorY(cnt) - 32){ if (MeRight >= FloorX(cnt)){ if (MeLeft <= FloorX(cnt) + 31){ if (key = 2) or (key = 3) or (key = 6) : else : land = 1 } } } } //ジャンプ中に天井に衝突 if (DotA = 1) and (DotD = 1){ MyY0 = FloorY(cnt) + 32 sp = 0 } if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){ if (Dot = 1) and ((DotA = 1) or (DotD = 1)){ if (MyY0 - MyY < 0){ if (MyY > FloorY(cnt) + 31){ MyY0 = FloorY(cnt) + 32 sp = 0 } } } } //左に移動中の壁衝突 if (DotA = 1) and (DotB = 1){ MyX0 = FloorX(cnt) + 32 } if (MeEnd >= FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){ if (Dot = 1) and ((DotA = 1) or (DotB = 1)){ if (MyX > FloorX(cnt) + 31){ MyX0 = FloorX(cnt) + 32 } } } //右に移動中の壁衝突 if (DotC = 1) and (DotD = 1){ MyX0 = FloorX(cnt) - 32 } if (MeEnd >= FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){ if (Dot = 1) and ((DotC = 1) or (DotD = 1)){ if (MyX + 31 < FloorX(cnt)){ MyX0 = FloorX(cnt) - 32 } } } loop return



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