2017-02-03 17 views
2

У меня есть SKSpriteNode, который является 120px x 120px. Текстура спрайта по умолчанию - это просто круг с радиусом 60 пикселей. Я хотел бы анимировать спрайт с:анимация SKSpriteNode, где каждый кадр в анимации не центрирован

SKAction.animate(with:timePerFrame:resize:restore:) 

Вопрос заключается в том, что каждая текстура как часть анимации меньше 120px х 120px в размерах, и, следовательно, если я это сделать и установить точку спрайт якорь

CGPoint(x: 0.5, y: 0.5) 

кадров анимации будет сосредоточен в середине спрайта, который не является правильной анимацией я после. Я хотел бы анимацию быть следующей:

enter image description here

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

Заранее спасибо.

ответ

0

Вы должны быть в состоянии попробовать также:

enter image description here

Сосредоточьте свое внимание на resize = true Если правда, спрайт изменен, чтобы соответствовать каждой новой текстуры. Если false, размер спрайта остается постоянным.

Если вам нужно больше официальных сведений, посмотрите here.


О Вашей просьбе в комментариях ниже вы можете повторно создать SKAction.animate, например сделать расширение, как это:

extension SKAction 
{ 
    static func animate(withMyTextures textures:[texture:SKTexture], timePerFrame:TimeInterval ,resize:Bool, restore:Bool) ->SKAction { 

     var originalTexture : SKTexture! 
     let duration = timePerFrame * Double(textures.count) 

     return SKAction.customAction(withDuration: duration) 
     { 
      node,elapsedTime in 
      guard let spriteNode = node as? SKSpriteNode 
      else 
      { 
        assert(false,"animateWithMyTextures only works on members of SKSpriteNode") 
        return 
      } 
      let index = Int((elapsedTime/CGFloat(duration)) * CGFloat(textures.count)) 
      //If we havent assigned this yet, lets assign it now 
      if originalTexture == nil 
      { 
       originalTexture = spriteNode.texture 
      } 
      if(index < textures.count) 
      { 
       spriteNode.texture = textures[index].texture 
      } 
      else if(restore) 
      { 
       spriteNode.texture = originalTexture 
      } 
      if(resize) 
      { 
       spriteNode.size = spriteNode.texture!.size() 
      } 
     } 
    } 
} 
+0

Это не проблема изменения размера. это проблема позиционирования каждого кадра анимации в правильной позиции. Если я установил resize = true, спрайт будет просто изменять размер каждого кадра анимации. Посмотрите на вторую строку на диаграмме выше. это то, как каждый кадр должен располагаться во время анимации. – plawres

+0

Если это не проблема изменения размера, у вас возникла ошибка в создании анимации. Как вы можете ожидать, что простые изображения позиционируются справа или слева, основываясь на ваших вкусах, после чего вы вставили в прозрачную среду? Здесь есть две проблемы: один - это разный размер, вызванный прозрачной областью в верхней/нижней части ваши спрайты (решены с помощью resize = true), а другой - это то, что вы должны перемещать свои части на нужную вам сторону, иначе вы должны переделать анимацию, поставив простой пиксель ссылки на transp. чтобы сохранить реальную ширину (или изменить цвет фона) –

+0

Проблема не изменяется. Вопрос в том, есть ли способ разместить каждый кадр текстуры анимации отдельно или, например, установить разные опорные точки для каждого кадра текстуры анимации? например опорная точка frame01 (0,0, 0,5), вторая опорная точка кадра (0,25, 0,5), опорная точка третьего кадра (0,5,0,5) ... и т. д. Потому что, если у меня есть каждая текстура с пустыми пикселями в атласе, то это пустая трата памяти для хранения пустых пикселей. – plawres