Touches Begin 时从 SKScene 中删除一个函数
Remove a function from SKScene when Touches Begin
我有一个蓝天纹理从屏幕顶部移动到底部,在一个函数中永远重复。但是,当触摸开始时,我希望蓝天在一段时间后完全淡出,然后完全从场景中移除。
我能够让天空瞬间淡出,然后好像移除了一半的循环,但我仍然每隔一段时间让天空下降。这是问题的视频:Blue Sky Video
在视频中,当暂停按钮出现在屏幕左上角时,触摸开始 - 在触摸开始之前,蓝天从上到下无缝移动。
函数
func createBlueSky() {
let blueSkyTexture = SKTexture(imageNamed: "blueSky")
for i in 0 ... 1 {
let blueSky = SKSpriteNode(texture: blueSkyTexture)
blueSky.name = "blueSky"
blueSky.zPosition = -60
blueSky.anchorPoint = CGPoint.zero
blueSky.position = CGPoint(x: 0, y: (blueSkyTexture.size().height * CGFloat(i)))
worldNode.addChild(blueSky)
let moveDown = SKAction.moveBy(x: 0, y: -blueSkyTexture.size().height, duration: 10)
let moveReset = SKAction.moveBy(x: 0, y: blueSkyTexture.size().height, duration: 0)
let moveLoop = SKAction.sequence([moveDown, moveReset])
let moveForever = SKAction.repeatForever(moveLoop)
blueSky.run(moveForever)
}
}
我已将上述功能添加到 didMove(toView)
覆盖 func didMove
createBlueSky()
然后在我开始接触的过程中,我添加了这段代码以淡出并从父项中删除。
我在另一个 post 中看到,要从另一个函数访问 blue sky,我需要给它起一个名字,我做到了。仍然没有运气:/
覆盖 func touchesBegan
let blueSky = worldNode.childNode(withName: "blueSky") as! SKSpriteNode
let blueSkyFade = SKAction.fadeOut(withDuration: 3)
let blueSkyFadeWait = SKAction.wait(forDuration: 3)
let removeBlueSky = SKAction.removeFromParent()
blueSky.run(SKAction.sequence([blueSkyFadeWait, blueSkyFade, removeBlueSky]))
我是 Swift 的新手,但我希望问题足够具体。我很乐意提供任何其他必要的信息。
您正在创建 2 个 blueSky 节点,但您只淡出并移除了其中的 1 个。您需要使用您要查找的名称枚举所有节点。为此,您调用 enumerateChildNodes(withName:}
let blueSkyFade = SKAction.fadeOut(withDuration: 3)
let blueSkyFadeWait = SKAction.wait(forDuration: 3)
let removeBlueSky = SKAction.removeFromParent()
enumerateChleNodes(withName:"blueSky")
{
(blueSky,stop) in
blueSky.run(SKAction.sequence([blueSkyFadeWait, blueSkyFade, removeBlueSky]))
}
我有一个蓝天纹理从屏幕顶部移动到底部,在一个函数中永远重复。但是,当触摸开始时,我希望蓝天在一段时间后完全淡出,然后完全从场景中移除。
我能够让天空瞬间淡出,然后好像移除了一半的循环,但我仍然每隔一段时间让天空下降。这是问题的视频:Blue Sky Video
在视频中,当暂停按钮出现在屏幕左上角时,触摸开始 - 在触摸开始之前,蓝天从上到下无缝移动。
函数
func createBlueSky() {
let blueSkyTexture = SKTexture(imageNamed: "blueSky")
for i in 0 ... 1 {
let blueSky = SKSpriteNode(texture: blueSkyTexture)
blueSky.name = "blueSky"
blueSky.zPosition = -60
blueSky.anchorPoint = CGPoint.zero
blueSky.position = CGPoint(x: 0, y: (blueSkyTexture.size().height * CGFloat(i)))
worldNode.addChild(blueSky)
let moveDown = SKAction.moveBy(x: 0, y: -blueSkyTexture.size().height, duration: 10)
let moveReset = SKAction.moveBy(x: 0, y: blueSkyTexture.size().height, duration: 0)
let moveLoop = SKAction.sequence([moveDown, moveReset])
let moveForever = SKAction.repeatForever(moveLoop)
blueSky.run(moveForever)
}
}
我已将上述功能添加到 didMove(toView)
覆盖 func didMove
createBlueSky()
然后在我开始接触的过程中,我添加了这段代码以淡出并从父项中删除。
我在另一个 post 中看到,要从另一个函数访问 blue sky,我需要给它起一个名字,我做到了。仍然没有运气:/
覆盖 func touchesBegan
let blueSky = worldNode.childNode(withName: "blueSky") as! SKSpriteNode
let blueSkyFade = SKAction.fadeOut(withDuration: 3)
let blueSkyFadeWait = SKAction.wait(forDuration: 3)
let removeBlueSky = SKAction.removeFromParent()
blueSky.run(SKAction.sequence([blueSkyFadeWait, blueSkyFade, removeBlueSky]))
我是 Swift 的新手,但我希望问题足够具体。我很乐意提供任何其他必要的信息。
您正在创建 2 个 blueSky 节点,但您只淡出并移除了其中的 1 个。您需要使用您要查找的名称枚举所有节点。为此,您调用 enumerateChildNodes(withName:}
let blueSkyFade = SKAction.fadeOut(withDuration: 3)
let blueSkyFadeWait = SKAction.wait(forDuration: 3)
let removeBlueSky = SKAction.removeFromParent()
enumerateChleNodes(withName:"blueSky")
{
(blueSky,stop) in
blueSky.run(SKAction.sequence([blueSkyFadeWait, blueSkyFade, removeBlueSky]))
}