2011-05-16 67 views
0

我不擅长数学(我从来没有),我有一个问题:我试图让精灵始终旋转到鼠标光标。这是我有:角度的方向

// mx is mouse X and my is mouse y 
double rotate = (atan2(my, mx) * PI); 

// Set rotation takes rotation in degrees 
ship.SetRotation(rad2deg(rotate)); 

哪里deg2rad功能是:

double rad2deg(double rad) 
{ 
    double deg = 0; 
    deg = rad * (180/M_PI); 
    return deg; 
} 

遗憾的是它不工作。这艘船旋转很怪异(很难定义)。我不知道要解决这个问题。

我正在研究SFML,SetRotation需要度数。

在此先感谢。

+2

你为什么要抛出浮动并分配给双? – 2011-05-16 11:54:10

+2

您确定SetRotation期望程度而不是弧度? – AProgrammer 2011-05-16 11:54:27

+0

哪个框架具有接受度数的setRotation?呸。 MX和我的相对于船的位置?您可能需要手动检查他们的标志,以便在他们都是负面的情况下处理这种情况 - 当他们都返回正面时,您会计算角度。 – Rup 2011-05-16 11:55:12

回答

5

您需要定义相对于某点的旋转。目前,您正在相对于屏幕的角落进行操作,该屏幕只会提供90度,并且可能不是您想要的。您可能需要相对于精灵的位置或相对于屏幕中心的旋转,例如,

// define centre of screen 
const int Y0 = SCREEN_HEIGHT/2; 
const int X0 = SCREEN_WIDTH/2; 

// get rotation angle of mouse location relative to centre of screen 
double rotate = (float) (atan2(Y0 - my), ((mx - X0)); 

[正如其他人已经指出的,例如, @duffymo,你也可能有atan2转置的参数,所以我也做了这个改变。]

+1

很好的答案 - 从我+1。 – duffymo 2011-05-16 11:57:26

2

看起来你有错误的参数顺序atan2。并且您传递给atan2的值应该是鼠标相对于对象的相对位置。所以如果对象位置是ox,oy,那么你应该使用atan2(my-oy, mx-ox)

2

不知你是否有反转的参数atan2。典型的顺序是y,然后是x。你确定你知道你传递给该方法吗?

“不工作”和“怪异”不能帮助我们理解问题所在,因此很难帮助您。