ゲーム制作に便利な自作関数を公開その1

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

ゲーム制作に便利な自作関数を公開その1

投稿記事 by MoNoQLoREATOR » 14年前

タイトル通り、ゲーム制作に便利な(と私は思う)自作関数を公開します。

今回の関数は、目的地まで直線距離で1ピクセル移動したい場合x,y方向にそれぞれ何ピクセルずつ移動すればよいか求めてくれる関数です。

なにが便利かと言うと、どの方向に移動するときも、移動速度を一定に保てる点です。
特に、PC用コントローラーのアナログスティックを使うときに便利です。
普通、斜めに移動する時、異常に速く移動してしまいますよね。あれを解決することができます。
さらに、アナログスティックを用いた場合でも、かなり正確に移動させることができるようになります。

以下ソースコード

CODE:

#include 

struct AppData{
	int destinX, destinY;	//目的地の座標を格納
	int locatX, locatY;	//現在地の座標を格納
	double disX, disY;	//結果移動量を格納
};

int MonoApp(AppData &a){
	if(a.destinX!=a.locatX && a.destinY!=a.locatY){
	//目的地までの距離を絶対値で得る
		int fabDestX = fabs(a.destinX - a.locatX);
		int fabDestY = fabs(a.destinY - a.locatY);
	
		//直線距離を求める
			int addSide = fabDestX*fabDestX + fabDestY*fabDestY;
			double obli = sqrt(addSide);
		
		//x,y移動量をそれぞれ絶対値で求める
			a.disX = fabDestX / obli;
			a.disY = fabDestY / obli;
		
		//x,y移動量をそれぞれ符号有りで求める
			if(a.destinX < a.locatX) a.disX *= -1;
			if(a.destinY < a.locatY) a.disY *= -1;
		
		return 1;
	}
	
	//現在地と目的地が同じだった場合
	a.disX = 0, a.disY = 0;
	return 0;
}
※「参照渡し」というC++のルールを使っています

アバター
a5ua
記事: 199
登録日時: 14年前

RE: ゲーム制作に便利な自作関数を公開その1

投稿記事 by a5ua » 14年前

気になった部分が2点ほど
・1行目のincludeは、またはではないですか?
・10行目の条件では、現在地(10, 10) → 目的地(10, 20)のような場合に、移動量がゼロになってしまうのでは?

また、参考までに私なりの実装を書いてみました。
► スポイラーを表示

アバター
MNS
記事: 35
登録日時: 14年前

Re: ゲーム制作に便利な自作関数を公開その1

投稿記事 by MNS » 14年前

ベクトルを使えばぐっと楽になると思います。
知らない場合でも、割かし単純な概念なので知っておいて損はありませんよ~

この場合、自分の位置から目的地へのベクトルを求めます。
長さが1のベクトルを単位ベクトルといいますが、さきのベクトルを単位ベクトルに変える
(その作業を正規化といいます)ことで、長さ1のベクトルで、目的地へ向かうものを求められます。
私が言ったことはa5uaさんの実装のまさにそれです。(つまり、絶対値云々を求める必要はありません)

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: ゲーム制作に便利な自作関数を公開その1

投稿記事 by MoNoQLoREATOR » 14年前

>>a5uaさん

本当ですね。条件がまちがっています。
の方は・・・。C++では.hはつけない決まりだと聞いていたのですが、調べてみたら、かと書くようですね。コンパイルエラーは出なかったのですが。

もともと関数ではなかった物を急遽関数化したのでミスが出てしまいました。

う~む、たしかにa5uaさんのソースコードが一番効率が良いですね。私もまだまだのようです。