Cocos2D旋转和锚点

9
我遇到的问题是,每当我改变锚点时,精灵会自动围绕当前锚点旋转。而我不希望发生这种情况。
我采取的步骤如下:
1. 使用锚点(0.5, 0.5)创建一个精灵。 2. 将锚点更改为(0,1)。 3. 将精灵旋转90度。(使用CCRotateBy。精灵正确旋转) 4. 将锚点更改为(0.5, 0.5)。(目前为止一切正常。这是我需要保持的位置)。现在sprite.rotation为90。 5. 我将锚点更改为(1,0)。(精灵会自动围绕给定的锚点旋转90度——我需要停止这种行为)
是否有任何方法可以将精灵的旋转重置为0,而不实际旋转纹理(即,保持纹理处于其当前形式——实际纹理旋转了90度),并且可以在步骤4中更改锚点或位置,以便我可以从第5步继续进行?
4个回答

8

正如Lukman所说,锚点始终会影响旋转,因为您的目标是能够使用不同的锚点指定精灵位置,我建议将一个空的CCNode作为精灵的父节点。

这样,您可以将精灵的位置设置为相对于此父节点来补偿锚点的更改,然后保持精灵的锚点进行旋转,但在位置上使用父节点。


5
anchorPoint影响positionrotation。您无法阻止它影响其中任何一个。
但是从您的问题中可以看出,既然您想要防止anchorPoint影响旋转,我假设您更改anchorPoint的原因是为了更改位置,例如,您将其设置为ccp(1,0),因为您希望精灵的右下角而不是中心点在您设置的位置。
我的建议是:根本不要更改anchorPoint,而是更改设置精灵位置的方式。您可以使用此小函数调整位置:
CGPoint adjustedPosition(const CGPoint position, const CGPoint anchor, const CGSize size) {
    return CGPointMake(position.x - (anchor.x - 0.5) * size.width, position.y - (anchor.y - 0.5) * size.height);
}

假设你想在定位时使用锚点(1,0),而不是sprite.position = ccp(200, 300),那么你只需要这样做:

sprite.position = adjustedPosition(ccp(200, 300), ccp(1.0, 0.0), sprite.contentSize);

如果您愿意,我稍后可以发布数学背后的逻辑。否则,我希望这可以帮助到您。

1

或许这可以帮助您在正确的坐标中安装精灵的锚点。

void SetAnchorPosition(CCSprite * sprite, const CCPoint & point)
{
    static CCSize winSize = CCDirector::sharedDirector()->getWinSize();
double x = ((double)1/(double)winSize.width)*(double)point.x; double y = ((double)1/(double)winSize.height)*(double)point.y;
sprite->setAnchorPoint(ccp(x,y)); sprite->setPosition(point); }

0

你可以在touchEnded方法中添加一行代码作为强制性的替代方案:

-(void)touchEnded:(UITouch *)touch withEvent:(UIEvent *)event{

    _yourSprite.rotation = 90;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接