将 AcceptMouseMovedEvents 用于带有 Storyboard 和 Swift 的 SpriteKit 鼠标操作
Posted
技术标签:
【中文标题】将 AcceptMouseMovedEvents 用于带有 Storyboard 和 Swift 的 SpriteKit 鼠标操作【英文标题】:Using acceptsMouseMovedEvents for SpriteKit mouse actions with Storyboards and Swift 【发布时间】:2015-07-09 02:13:48 【问题描述】:我通过在 Xcode 中使用 Storyboards 引用自定义 NSView
创建了一个 SpriteKit 场景。但是,我无法使用 SpriteKit 实现任何 mouseMoved
事件,因为我不知道如何引用程序的 NSWindow
将其 acceptsMouseMovedEvents
属性设置为“true”。
如何在我的AppDelegate.swift
文件中创建一个@IBOutlet
对我的NSWindow
的引用,以便我可以更改此属性?
【问题讨论】:
【参考方案1】:您可以配置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)
斯威夫特 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)
【讨论】:
【参考方案2】: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 覆盖。
【讨论】:
'允许不受窗口大小变化的影响'听起来不错,但是如果我手动调整窗口大小,则不会调用此方法;您需要手动设置场景的大小或 scaleMode = .resizeFill 来触发它。不过总体来说还是不错的。以上是关于将 AcceptMouseMovedEvents 用于带有 Storyboard 和 Swift 的 SpriteKit 鼠标操作的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等