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