2013-05-13 4 views
0

Позвольте мне начать с объяснения того, что я пытаюсь сделать. У меня полноэкранная анимация с примерно 73 кадрами и с такими большими изображениями я не могу использовать спрайт-листы, поэтому я просто добавляю их в анимацию как отдельные spriteframes. Моя цель состоит в том, чтобы воспроизвести анимацию, а затем исчезнуть слева направо. Способ, которым я достигаю этого взгляда, заключается в обновлении ширины (textureRect) кадров и, в конечном итоге, создании ширины textureRect 0. Поэтому я настроил CCSprite, над которым я буду запускать анимацию.CCSprite anchorPoint работает не так, как ожидалось?

-(id) init { 

    if((self=[super init])) { 

     self.transSprite = [CCSprite spriteWithFile:@"transition0.pvr.ccz"]; 

     if (CC_CONTENT_SCALE_FACTOR() == 1) { 

      //iPhone 3Gs 

      self.transSprite.scaleX = .563; 
      self.transSprite.scaleY = .665; 

      self.transSprite.position = ccp(self.transSprite.contentSize.height - 3, -1); 
      self.transSprite.anchorPoint = ccp(1, 0); 
      [self addChild:self.transSprite z:5]; 

     } 

     else if (kiPhone5) { 

      //iPhone 5 

      self.transSprite.scale = self.transSprite.scale * 1.335f; 

      self.transSprite.position = ccp(569, -1); 
      self.transSprite.anchorPoint = ccp(1, 0); 
      [self addChild:self.transSprite z:5]; 

     } 

     else { 

      //iPhone 4 

      self.transSprite.scaleX = 1.126; 
      self.transSprite.scaleY = 1.33; 

      self.transSprite.position = ccp(481, -1); 
      self.transSprite.anchorPoint = ccp(1, 0); 
      [self addChild:self.transSprite z:5]; 

     } 

    } 

    return self; 
} 

Так что причина для проверки того, что устройство работает, потому что я не сделал 2 версии анимации кадров HD и SD. Вместо этого я просто сделал их хорошим между размерами, а затем я проверяю, какое устройство работает, и соответственно масштабируйте спрайт. Итак, вот моя проблема. Я устанавливаю привязку Sprites в нижнем правом углу экрана, чтобы при изменении ширины текстуры она уменьшалась в размере слева направо. Кажется, что все отлично работает с этой идеей, кроме тех случаев, когда я изменяю ширину текстуры каждого кадра спрайта.

- (void) rectUpdate3Gs { 

    for (CCAnimationFrame *frame in transition.frames) { 
     frame.spriteFrame.rect = CGRectMake(0, 0, 856, 484); 
    } 

} 

- (void) retinaRectUpdate { 

    for (CCAnimationFrame *frame in transition.frames) { 
     frame.spriteFrame. rect = CGRectMake(0, 0, 428, 242); 

    } 

} 

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

Вот иллюстрация того, что происходит. Это CCSprite, настроенный для полной текстуры и с помощью anchorPoint в нижнем правом углу. enter image description here

self.transSprite.scaleX = .563; 
    self.transSprite.scaleY = .665; 

    self.transSprite.position = ccp(self.transSprite.contentSize.height - 3, -1); 
    [self addChild:self.transSprite z:5]; 
    [self.transSprite setTextureRect:CGRectMake(0, 0, 856, 484)]; 
    self.transSprite.anchorPoint = ccp(1, 0); 

Теперь это установка textureRect в CCSprite немного меньше.

enter image description here

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

enter image description here

Я в недоумении, почему это происходит. Есть кадры анимации не уважать точку привязки CCSprite они работают на?

+0

«Я просто сделал их хорошим между размером» <- это означает, что вы тратите память и производительность на устройствах SD , и заставить вещи выглядеть размытыми на устройствах Retina и неодобрение рисков со стороны Apple (активы Retina теперь являются обязательными для устройств Retina!). Пересмотрите этот подход. Независимо от того, чтобы лучше понять, скриншоты проблемы были бы очень полезными. – LearnCocos2D

+0

Есть ли где-то в Интернете, что вы могли бы указать мне на то, что показывает, что яблоко требует HD-графики на сетчатых устройствах? – Stephen

+0

Здесь новые рекомендации с 1 мая 2013 года: http://www.macobserver.com/tmo/article/apple-to-ios-developers-go-retina-or-go-home Вы можете найти точную формулировку в разработчике где-то в центре, я не знаю, где.Насколько «поддержка Retina» означает, что «все изображения должны быть в полном разрешении Retina» до Apple. Лично я бы не рискнул не использовать полное разрешение Retina, по крайней мере, не для визуальных изображений переднего плана. – LearnCocos2D

ответ

0

Масштабирование проблемы в стороне, есть две вещи, которые вы можете сделать. Во-первых, и, вероятно, проще всего просто добавить CCLayerColor поверх анимации и соответственно уменьшить масштаб. Таким образом, вам не нужно изменять каждый прямоугольник анимационного кадра.

Второй вариант будет использовать узел подрезки здесь:

Here

+0

нет свойства anchorPoint для spriteFrame! – Stephen

+0

Вы правы. Извиняюсь. Обрезающий узел - это то, что вы ищете. –

Смежные вопросы