動きが変になる と 接触判定がおかしい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
LisetteLander
記事: 147
登録日時: 13年前
住所: 東京

動きが変になる と 接触判定がおかしい

#1

投稿記事 by LisetteLander » 11年前

作っていたゲームがよくわからない挙動になったので質問させていただきます。

・動きが変
マウスポインタの方向に常にキャラクターが向いている状態で、キャラクターから見て前後左右の方向WASDで動くように作ったのですが動画のようになってしまいます。
期待値は、「マウスポインタを中心に回り続ける」、「マウスポインタから離れる・近づく」です。

・接触判定がおかしい
接触判定に円同士の距離判定を使用しているのですが、半径が低い時には問題がなかったのですが半径が大きくなると逆にとれなくなりました。
動画では丸い青い円が接触判定です。
武器の設定範囲を20、兵士の取得範囲を20した時に取得できなくなりました。


[youtube][/youtube]

定数です。

コード:

const double FRONT =0;
const double BACK =PI;
const double LEFT =PI/2;
const double RIGHT =-PI/2;
const double FRONTLEFT =PI/4;
const double FRONTRIGHT =-PI/4;
const double BACKLEFT =PI*3/4;
const double BACKRIGHT =-PI*3/4;
引数(Direction)には定数を入力します。
Soldier.Move(FRONT);

コード:


void CSoldier::Move(double Direction){
	PosX+=cos(Angle+Direction)*WalkSpeed;
	PosY-=sin(Angle+Direction)*WalkSpeed;

	Body->SetPosX(PosX);
	Body->SetPosY(PosY);

	if(ContactList->ContactCheck(Body)){//接触チェック
		//なにかにあたってたらやめる
		PosX-=cos(Angle+Direction)*WalkSpeed;
		PosY+=sin(Angle+Direction)*WalkSpeed;

		Body->SetPosX(PosX);
		Body->SetPosY(PosY);
	}
}

そして、円同士の接触判定方法です。
動画内では兵士と武器のそれぞれがもつCCircleインスタンスを引数に渡し、結果をブーリアンで返します。
ブレークポイントで追いかけたのですが、値の変更は確認できませんでした。

コード:

bool CContactList::JudgeCircleCircle(CCircle* tmpCircle1,CCircle* tmpCircle2){
	return (tmpCircle1->GetPosX()-tmpCircle2->GetPosX())*(tmpCircle1->GetPosX()-tmpCircle2->GetPosX()) + 
			(tmpCircle1->GetPosY()-tmpCircle2->GetPosY())*(tmpCircle1->GetPosY()-tmpCircle2->GetPosY()) <= 
			(tmpCircle1->GetRadius()-tmpCircle2->GetRadius())*(tmpCircle1->GetRadius()-tmpCircle2->GetRadius());
}
次の動画は、武器の設定範囲を5、兵士の取得範囲を10にした時の動画です。
取得範囲を狭くするとなぜか取得できるようになります。
[youtube][/youtube]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 動きが変になる と 接触判定がおかしい

#2

投稿記事 by softya(ソフト屋) » 11年前

状態を再現できるシンプルなコードを張っていただくのが一番かと思います。
※ シンプルなコードを作っている時に問題の原因が分かることも多々あります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 動きが変になる と 接触判定がおかしい

#3

投稿記事 by Tatu » 11年前

動きと接触判定についてそれぞれ図を書き、考え直してはどうでしょう。

動きについて
定数の角度について左右と角度の変化があっていますか?
(角度は時計回りと反時計回りのどちらが正の方向ですか?)

移動するときにy座標を引いているのはなぜですか?

接触判定について
投稿されたコードだと武器と兵士の取得範囲が同じだととれないというようになっている気がします。
各円の座標と半径の関係についてもう一度考えてみてください。特に半径。

動画についてどのキーを押しているのかがわかるようにした方がよいと思います。

アバター
LisetteLander
記事: 147
登録日時: 13年前
住所: 東京

Re: 動きが変になる と 接触判定がおかしい

#4

投稿記事 by LisetteLander » 11年前

動画についてどのキーを押しているのかがわかるようにした方がよいと思います。
Tatu さんが書きました: 動きについて
定数の角度について左右と角度の変化があっていますか?
(角度は時計回りと反時計回りのどちらが正の方向ですか?)
角度を表示してみた結果、自分が想定していた正負が逆でした。。すいません。
softya(ソフト屋) さんが書きました:
状態を再現できるシンプルなコードを張っていただくのが一番かと思います。
※ シンプルなコードを作っている時に問題の原因が分かることも多々あります。
Tatu さんが書きました: 接触判定について
投稿されたコードだと武器と兵士の取得範囲が同じだととれないというようになっている気がします。
各円の座標と半径の関係についてもう一度考えてみてください。特に半径。
作りなおしたコードと比較したら加算しなければいけないところを減算してました。コピペして手を加えなかったのかも・・
Tatu さんが書きました: 動画についてどのキーを押しているのかがわかるようにした方がよいと思います。
以後質問するときはわかりやすくしたいと思います、すいません。

Tatu さんが書きました: 移動するときにy座標を引いているのはなぜですか?
数学のY座標の正方向とPCの画面上のY座標の正方向が違うということでY座標を引いていました。
つまり、キャラクターが画面上に進もうとする(+10)なら数学関数からもらった情報を反転(-10px)して「上に移動した」と表現するのかと・・・
スクロールや、カメラを使ったりするゲームでは両方共加算していいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 動きが変になる と 接触判定がおかしい

#5

投稿記事 by softya(ソフト屋) » 11年前

数学の座標系と逆とか考えるとややこしくなるので素直に受け入れて下さい。
下方向が+です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 動きが変になる と 接触判定がおかしい

#6

投稿記事 by Tatu » 11年前

今回の角度のような正負が逆になるというミスがでないように
PC上の画面の方向と計算の方向は合わせたほうがよいでしょう。

兵士は思い通りに動くようになりましたか?

>スクロールや、カメラを使ったりするゲームでは両方共加算していいのでしょうか?

キャラクターとカメラの両方が右側に移動するならば両方ともx座標は増加します。

描画位置について
兵士の座標を(Soldier.x,Soldier.y)とし、
カメラの座標を(Camera.x,Camera.y)とした場合、
兵士の画像は画面のどこに描画すればよいと思いますか?

アバター
LisetteLander
記事: 147
登録日時: 13年前
住所: 東京

Re: 動きが変になる と 接触判定がおかしい

#7

投稿記事 by LisetteLander » 11年前

>数学の座標系と逆とか考えるとややこしくなるので素直に受け入れて下さい。
>下方向が+です。
そうします。。

>兵士は思い通りに動くようになりましたか?
動くようになりました!


>兵士の画像は画面のどこに描画すればよいと思いますか?
Soldier.x-Camera.x,Soldier.y-Camera.y
でしょうか?

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 動きが変になる と 接触判定がおかしい

#8

投稿記事 by Tatu » 11年前

兵士の動きについては解決。
兵士の画像の位置についての質問の答えを見ると
スクロールやカメラの考え方はわかっているようですね。

これで問題がないようなら解決にしてください。

アバター
LisetteLander
記事: 147
登録日時: 13年前
住所: 東京

Re: 動きが変になる と 接触判定がおかしい

#9

投稿記事 by LisetteLander » 11年前

tatuさん、ソフト屋さん、ありがとうございました!

閉鎖

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