当spriteSceneNode到达ios SpriteKit中的某个点时,如何触发函数

时间:2017-06-29 12:50:43

标签: ios swift3 sprite-kit skaction

我有一个spritekit场景,并为其中一个spriteSceneNode添加了一些操作序列。 比方说,一个名为node1的spriteSceneNode移动到point1然后它将移动到point2然后point3等。它通过使用" SKAction.moveTo"来实现。功能。

我的问题是,

当它到达每个点(point1或point2或point3)时是否可以调用自定义函数。?

在这里添加一些代码。

 func MoveObjectToAnotherPosition(arrayOfPoints : [CGPoint],object: SKSpriteNode   )  {
    let from   = object.position


    var curPoint1 = object.position


    let move = SKAction.move(to: from ,duration: 0.5)
    var arrayOfMove : [SKAction] = []
    arrayOfMove.append(move)
    for point in (arrayOfPoints ) {
        let move2 = SKAction.move(to: point,duration: 2.5)

       let deltaX = point.x - curPoint1.x
        let deltaY = point.y - curPoint1.y
        let angle = atan2(deltaY, deltaX)
        // let graph =  childNode(withName: "Graph1")?
        print(angle)
        let ang = point.angle(to: curPoint1)
        print(ang)
        let codeToRunWhenReachingPointX = SKAction.run {
            let anglevalue = angle + 90 * self.DegreesToRadians
            self.movObject.zPosition = anglevalue
            print(anglevalue)
        }


        //print(anglevalue)
        let rotate = SKAction.rotate(byAngle: -angle, duration: 0.0)
        arrayOfMove.append(codeToRunWhenReachingPointX)
        arrayOfMove.append(move2)
        curPoint1 = point
    }


    let moveToSequence = SKAction.sequence(arrayOfMove)

    object.run(moveToSequence)
}

任何帮助?

1 个答案:

答案 0 :(得分:1)

是的,您可以在SKAction完成时调用任何代码。为此,您可以使用run(_:)创建一个运行任何代码的SKAction。

由于你想在到达X点时调用一些代码,我会为每个点X添加这样的代码:

let moveToPointX = SKAction.move(to: pointX, duration: someDuration)
arrayOfMove.append(moveToPointX)

let codeToRunWhenReachingPointX = SKAction.run {
     // add whatever code you need, e.g. a closure passed to this function
}
arrayOfMove.append(codeToRunWhenReachingPointX)

然后您可以通过调用

来运行现在的动作序列
let moveToSequence = SKAction.sequence(arrayOfMove)
object.run(moveToSequence)

值得注意的是,在移动到下一个点之前,运行一系列操作不会等待codeToRunWhenReachingPointX完成。假设你有SKActions数组[m1,c1,m2,c2],其中m是你的移动动作,而c是你的“运行代码”动作。当你运行这个序列时,会发生这种情况:m1将运行,当它完成时c1将运行,然后无需等待c1完成,m2将运行,当m2完成时,c2将运行。

另请参阅run(_:completion:)方法,该方法的工作方式类似。

希望这有帮助!