靈異伝のお祓いの再現

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

靈異伝のお祓いの再現

#1

投稿記事 by lego hasiri » 5年前

初投稿です。
現在靈異伝のようなものを作ってます。ボールの挙動、お札飛ばす、自機操作まではできたのですが、
お祓いの仕組みがよくわかりません。自力で実装しても陰陽玉が変な方向に飛んでばかりです。
環境とか: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 かずま » 5年前

lego hasiri さんが書きました:
5年前
自力で実装しても陰陽玉が変な方向に飛んでばかりです。
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
記事: 7
登録日時: 7年前
連絡を取る:

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

#3

投稿記事 by lego hasiri » 5年前

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

返信

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