SKSpriteNode анимация, где каждый кадр в анимации не центрирован
У меня есть SKSpriteNode
что составляет 120px x 120px. Текстурой спрайта по умолчанию является просто круг с радиусом 60 пикселей. Я хотел бы оживить спрайт с помощью:
SKAction.animate(with:timePerFrame:resize:restore:)
Проблема в том, что каждая текстура как часть анимации имеет размер менее 120px x 120px, и, следовательно, если я сделаю это и установлю точку привязки спрайта в
CGPoint(x: 0.5, y: 0.5)
Кадры анимации будут центрированы в середине спрайта, что не является правильной анимацией, которая мне нужна. Я хотел бы, чтобы анимация была следующей:
Это означает, что я должен добавить все анимационные текстуры в атласе спрайта, чтобы они были размером 120px x 120px, я прав? Если это так, это приведет к потере пространства атласа с пустыми пикселями. Есть ли лучший способ добиться этого? т.е. указание центральной точки каждого кадра текстуры в анимации?
Заранее спасибо.
1 ответ
Вы также должны попробовать:
Сосредоточьте свое внимание на resize = true
Если true, размер спрайта изменяется в соответствии с каждой новой текстурой. Если false, размер спрайта остается постоянным.
Если вам нужно больше официальных деталей, посмотрите здесь.
О вашем запросе к комментариям ниже вы можете воссоздать 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()
}
}
}
}