2011-07-04 7 views
1

マウスのX、Yの位置をプレーヤーの位置から16の方向のうちの1つに変換する最良の式が何であるか質問したいと思います。マウスの位置を方向に戻して戻す

私はC++、sfml 1.6で作業するので、簡単にすべての位置を取得できますが、プレーヤーの位置などから角度に基づいて変換する方法はわかりません。 (私は数学では決して良かったのではなく、4つ以上の方向についてifのステートメントが複雑すぎるように見えます)。 「最も簡単な」方法は、共同のあなたの二組に変換することです

player.Move(deltaX * speed * GetElapsedTime(), ...Y); 

答えて

0

はまた、私は、Yは、そう、彼はのような何かを行うことができますデルタXに方向をバックに変換、それをサーバに送信します(現在のプレイヤー位置のもの、現在のマウス位置のもの)をプレイヤーの位置に対する角度に変換します。角度0はプレイヤーの直前の線です(またはゲームの仕方によっては北)。その後、あなたの16の方向のそれぞれは、与えられた22.5度の間隔に変換されます。

しかし、あなたが数学では悪いと言っていたので、あなたはそれより具体的なものを探していると思います。

0

あなたは、マウスの位置と正のX軸との間の角度を取得するためにatan2を使用することができます。std::atan2()によって返さ

#include <cmath> 

float player_x = ...; 
float player_y = ...; 
float mouse_x = ...; 
float mouse_y = ...; 

float angle = std::atan2(mouse_y - player_y, mouse_x - player_x); 

angleは(排他的)-M_PIM_PI(包括的)の間の値である:

-M_PI   Left (-180°) 
-0.5 * M_PI  Down (-90°) 
0    Right (0°) 
0.5 * M_PI  Up (90°) 
M_PI   Left (180°) 

「16方向のうちの1つ」にマッピングする方法に応じて、この値を変換することができます。つまり、離散方向に割り当てる値ction。角度を考えると

は、X/Yデルタを表す単位ベクトルは、あまりにも、非常に簡単です取得:

float dx = std::cos(angle); 
float dy = std::sin(angle); 
+0

おかげで、かなり速い:) – Reiv

+0

私は、この関数は、純粋な魔法である誓うの作品ここに返信します。 – Lalaland

関連する問題