将 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 鼠标操作的主要内容,如果未能解决你的问题,请参考以下文章

如何将thinkcmf导入eclipse

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?