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()
            }
        }
    }
}
Другие вопросы по тегам