我通过在Xcode中使用Storyboard引用自定义NSView
来创建SpriteKit场景。但是,我无法使用SpriteKit实现任何mouseMoved
事件,因为我不知道如何引用该程序NSWindow
将其acceptsMouseMovedEvents
属性设置为" true&#34 ;
如何在@IBOutlet
文件中创建对NSWindow
的{{1}}引用,以便我可以更改此属性?
答案 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覆盖。