在 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 的指针?
我使用 "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 的指针?