Cocos2D Вращение и Якорная точка - PullRequest
10 голосов
/ 07 июня 2011

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 09 июня 2011

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

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

5 голосов
/ 08 июня 2011

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

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

1 голос
/ 11 июля 2012

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

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);
}
0 голосов
/ 28 мая 2014

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

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

    _yourSprite.rotation = 90;

}
...