横スクロールアクションゲームでの坂道当たり判定バグ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
イマダニ
記事: 145
登録日時: 11年前

横スクロールアクションゲームでの坂道当たり判定バグ

#1

投稿記事 by イマダニ » 9年前

お久しぶりですイマダニです。
今回は坂道の当たり判定についてです。

仕組みは以下の様な感じです。

キャラの足もとに矩形の当たり判定を作って、そこが触れてるマップチップが45度の坂道なら
その坂道の始点と終点から傾きを求める。

それから坂のy座標を出し、それよりキャラの足元(上記の矩形の底辺)が低かったら
上に戻す

というのを作り、まあとりあえず坂を登ることができたのですが、、、、
位置補正の仕方が悪いのか、坂を上ってる間、地震が起きたかのように画面が揺れます。
色々調整してみたのですが、もうわけがわからなくなり混乱してきました、、、、、、
なのでよければ、ソースファイルを下にうpするのでそれをご覧になって色々ダメ出しをしてください。
お願いします。
問題の部分はPlayer.cppの258行目あたりです

http://www1.axfc.net/u/3348513
DL、解凍ぱすわーど共に

『NanameMouIya』

です。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 横スクロールアクションゲームでの坂道当たり判定バグ

#2

投稿記事 by usao » 9年前

ソース見てませんが,

>坂を上ってる間、地震が起きたかのように画面が揺れます。

これが何故起きているのか,をご自身で調査しない理由は何ですか?
>色々調整
というのが実際何をされているのかわかりませんが,まずは
原因=「この方法だと こういう状況下で こうなるから そういった現象が起きてている」という事を
突き止めるべきではないのでしょうか?

・矩形の当たり判定
・それに触れていると判定されたチップ(単一とは限らないかも)
・算出されたy座標(と,そのy座標を計算したx座標も)

といったものを全て可視化するなどして,各時刻にどのようなことが起こっているのかを把握してみてはいかがでしょうか.
オフトピック
>45度の坂道
だとわかるなら,傾きを求める必要は無いような…?

イマダニ
記事: 145
登録日時: 11年前

Re: 横スクロールアクションゲームでの坂道当たり判定バグ

#3

投稿記事 by イマダニ » 9年前

(´;ω;`)


すいません正直甘えてました、、、、

>・矩形の当たり判定
・それに触れていると判定されたチップ(単一とは限らないかも)
・算出されたy座標(と,そのy座標を計算したx座標も)

といったものを全て可視化するなどして,各時刻にどのようなことが起こっているのかを把握してみてはいかがでしょうか.

これら(色々調整)をやって

>これが何故起きているのか,をご自身で調査しない理由は何ですか?

調査し、

なんでかわからずやけくそになり、ここになげだしてしまいました、、、、
申し訳ありません、、、

以後気をつけます

>45度の坂道だとわかるなら,傾きを求める必要は無いような…?

45度は嘘です。書き間違えました。

質問後、調査を続けた結果、原因がわかりました!

下にうpした画像を見てください。
まず画像の水色のプレイヤーの右半分を占めてる緑の矩形があります。
それが赤と緑の坂道のチップに触れてた場合、

坂道の始点のX座標=(緑の矩形の右辺/チップサイズ)*チップサイズ
坂の終点のy座標  =(緑の矩形の底辺/チップサイズ)*チップサイズ

坂道の終点のX座標 = 坂道の始点のX座標 - チップサイズ
坂の始点のy座標  = 坂の終点のy座標 - チップサイズ

上記のようにして坂の始点終点を求め、それから傾きを求め、
さらにその傾きから坂のy座標を求め、それを緑の矩形の底辺が下に超えていたら、位置補正をしていました。
おかげで坂チップに触れてる間は位置補正され、すんなり坂を登るのですが、

どうやら坂チップと坂チップの隙間に入ると、

坂チップに触れてない上に、

緑矩形の右辺がその隙間の奥にある水色平面に当たってしまうようなんです。

結果、隙間に入るごとに水色平面の始点と終点と傾きを求め、それによる位置補正をしてしまうので、

坂の位置補正

平面の位置補正

坂の、、、


の繰り返しになってしまい、地震を起こしながら坂を駆けあがってしまうというわけなんです。

ひとまず以下のように坂の始点と終点の求め方を修正し、一見すんなり坂を上がるようにはなったのですが。

コード:

	/*坂との*/
	//左から上がる坂との当たり判定 ← ここがおかしい
	if(control.StageHitY(Stage::R_SLOPE, HitSDY)==true){
		DrawFormatString( 0, 15*12, GetColor(255,255,255), "さかみちー");
		double sloat_sx = ((HitSDY.right)/CHIP_SIZE) * CHIP_SIZE - 5;//坂の始点のx座標
		double sloat_ey = (HitSDY.bottom/CHIP_SIZE) * CHIP_SIZE - 10;  //坂の終点のy座標

		double sloat_ex = sloat_sx + CHIP_SIZE + 5;//坂の終点のx座標
		double sloat_sy = sloat_ey + CHIP_SIZE;//坂の始点のy座標

		double sloat_slope = (sloat_ey - sloat_sy)/(sloat_ex - sloat_sx);//傾き
		double sloat_y = sloat_sy+(sloat_slope * (HitSDY.right - sloat_sx));//現在地での坂のy座標
		//坂のy座標がどこかを点として描画するための
		sloat_Y = sloat_ey;
		sloat_X = sloat_ex;

		if(sloat_y < HitSDY.bottom){//足下が坂の座標より下なら
			y = sloat_y - 25;//位置補正
			jump=false;
			vy = 0;
		}
	}else{
		jump = true;
	}
やはり隙間の位置補正が少しかかってしまいます。
矩形の右辺による、坂の始点終点の求め方を変えた方がいいのでしょうか?
添付ファイル
saka.jpg


閉鎖

“C言語何でも質問掲示板” へ戻る