代码之家  ›  专栏  ›  技术社区  ›  SurvivalMachine

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

  •  2
  • SurvivalMachine  · 技术社区  · 8 年前

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

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

    进入AppDelegate和GameViewController,但当我按下键时,它们不会被调用。

    4 回复  |  直到 8 年前
        1
  •  3
  •   Bobjt    6 年前

    对于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 
    }
    
        2
  •  2
  •   Unheilig    8 年前

    如果您不使用 MetalKit ,您需要创建一个视图,该视图是 NSView 并在其中实现以下方法:

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

    如果您正在使用 金属套件 但是,您也可以这样做,并在视图子类中实现上述方法 MTKView 而是在那里。

    我已经在两个版本上进行了测试;和 keyDown 在按键时调用。

        3
  •  2
  •   rgos    4 年前

    如前所述:您必须子类化MTKView并在子类中处理keyDown。 还记得将Storyboard中的视图类从MTKView设置为子类。

    这是在MTK视图中消除那些讨厌的蜂鸣音的方法(由于未处理的keyDown)。

    但也如注释中所述:如果将Storyboard中的类重置为MTKView,则会继续处理keyDown(并且不会发出蜂鸣音)。古怪的

    我从来没有像其中一个答案中所建议的那样,在不进行子类化的情况下工作。如何在该阶段获得指向GameViewController的指针?

        4
  •  0
  •   SurvivalMachine    4 年前

    下面是我如何在MetalKit应用程序中获得键盘输入而不需要子类化 MTKView .

    我实施了 keyDown 在GameViewController.mm中:

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

    在我的AppDelegate中。我打电话给你吗 [[ [myViewController view] window ] makeFirstResponder:myViewController]; 在里面 applicationDidFinishLaunching 哪里 myViewController 指向我的GameViewController实例。