Con*_*sed 5 closures sprite-kit skaction swift completion
为什么从未调用完成?
我非常抱歉这是一个代码转储...因为我不知道为什么每个部分都有效,除了调用完成.
除了完成之外,没有调用完成的SKAction运行.就是这个:
curtain.run(fadeMoveWipeAndReveal, completion: {onDone(), print("I'm done!!!!")})
Run Code Online (Sandbox Code Playgroud)
在以下课程中:
import SpriteKit
class WipeCurtain: SKSpriteNode {
var wipeCurtainBase: SKSpriteNode?
var returnable = SKNode()
var moveRight = SKAction()
var node = SKNode()
init( color: SKColor,
size: CGSize,
time: TimeInterval,
reveal: @escaping () -> (),
onDone: @escaping () -> ())
{
super.init(texture: nil, color: color, size: size)
wipeCurtainBase = SKSpriteNode(color: color, size: size)
let show = SKAction.run(reveal)
let fadeIn = createFadeIn(duration: time)
let moveRight = createMoveRight(duration: time)
let wipeRight = createWipeRight(duration: time)
let fadeAndMove = SKAction.group( [ fadeIn, moveRight ] )
let wipeAndReveal = SKAction.group( [ show, wipeRight ] )
let fadeMoveWipeAndReveal = SKAction.sequence( [ fadeAndMove, wipeAndReveal ] )
if let curtain = self.wipeCurtainBase {
curtain.anchorPoint = CGPoint(x: 1, y: 0)
curtain.position = CGPoint(x: frame.size.width, y: 0)
curtain.zPosition = -1
curtain.name = "wipe"
curtain.run(fadeMoveWipeAndReveal, completion: {
onDone()
print("I'm done!!!!")
})
}
}
func createFadeIn(duration: TimeInterval) -> SKAction {
let fadeIn = SKEase
.fade(
easeFunction: .curveTypeLinear,
easeType: .easeTypeIn,
time: duration,
fromValue: 0,
toValue: 1
)
return fadeIn
}
func createMoveRight(duration: TimeInterval) -> SKAction {
let moveRight = SKEase
.move(
easeFunction: .curveTypeExpo,
easeType: .easeTypeOut,
duration: duration,
origin: CGPoint(
x: 0,
y: 0),
destin: CGPoint(
x: frame.size.width,
y: 0)
)
return moveRight
}
func createWipeRight(duration: TimeInterval) -> SKAction {
let wipeRight = SKEase
.createFloatTween(
start: 1,
ender: 0,
timer: duration,
easer: SKEase
.getEaseFunction(
.curveTypeExpo,
easeType: .easeTypeOut
),
setterBlock: {(node, i) in
node.xScale = i}
)
return wipeRight
}
func wipeWith() -> SKNode {
if let curtain = wipeCurtainBase?.copy() as! SKSpriteNode? {
returnable = curtain
}
return returnable
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
这是使这项工作的gameScene,Xcode SpriteKit模板的一个非常轻微的修改版本:
import SpriteKit
import GameplayKit
class GameScene: SKScene {
private var swipe: WipeCurtain?
override func didMove(to view: SKView) {
swipe = WipeCurtain(color: .brown, size: frame.size, time: 1,
reveal: self.showOrNot,
onDone: self.previewer
)
}
func showOrNot(){
print(" Deciding to show or not.......")
}
func previewer(){
print("now running the previewer")
}
func touchDown(atPoint pos : CGPoint) {
addChild(swipe!.wipeWith())
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for t in touches { self.touchDown(atPoint: t.location(in: self)) }
}
}
Run Code Online (Sandbox Code Playgroud)
我想请您注意以下几行内容:
有问题的代码是:
curtain.run(fadeMoveWipeAndReveal, completion: {
onDone()
print("I'm done!!!!")
})
Run Code Online (Sandbox Code Playgroud)
您可以fadeMoveWipeAndReveal用其他操作之一替换,例如show:
let show = SKAction.run(reveal)
Run Code Online (Sandbox Code Playgroud)
你会看到完成从未被调用。为什么?因为它在 WipeCurtain 初始化期间第一次运行,但该操作在完成之前被删除,所以下次您重新调用此操作来运行时touchesBegan,将永远不会调用完成。
您可以通过在以下位置放置断点来测试它curtain.run并启动项目来测试它:
正如您所看到的,断点在初始化期间立即停止项目,在此阶段,操作在完成之前被删除。
关于您的解决方法,这是正确的,它有效,因为您删除了completionSKAction.sequence并使用了每次调用它时正确执行的简单方法。
详细信息:该copy方法对我有用,我怀疑有些人对此有问题,因为互联网上有更多关于 SKEase 的版本,也许其中一些可能有问题,但这个版本运行良好,如下面这两个屏幕截图所示:
| 归档时间: |
|
| 查看次数: |
578 次 |
| 最近记录: |