Cocos2D Вращение и точка привязки

Проблема, что у меня есть, что когда-либо изменить точку спрайта якорной автоматически поворачивается относительно текущей точки привязки. И я не хочу, чтобы это произошло.

Шаги, которые я выполнил

  • создать спрайт с опорной точкой (0,5, 0,5)
  • Изменена опорная точка (0,1)
  • Вращение спрайта до 90 градусов. (Использование CCRotateBy. Sprite повернуто правильно)
  • Изменена точка привязки (0,5, 0,5) (до сих пор все хорошо. И это положение, которое мне нужно сохранить). Теперь sprite.rotation - 90.
  • Я изменил опорную точку на (1,0) (Sprite автоматически поворачивается на 90 градусов по отношению к данной точке привязки - мне нужно остановить это поведение)

Есть ли способ reset вращение спрайтов 0, фактически не поворачивая текстуры (то есть, чтобы сохранить текстуру в ее нынешнем виде. - фактическая структура поворачивается на 90 градусов) и меняя опорную точку или позицию по с шагом 4, так что я могу продолжить с точки 5.

Ответ 1

Как говорит Лукман, точка привязки всегда будет влиять на вращение, так как ваша цель состоит в том, чтобы быть в состоянии определить положение спрайта с другой точкой привязки из поворота я бы предложил сделать пустой CCNode как родитель вашего спрайта.

Таким образом, вы можете установить положение спрайта относительно этого родительского node, чтобы компенсировать изменение точки привязки, а затем сохранить опорную точку для вращения в спрайте, но используйте родительский node для позиции.

Ответ 2

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 of (1,0) при выполнении позиционирования вместо sprite.position = ccp(200, 300), вам просто нужно сделать:

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

Если вы захотите, я пошлю логику позади математики позже. В противном случае я надеюсь, что это поможет.

Ответ 3

Возможно, это поможет вам установить якорь для спрайтов в правильной координате.

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

Ответ 4

Вы можете добавить строку в метод touchEnded в качестве сильной альтернативы:

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

    _yourSprite.rotation = 90;

}