在 MetalKit 应用程序中处理输入事件

Handling input events in a MetalKit application

我使用 "Game" 使用 MetalKit 的模板在 OS X in Xcode 上创建了一个应用程序。如何处理 keyDown 和 keyUp 等输入事件?我尝试添加

- (void)keyDown:(NSEvent *)theEvent
{
    NSLog( @"Key down\n" );
}

- (void)keyUp:(NSEvent *)theEvent
{
    NSLog( @"Key up\n" );
}

进入 AppDelegate 和 GameViewController 但当我按下一个键时它们没有被调用。

如果您不使用 MetalKit,则需要创建一个视图作为 NSView 的子类并在其中实现以下方法:

- (void)keyDown:(NSEvent *)theEvent
{
    NSLog(@"onKeyDown Detected; Merry Christmas, by the way.");
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

但是,如果您使用的是 MetalKit,您将执行相同的操作,并在 MTKView 的视图子类中实现上述方法。

两个版本我都测试过; keyDown 在按下某个键时被调用。

下面是我如何在没有子类化的情况下在我的 MetalKit 应用程序中获得键盘输入 MTKView

我在 GameViewController.mm 中实现了 keyDown:

- (void)keyDown:(NSEvent *)theEvent
{
    NSLog(@"keyDown Detected");
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

在我的 AppDelegate.m 中,我在 applicationDidFinishLaunching 中调用 [[ [myViewController view] window ] makeFirstResponder:myViewController];,其中 myViewController 指向我的 GameViewController 实例。

对于 Swift 个应用程序,将这些添加到您的 MTKView 子类中:

// yes, this MUST be here.
override var acceptsFirstResponder: Bool { 
    return true 
}
override func keyDown(with theEvent: NSEvent) {
    // do something 
}
override func keyUp(with theEvent: NSEvent) {
    // do something 
}

如前所述:您必须在子class 中子class MTKView 和处理keyDown。 还要记得在 Storyboard 中将视图的 class 从 MTKView 设置为 subclass.

这是消除 MTKView 中那些讨厌的哔哔声的方法(由于未处理的 keyDown)。

但也如评论中所述:如果您将 Storyboard 中的 class 重置为 MTKView,则 keyDown 将继续被处理(并且没有蜂鸣声)。奇数

如果没有按照其中一个答案中的建议进行子classing,我从来没有让它工作过。在那个阶段你如何获得指向 GameViewController 的指针?