我正在尝试在我的Sprite-kit游戏原型中管理鼠标事件.
- (void) mouseDown: (NSEvent*) theEvent { NSLog(@"Click!"); } - (void) rightMouseDown:(NSEvent*) theEvent { NSLog(@"DERECHA PULSADA!"); }
但检测正确的clic的方法对我不起作用.我想检测单击鼠标右键单击.
如何检测鼠标点击何时被删除?
更新:
我尝试了下面的方法,从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有一个属性,场景,其中包含对当前呈现场景的引用.因此,我的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) } }
迅速:
extension SKView { public override func rightMouseDown(theEvent: NSEvent) { self.scene?.rightMouseDown(theEvent) } }
并将其添加到您的SKScene子类
override func rightMouseDown(theEvent: NSEvent) { let location = theEvent.locationInNode(self) ... }