我有一个Mac SpriteKit / swift应用程序(游戏),我需要将光标保持在窗口内。或者至少在离开游戏窗口时发出警告。
我已经设置了跟踪区域,并且正在使用鼠标移动游戏手柄。但是当光标移出窗口时,拨片停止工作。
let options = [ .mouseMoved,
.activeAlways,
.mouseEnteredAndExited] as NSTrackingArea.Options
let tracker = NSTrackingArea(rect:frame, options: options, owner:view, userInfo: nil)
view.addTrackingArea(tracker)
鼠标进入和退出的功能似乎无法启动
override func mouseExited(with event: NSEvent) {
// NSCursor.unhide()
print("_____________________EXIT")
//Never fires
}
override func mouseEntered(with event: NSEvent) {
// NSCursor.hide()
print("_____________________ENTER")
// never fires
}
有什么想法吗?感谢
答案 0 :(得分:0)
如果要将鼠标保留在窗口中,可以使用function dijkstra(graph, source)
@assert size(graph, 1) == size(graph, 2)
node_size = size(graph, 1)
dist = fill(Inf, node_size)
dist[source] = 0.0
T = Set{Int}(1:node_size) # unvisited nodes
pred = fill(-1, node_size)
while !isempty(T)
min_val, min_idx = minimum((dist[v], v) for v in T)
if isinf(min_val)
break # Break if remaining nodes are disconnected
end
delete!(T, min_idx)
# distance update
for nei in 1:node_size
if graph[min_idx, nei] > 0 && nei in T
possible_dist = dist[min_idx] + graph[min_idx, nei]
if possible_dist < dist[nei]
dist[nei] = possible_dist
pred[nei] = min_idx
end
end
end
end
return dist, pred
end
。它将鼠标光标设置在屏幕上。
下面是一个示例,以使鼠标在视图中居中:
CGWarpMouseCursorPosition
注意:在这种情况下,请使用NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { (event) -> NSEvent? in
let point = NSPoint(x: self.view.frame.width * 0.5, y: self.view.frame.height * 0.5)
let pointInWindow = self.view.convert(point, to: nil)
if let pointOnScreen = self.view.window?.convertPoint(toScreen: pointInWindow) {
let cgPoint = CGPoint(x: pointOnScreen.x, y: pointOnScreen.y)
CGWarpMouseCursorPosition(cgPoint)
}
return event
}
而不是NSEvent.addLocalMonitorForEvents
来获取.mouseMoved
个事件。
答案 1 :(得分:0)
我认为您会更满意采用其他解决方案:隐藏光标并将鼠标移动从光标位置断开。
您可以使用CGDisplayHideCursor
和CGDisplayShowCursor
隐藏和显示指针。
您可以使用CGAssociateMouseAndMouseCursorPosition
将鼠标移动从光标位置断开(然后重新连接)。当鼠标与光标断开连接时收到mouseMoved
和mouseDragged
事件时,您可以从事件的deltaX
和deltaY
字段中读取鼠标的移动。 / p>