使用acceptsMouseMovedEvents对Storyboard和Swift进行SpriteKit鼠标操作

时间:2015-07-09 02:13:49

标签: swift cocoa sprite-kit iboutlet xcode-storyboard

我通过在Xcode中使用Storyboard引用自定义NSView来创建SpriteKit场景。但是,我无法使用SpriteKit实现任何mouseMoved事件,因为我不知道如何引用该程序NSWindow将其acceptsMouseMovedEvents属性设置为" true&#34 ;

如何在@IBOutlet文件中创建对NSWindow的{​​{1}}引用,以便我可以更改此属性?

2 个答案:

答案 0 :(得分:3)

您可以配置NSTrackingArea对象来跟踪鼠标的移动以及光标进入或退出视图的时间。要创建NSTrackingArea对象,请指定要跟踪鼠标事件的视图区域,将接收鼠标事件消息的所有者以及何时进行跟踪(例如,在关键窗口中) 。以下是如何向视图添加跟踪区域的示例。添加到您的SKScene子类,例如GameScene.swift。

Swift 3和4

override func didMove(to view: SKView) {
    // Create a tracking area object with self as the owner (i.e., the recipient of mouse-tracking messages
    let trackingArea = NSTrackingArea(rect: view.frame, options: [.activeInKeyWindow, .mouseMoved], owner: self, userInfo: nil)
    // Add the tracking area to the view
    view.addTrackingArea(trackingArea)
}

// This method will be called when the mouse moves in the view
override func mouseMoved(with theEvent: NSEvent) {
    let location = theEvent.location(in: self)
    print(location)
}

Swift 2

override func didMoveToView(view: SKView) {
    // Create a tracking area object with self as the owner (i.e., the recipient of mouse-tracking messages
    let trackingArea = NSTrackingArea(rect: view.frame, options: NSTrackingAreaOptions.ActiveInKeyWindow | NSTrackingAreaOptions.MouseMoved, owner: self, userInfo: nil)
    // Add the tracking area to the view
    view.addTrackingArea(trackingArea)
}

// This method will be called when the mouse moves in the view
override func mouseMoved(theEvent: NSEvent) {
    let location = theEvent.locationInNode(self)
    println(location)
}

答案 1 :(得分:0)

0x141E答案的更新:

override func didChangeSize(_ oldSize: CGSize) {
    guard let newRect = view?.bounds else {return}

    let options = NSTrackingArea.Options(rawValue: NSTrackingArea.Options.activeInKeyWindow.rawValue | NSTrackingArea.Options.mouseMoved.rawValue)
    let userInfo = ["SKMouseInput": 1]
    let trackingArea = NSTrackingArea(rect: newRect, options: options, owner: self, userInfo: userInfo)
    if let previousTrackingAreas = view?.trackingAreas {
        for area in previousTrackingAreas {
            if let theInfo = area.userInfo {
                if let _ = theInfo["SKMouseInput"]  {
                    view?.removeTrackingArea(area)
                }
            }
        }
    }
    view?.addTrackingArea(trackingArea)
}

初始化后不久将调用此SKScene方法覆盖,将允许不受窗口大小更改的影响,并将清除旧的跟踪区域。请注意,它仍然需要mouseMoved覆盖。