Cocos2D旋转和锚点

时间:2011-06-07 16:25:14

标签: iphone cocos2d-iphone ccsprite

我遇到的问题是,当我改变定位点时,sprite会相对于当前定位点自动旋转。而且我不希望这种情况发生。

我遵循的步骤

  1. 创建一个带锚点(0.5,0.5)的精灵
  2. 将定位点更改为(0,1)
  3. 将精灵旋转到90度。 (使用CCRotateBy。正确旋转精灵)
  4. 将锚点改为(0.5,0.5)(到目前为止,每件事都很好。这是我需要保留的位置)。现在sprite.rotation是90.
  5. 我将锚点更改为(1,0)(Sprite相对于给定的锚点自动旋转到90度 - 我需要停止此行为)
  6. 有没有办法将精灵的旋转重置为0,而不实际旋转纹理(即,保持纹理的当前形式 - 实际纹理旋转到90度)并改变锚点或位置以及步骤4,这样我就能从第5点继续。

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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)的anchorPoint而不是sprite.position = ccp(200, 300),那么您只需要这样做:

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

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

答案 2 :(得分: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);
}

答案 3 :(得分:0)

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

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

    _yourSprite.rotation = 90;

}