如何使用SpriteKit和Swift检测OSX开发中SKSpriteNode上的鼠标输入?

Iva*_*ang 1 macos sprite-kit skspritenode swift

如果我在SKScene中有一个SKSpriteNode:

let sprite = SKSpriteNode(imageNamed:"Spaceship")

champion.position = CGPointMake(self.size.width/2, self.size.height/2)
champion.setScale(0.25)

self.addChild(champion)
Run Code Online (Sandbox Code Playgroud)

现在,将这个节点添加到场景中之后,我想在将鼠标移到该节点上时更改其颜色。

如何检测此节点上的鼠标悬停,以便可以更改其颜色?

我在SKSpriteNode类中看到一个mouseEntered事件。我会用吗?如何射击?

还是应该使用其他方法?

0x1*_*41E 5

在中didMoveToView,定义NSTrackingArea跟踪鼠标事件并将其添加到视图中

    let options = [NSTrackingAreaOptions.MouseMoved, NSTrackingAreaOptions.ActiveInKeyWindow] as NSTrackingAreaOptions
    let trackingArea = NSTrackingArea(rect:view.frame,options:options,owner:self,userInfo:nil)
    view.addTrackingArea(trackingArea)
Run Code Online (Sandbox Code Playgroud)

声明一个精灵并将其添加到场景中以进行测试

    let sprite = SKSpriteNode(imageNamed:"Spaceship")
    sprite.name = "sprite"
    sprite.position = CGPointMake(CGRectGetMidX(view.frame), CGRectGetMidY(view.frame));
    sprite.setScale(0.5)
    self.addChild(sprite)
Run Code Online (Sandbox Code Playgroud)

覆盖mouseMoved方法

override func mouseMoved(event: NSEvent) {
    // Get mouse position in scene coordinates
    let location = event.locationInNode(self)
    // Get node at mouse position
    let node = self.nodeAtPoint(location)
    if (node.name == "sprite") {
        let sprite = node as SKSpriteNode
        sprite.colorBlendFactor = 1.0
        sprite.color = SKColor.greenColor()
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,NSTrackingArea当您过渡到新场景时,需要将其从视图中删除

override func willMoveFromView(view: SKView) {
    for trackingArea in view.trackingAreas {
        view.removeTrackingArea(trackingArea)
    }

}
Run Code Online (Sandbox Code Playgroud)