转换位置与关于anchorPoint?

时间:2013-09-28 10:08:09

标签: ios cocos2d-iphone kobold2d

我有一个精灵,已添加到CCSpriteBatchNode。然后我修复精灵的位置,改变锚点的方式,以便我可以围绕该点旋转精灵。

层次结构是精灵< - batchNode< - scene

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

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

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

1 个答案:

答案 0 :(得分:0)

Sprite位置是CCSprite中间的一个点(默认情况下)。更改锚点会移动精灵,使点相对于精灵移动,但相对于世界空间保持相同。例如,将精灵(例如正方形)的锚点更改为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)