ActionBuilder

开发者注意事项:由于此软件包为预发布版本,API可能会在没有通知的情况下发生重大更改。它未经测试,因此使用风险自负。

ActionBuilder允许您以更简洁、声明性的方式编写SpriteKit动画。它由各种结构体组成,这些结构体代表基本的动画,如ScaleRotate

使用ActionBuilder创建的动画

let emote =
Sequence {
    Group {
        FadeIn(duration: 0.7)
        Scale(by: 1.5, duration: 0.7)
        Move(to: (0, 30), duration: 0.7)
    }
    Wait(0.5)
    FadeOut(duration: 1)
    Remove()
}

与使用Apple的SpriteKit SKActions的相同动画相比

let emoteAction: SKAction = {
    let fadeIn = SKAction.fadeIn(withDuration: 0.7)
    let grow = SKAction.scale(by: 1.5, duration: 0.7)
    let moveUp = SKAction.moveTo(y: 30, duration: 0.7)
    let appear = SKAction.group([fadeIn, grow, moveUp])
    let wait = SKAction.wait(forDuration: 1)
    let disappear = SKAction.fadeOut(withDuration: 1)
    let remove = SKAction.removeFromParent()
    let emoteAnimation = SKAction.sequence([appear, wait, disappear, remove])
    return emoteAnimation
}()

ActionBuilder允许您在动画声明中使用条件和循环语句,使其更灵活且更易于编写。

使用changeTarget(to:)修饰符在多个节点之间协调动画。

包含自定义运算符:+会将多个动作连接成一个序列,&会将它们分组以同时运行,-将反转可逆的动作,而*允许您多次重复一个动作。

即使ActionBuilder中没有等效项,您也可以包含SKAction

let node = SKNode()
let otherNode = SKNode()

node.run {
    Group {
        
        Sequence {
            for i in 0...9 {
                Colorize(with: UIColor(red: Double(i/10), green: 0.7, blue: 0.7, alpha: 1))
                Wait(0.2)
            }
        }
        .changeTarget(to: otherNode)
        
        Sequence {
            let moveUp = Move(by: (0, 10))
            if Bool.random() {
                moveUp * 2
            } else {
                -moveUp
            }
            
            SKAction.resize(toHeight: 20, duration: 5)
        }
    }
}

请参阅Apple的文档:https://developer.apple.com/documentation/spritekit/skaction/action_initializers