Kev*_*ens 5 nsoperation sprite-kit swift
Rob为子类化NSOperation 提供了一个很好的Objective-C解决方案,以实现SKAction对象的串行排队机制.我在自己的Swift项目中成功实现了这一点.
import SpriteKit
class ActionOperation : NSOperation
{
let _node: SKNode // The sprite node on which an action is to be performed
let _action: SKAction // The action to perform on the sprite node
var _finished = false // Our read-write mirror of the super's read-only finished property
var _executing = false // Our read-write mirror of the super's read-only executing property
/// Override read-only superclass property as read-write.
override var executing: Bool {
get { return _executing }
set {
willChangeValueForKey("isExecuting")
_executing = newValue
didChangeValueForKey("isExecuting")
}
}
/// Override read-only superclass property as read-write.
override var finished: Bool {
get { return _finished }
set {
willChangeValueForKey("isFinished")
_finished = newValue
didChangeValueForKey("isFinished")
}
}
/// Save off node and associated action for when it's time to run the action via start().
init(node: SKNode, action: SKAction) {
// This is equiv to ObjC:
// - (instancetype)initWithNode(SKNode *)node (SKAction *)action
// See "Exposing Swift Interfaces in Objective-C" at https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_35
_node = node
_action = action
super.init()
}
/// Add the node action to the main operation queue.
override func start()
{
if cancelled {
finished = true
return
}
executing = true
NSOperationQueue.mainQueue().addOperationWithBlock {
self._node.runAction(self._action) {
self.executing = false
self.finished = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
要使用ActionOperation,请在客户端类中实例化NSOperationQueue类成员:
var operationQueue = NSOperationQueue()
Run Code Online (Sandbox Code Playgroud)
在init方法中添加以下重要行:
operationQueue.maxConcurrentOperationCount = 1; // disallow follow actions from overlapping one another
Run Code Online (Sandbox Code Playgroud)
然后,当您准备好向其添加SKActions时,它们会连续运行:
operationQueue.addOperation(ActionOperation(node: mySKNode, action: mySKAction))
Run Code Online (Sandbox Code Playgroud)
您是否需要在任何时候终止操作:
operationQueue.cancelAllOperations() // this renders the queue unusable; you will need to recreate it if needing to queue anymore actions
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
rin*_*aro 11
根据该文件:
在自定义实现中,
isExecuting只要操作对象的执行状态发生更改,就必须为键路径生成KVO通知.
在自定义实现中,
isFinished只要操作对象的完成状态发生更改,就必须为键路径生成KVO通知.
所以我认为你必须:
override var executing:Bool {
get { return _executing }
set {
willChangeValueForKey("isExecuting")
_executing = newValue
didChangeValueForKey("isExecuting")
}
}
override var finished:Bool {
get { return _finished }
set {
willChangeValueForKey("isFinished")
_finished = newValue
didChangeValueForKey("isFinished")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3660 次 |
| 最近记录: |