9

我遇到的问题是,当我更改锚点精灵时,它会自动相对于当前锚点旋转。我不希望这种情况发生。

我遵循的步骤

  1. 创建一个带有锚点的精灵 (0.5, 0.5)
  2. 将锚点更改为 (0,1)
  3. 将精灵旋转到 90 度。(使用 CCRotateBy。精灵旋转正确)
  4. 将锚点更改为 (0.5, 0.5) (到目前为止一切都很好。这是我需要保持的位置)。现在 sprite.rotation 是 90。
  5. 我将锚点更改为 (1,0) (Sprite 自动相对于给定的锚点旋转 90 度 - 我需要停止这种行为)

有没有办法将精灵的旋转重置为 0,而无需实际旋转纹理(即,将纹理保持在当前形式 - 实际纹理旋转到 90 度)并与步骤 4 一起更改锚点或位置,所以我可以从第 5 点继续。

4

4 回答 4

8

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

这样,您可以将 sprite 上的位置设置为相对于该父节点以补偿您的锚点变化,然后将锚点保留在 sprite 上进行旋转,但使用父节点作为位置。

于 2011-06-09T16:09:48.840 回答
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);

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

于 2011-06-08T16:25:03.090 回答
1

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

void SetAnchorPosition(CCSprite * sprite, const CCPoint & point)
{
    静态 CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    双 x = ((双)1/(双)winSize.width)*(双)point.x;
    双 y = ((double)1/(double)winSize.height)*(double)point.y;

    sprite->setAnchorPoint(ccp(x,y));
    sprite->setPosition(点);
}
于 2012-07-11T08:13:00.943 回答
0

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

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

    _yourSprite.rotation = 90;

}
于 2014-05-28T18:39:46.823 回答