Cocos2D旋转和锚点
问题描述:
我的问题是,当我改变锚点精灵自动旋转相对于当前的锚点。我不希望这种情况发生。Cocos2D旋转和锚点
我随后
- 创建锚点精灵的步骤(0.5,0.5)
- 改变了锚定点(0,1)
- 旋转的精灵90度。 (使用CCRotateBy.Sprite正确旋转)
- 将锚点更改为(0.5,0.5)(每件事情都很好,直到现在,这是我需要保留的位置)。现在sprite.rotation是90
- 我改变了锚点(1,0)(雪碧自动旋转到90度相对于给定的固定点 - 我必须停止这种行为)
是有任何方法可以将精灵的旋转重置为0,而不实际旋转纹理(即,将纹理保持为其当前形式 - 实际纹理旋转至90度),并随步骤4一起更改锚点或位置,以便我可以从第5点开始继续。
答
正如Lukman所说,锚点始终会影响旋转,因为您的目标是能够使用旋转中的不同锚点指定精灵位置,所以我建议将空CCNode作为精灵的父级。
通过这种方式,您可以将sprite上的位置设置为相对于此父节点,以补偿您的锚点更改,然后在sprite上保留用于旋转的锚点,但使用父节点作为位置。
答
anchorPoint
同时影响到position
和rotation
。你无法阻止它影响其中一个。
但是从阅读您的问题,因为要防止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;
}
你可以张贴一些代码... – Anish 2011-06-08 08:15:31