Как обнаружить ввод мыши в SKSpriteNode при разработке OSX с использованием SpriteKit и Swift?

Если у меня есть SKSpriteNode в SKScene:

let sprite = SKSpriteNode(imageNamed:"Spaceship")

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

self.addChild(champion)

Теперь, после того как я добавлю этот узел на сцену, я хочу изменить его цвет, когда я наведу указатель мыши на этот узел.

Как определить наведение мыши на этот узел, чтобы изменить его цвет?

Я вижу событие mouseEntered в классе SKSpriteNode. Я использую это? Как его можно уволить?

Или я должен использовать другие подходы?


person Ivan Jiang    schedule 12.11.2014    source источник


Ответы (1)


В 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)

Объявите спрайт и добавьте его на сцену для тестирования.

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

Переопределить метод 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()
    }
}

Наконец, вам нужно будет удалить NSTrackingArea из вида при переходе к новой сцене.

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

}
person 0x141E    schedule 14.11.2014
comment
Спасибо. Это работает. И есть ли способ, чтобы наведение определялось только тогда, когда курсор наводится на фигуру космического корабля, а не на прямоугольник, в котором он находится? - person Ivan Jiang; 14.11.2014
comment
@0x141E, не могли бы вы помочь мне с похожей проблемой в области отслеживания? - person Leo Dabus; 14.11.2014
comment
stackoverflow.com/questions/26902106/ - person Leo Dabus; 14.11.2014
comment
@LeonardoSavioDabus извините, я больше знаком с разработкой для iOS, чем для Mac OS X. - person 0x141E; 15.11.2014