我遇到的问题是,当我改变定位点时,sprite会相对于当前定位点自动旋转。而且我不希望这种情况发生。
我遵循的步骤
有没有办法将精灵的旋转重置为0,而不实际旋转纹理(即,保持纹理的当前形式 - 实际纹理旋转到90度)并改变锚点或位置以及步骤4,这样我就能从第5点继续。
答案 0 :(得分:9)
正如Lukman所说,锚点将始终影响旋转,因为你的目标是能够使用与旋转不同的锚点来指定精灵位置,我建议将空CCNode作为精灵的父级。
这样,您可以将精灵上的位置设置为相对于此父节点,以补偿您的锚点变化,然后保持锚点在精灵上旋转,但使用父节点作为位置。
答案 1 :(得分:5)
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);
}
现在,假设您在进行定位时想要使用(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;
}