Cocos2D旋转和锚点

问题描述:

我的问题是,当我改变锚点精灵自动旋转相对于当前的锚点。我不希望这种情况发生。Cocos2D旋转和锚点

我随后

  1. 创建锚点精灵的步骤(0.5,0.5)
  2. 改变了锚定点(0,1)
  3. 旋转的精灵90度。 (使用CCRotateBy.Sprite正确旋转)
  4. 将锚点更改为(0.5,0.5)(每件事情都很好,直到现在,这是我需要保留的位置)。现在sprite.rotation是90
  5. 我改变了锚点(1,0)(雪碧自动旋转到90度相对于给定的固定点 - 我必须停止这种行为)

是有任何方法可以将精灵的旋转重置为0,而不实际旋转纹理(即,将纹理保持为其当前形式 - 实际纹理旋转至90度),并随步骤4一起更改锚点或位置,以便我可以从第5点开始继续。

+0

你可以张贴一些代码... – Anish 2011-06-08 08:15:31

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

通过这种方式,您可以将sprite上的位置设置为相对于此父节点,以补偿您的锚点更改,然后在sprite上保留用于旋转的锚点,但使用父节点作为位置。

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); 
} 

现在,假设你想使用的anchorPoint(1,0)在做定位的时候,而不是sprite.position = ccp(200, 300),你只需要做:

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

如果你愿意,我会在稍后发表数学逻辑。否则,我希望这会有所帮助。

也许它会帮助你在正确的坐标中安装精灵的锚点。

 
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); 
} 

您可以在touchEnded方法中添加一条线作为一个强有力的替代方案:

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

    _yourSprite.rotation = 90; 

}