靈異伝のお祓いの再現

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

靈異伝のお祓いの再現

#1

投稿記事 by lego hasiri » 3週間前

初投稿です。
現在靈異伝のようなものを作ってます。ボールの挙動、お札飛ばす、自機操作まではできたのですが、
お祓いの仕組みがよくわかりません。自力で実装しても陰陽玉が変な方向に飛んでばかりです。
環境とか:Windows10 ノートPC VS2019 Comunity C++ DXライブラリ(をちょっと使いやすくした自作ライブラリ)
以下が該当部分のソースコードです。

コード:

template <typename T>
struct Vec2<T>{
	T x,y;
}
using Position = Vec2<int>;

struct Balls {
	Texture mTex;//陰陽玉の画像
	Position mPos;//陰陽玉のX,Y座標
	double mAngle;//陰陽玉の動く向き
	Vec2<double> mSpeed, mSpeedFirst;//現在の速度と初速度
	int32 mTime;//飛んでからの経過時間
};

コード:

auto Oharai = [&](){
	double ang = atan(static_cast<double>(-mBall.mPos.y + window.WindowRect.y - PLAYER_SIZE.y / 2.0) / static_cast<double>(mPlayer.mPos - mBall.mPos.x));//ここをどうにかしたい
	mBall.mAngle = 0.5 * PI + ang;
	mBall.mSpeedFirst = { START_BALLSPEED * cos(mBall.mAngle), START_BALLSPEED * sin(mBall.mAngle) };
	if (mBall.mSpeed.x >= 0) {
		mBall.mSpeedFirst.x = -abs(mBall.mSpeedFirst.x);
	}
	else {
		mBall.mSpeedFirst.x = abs(mBall.mSpeedFirst.x);
	}
	mBall.mSpeed = mBall.mSpeedFirst;
};
正直よくわかんなくなってきててめちゃくちゃなことしてる気がします。
ちょっとしたことでもいいので手助けお願いします。
必要なことが抜けてたら追記します。

かずま

Re: 靈異伝のお祓いの再現

#2

投稿記事 by かずま » 3週間前

lego hasiri さんが書きました:
3週間前
自力で実装しても陰陽玉が変な方向に飛んでばかりです。
atan を使うと結果は [-π/2, π/2] の範囲にしかなりません。。
atan2 を使うと結果が [-π, π] になってうまく行くのではありませんか?

コード:

	double ang = atan2(
		static_cast<double>(-mBall.mPos.y + window.WindowRect.y - PLAYER_SIZE.y / 2.0),
		static_cast<double>(mPlayer.mPos - mBall.mPos.x));

lego hasiri
記事: 2
登録日時: 1年前

Re: 靈異伝のお祓いの再現

#3

投稿記事 by lego hasiri » 3週間前

なるほど、atanとatan2はそのような違いが起こるのですね。
たしかに向きはましにはなりました。が、靈異伝のような”引き寄せるほど高く飛ぶ”といった処理が実現できておらず、引き寄せてもほぼ真横に飛んだり、引き寄せなくても高く飛んだりしてしまっています。どこがおかしいのでしょうか...

返信

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