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

How to trigger a function when spriteSceneNode reach at a point in ios SpriteKit

我有一个 spritekit 场景并向其中一个 spriteSceneNode 添加了一些动作序列。 例如,一个名为 node1 的 spriteSceneNode 移动到 point1 然后它将移动到 point2 然后 point3 等。它通过使用 "SKAction.moveTo" 函数实现。

我的问题是,

是否可以在到达每个点(点 1 或点 2 或点 3)时调用自定义函数?

在此处添加一些代码。

 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)
}

有什么帮助吗?

是的,您可以在 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 是您的 "run code" 动作。当您 运行 这个序列时,会发生以下情况:m1 将 运行 并且当它完成 c1 时将 运行,然后不等待 c1 完成,m2 将 运行,当 m2 完成时,c2 将 运行.

另请查看 run(_:completion:) 方法,其工作方式类似。

希望对您有所帮助!