2013-09-28 39 views
0

我有一个精灵,它被添加到CCSpriteBatchNode。然后我修正了精灵的位置,改变了锚点的方式,这样我就可以围绕这个点旋转精灵了。关于anchorPoint转换位置?

层次是精灵< - batchNode < - 现场

基本上精灵移动,但它.position属性没有改变。我需要在转换后得到精灵的真实位置。所以我试图用

CGPoint p = sprite.position; 
p = [sprite convertToWorldSpace:p]; 

但是,位置与我在场景中看到的精灵位置不匹配。

回答

0

Sprite位置是CCSprite中间的一个点(默认情况下)。更改定位点会移动精灵,使得该点相对于精灵移动,但相对于世界空间保持不变。例如,将精灵(例如square)的锚点更改为ccp(0,0)将移动该正方形,以使其左下角顶点将出现在正方形中心点最初的位置。因此,尽管广场可能似乎被“重新定位”,但它的位置(属性)保持不变(不受锚定点变化的影响),除非有明确的改变。

编辑

如果精灵的实际位置,你的意思是它的定位点后的中点已经改变,那么它可以通过考虑到已经应用在其上即两个转换来计算翻译和旋转。

首先,我们采取翻译的护理:

你的精灵移动方式:

CGPoint translation; 
translation.x = sprite.contentSize.width x (0.5 - sprite.anchorPoint.x); 
translation.y = sprite.contentSize.height x (0.5 - sprite.anchorPoint.y);  

现在我们适应了变化旋转

转换 “翻译” 点为极坐标我们得到

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0/M_PI)) 
r = ccpDistance(translation,ccp(0,0)); 
ø = RADIANS_TO_DEGREES(atan2(translation.x,translation.y)); //i take x/y here as i want the CW angle from y axis. 

如果你旋转你的精灵用“d”度:

ø = ø + D; 
CGPoint transPositionAfterRotation = ccp(r * cos(ø),r * sin(ø)); 

CGPoint realPosition = ccp(sprite.position.x + transPositionAfterRotation.x, sprite.position.y +transPositionAfterRotation.y) 
+0

这并不真正发挥作用。它不考虑轮换(在我的问题中提到),这也影响到位置。在我的情况下,锚点不是中点,而是远离精灵。 – Pablo

+0

你是什么意思的精灵的“真实位置”? –

+0

我是指应用旋转后的位置。 – Pablo