我是Swift的#selector范例的新手。最终,我试图将一个spaceShip的SKSpriteNode移到CGMutablePath上,并在spaceShip行进的路径上添加废气作为SKEmitterNodes。
但是我坚持#selector范式。我试图通过计时器将SpaceShipSprite的位置发送到MIJ.run('Duplicate...','duplicate range=&values')
函数,以便稍后我可以将SKEmitternode添加到该位置。
由于某种原因,我无法理解#selector的东西发出的东西与我放入变量的东西完全不同。请看下面的印刷品。这里发生了什么?
addFumeToPosition(_ point: CGPoint)
...
let spaceShipSprite = SKSpriteNode(texture: SKTexture(image: #imageLiteral(resourceName: "spaceShip")))
spaceShipSprite.position = CGPoint(x: 142.0, y:160.0)
spaceShipSprite.name = "spaceShip"
self.addChild(spaceShipSprite)
print("spaceShipSprite.position before timer point x:\(spaceShipSprite.position.x) y:\(spaceShipSprite.position.y)")
let gameTimer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector:#selector(addFumeToPosition(_: )), userInfo: spaceShipSprite.position, repeats: true)
print("spaceShipSprite.position before timer point x:\(spaceShipSprite.position.x) y:\(spaceShipSprite.position.y)")
在定时器点x:142.0 y:160.0 之前的spaceShipSprite.position 定时器点x后的
spaceShipSprite.position:142.0 y:160.0
定时器点x期间的spaceShipSprite.position:196092657881833.0 y:1000000000.0
答案 0 :(得分:2)
你做不到。
目标/行动的两种支持形式是
没有参数
func addFumeToPosition()
使用一个参数表示受影响的类(在本例中为Timer
实例)
func addFumeToPosition(_ timer: Timer)
如果传递参数,则它必须是Timer
实例。
必须通过userInfo
参数传递和处理所有自定义参数。
func addFumeToPosition(_ timer: Timer){
let point = timer.userInfo as! CGPoint
print("spaceShipSprite.position during point x:\(point.x) y:\(point.y)")
}
注意:在Swift 4中,您可能必须将@objc
属性添加到函数中。