【问题标题】:Converting position with regarding anchorPoint?用锚点转换位置?
【发布时间】:2013-09-28 10:08:08
【问题描述】:

我有一个精灵,它被添加到CCSpriteBatchNode。然后我固定精灵的位置,改变锚点的方式,这样我就可以围绕该点旋转精灵。

层次结构是sprite

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

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

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

【问题讨论】:

    标签: ios cocos2d-iphone kobold2d


    【解决方案1】:

    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)
    

    【讨论】:

    • 这真的行不通。它不考虑旋转(在我的问题中提到),这也会影响位置。在我的例子中,锚点不是中间点,而是远离精灵。
    • 精灵的“真实位置”是什么意思?
    • 我的意思是应用旋转后的位置。
    • 位置,基于锚点、位置和应用的旋转。
    • 1. rcos/rsin? 2. atan2 有 2 个参数 3. 我认为 cocos2D 所有这些计算都是免费的,但不确定要使用哪个转换函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多