我试图在我的 Sprite-kit 游戏原型(prototype)中管理鼠标事件。
我使用了问题 SO_q 中的以下方法
- (void) mouseDown: (NSEvent*) theEvent
{
NSLog(@"Click!");
}
- (void) rightMouseDown:(NSEvent*) theEvent
{
NSLog(@"DERECHA PULSADA!");
}
但是检测正确点击的方法对我不起作用。我想检测鼠标右键单击的点击和下降。 我如何检测鼠标点击何时放下?
更新:
我尝试了以下方法,从 Cocoa Event Handling Doc 中获取.
- (void)mouseDown:(NSEvent *)theEvent
{
switch ([theEvent type])
{
case NSLeftMouseDown:
NSLog(@"ISQUIERDO down!");
break;
case NSLeftMouseUp:
NSLog(@"IZQDO soltado!");
break;
case RightMouseDown:
NSLog(@"DERECHO PUSSSHHH!");
break;
case NSRightMouseUp:
NSLog(@"Botón Derecho Soltado!");
break;
default:
/* Ignore any other kind of event. */
break;
}
return;
}
结果:只处理了左键单击的事件。
阅读 Cocoa Event Handling Doc 之后我尝试覆盖以下方法:
-(void)rightMouseDown:(NSEvent *)theEvent
{
NSLog(@"DERECHO PUSSSHHH!");
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
NSLog(@"Botón Derecho Soltado!");
}
也没用。
更新:
就像我之前说的,这些方法在 Sprite-Kit 类中。这里是定义这些方法的类定义。
#import <SpriteKit/SpriteKit.h>
@interface OpcionesMenu : SKScene
@end
最佳答案
如果您查看 Apple 的 NSView 文档您会看到 NSView 的 rightMouseDown 实现:不会将鼠标右键事件向上发送到响应链,而是通过调用 menuForEvent:
直接处理事件。
SKView 是 NSView 的子类,所以我通过向 SKView 添加类别并实现我自己版本的 rightMouseDown:
解决了这个问题。我的 rightMouseDown: 版本仅调用 rightMouseDown:
的场景实现,这是我在场景中实际执行操作的地方。 SKView 有一个属性,scene,它持有对当前呈现场景的引用。因此,我的 rightMouseDown: 类别实现如下所示:
ObjC:
@implementation SKView (Right_Mouse)
-(void)rightMouseDown:(NSEvent *)theEvent {
[self.scene rightMouseDown:theEvent];
}
@end
我在我的 blog 上详细说明了这一点如果你有兴趣。
Swift 3 + iOS10:
extension SKView {
open override func rightMouseDown(with theEvent: NSEvent) {
self.scene?.rightMouseDown(with: theEvent)
}
}
swift :
extension SKView {
public override func rightMouseDown(theEvent: NSEvent) {
self.scene?.rightMouseDown(theEvent)
}
}
并将其添加到您的SKScene
子类
override func rightMouseDown(theEvent: NSEvent) {
let location = theEvent.locationInNode(self)
...
}
关于objective-c - 检测鼠标右键单击 cocoa ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856059/