我有一个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)
}
任何帮助?
答案 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:)方法,该方法的工作方式类似。
希望这有帮助!