如何在 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:) 方法,其工作方式类似。
希望对您有所帮助!
我有一个 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:) 方法,其工作方式类似。
希望对您有所帮助!