2008-11-08 16 views
11

Hackuję na prostej aplikacji Cocoa, aby bloki poruszały się po ekranie jak gra wideo. Potrzebuję wykryć naciśnięcia klawiszy, ale nie będę miał pól wprowadzania tekstu, jak to miało miejsce w oknie dialogowym.Jak mogę zebrać kluczowe dane wejściowe w aplikacji Cocoa w stylu gry wideo?

Jak uzyskać naciśnięcia przycisków bez elementów sterujących tekstem? W szczególności potrzebuję klawiszy strzałek.

+1

Właśnie zobaczyłem twoją zmianę, więc zaktualizowałem swoją odpowiedź, pokazując klawisze strzałek :) HTH, J –

Odpowiedz

14

W widoku gry, określenie metod keyUp i keyDown:

@interface MyView : NSView 
-(void)keyUp:(NSEvent*)event; 
-(void)keyDown:(NSEvent*)event; 
@end 

@implementation MyView 

-(void)keyUp:(NSEvent*)event 
{ 
    NSLog(@"Key released: %@", event); 
} 

-(void)keyDown:(NSEvent*)event 
{ 
    // I added these based on the addition to your question :) 
    switch([event keyCode]) { 
     case 126: // up arrow 
     case 125: // down arrow 
     case 124: // right arrow 
     case 123: // left arrow 
      NSLog(@"Arrow key pressed!"); 
      break; 
     default: 
      NSLog(@"Key pressed: %@", event); 
      break; 
    } 
} 
@end 

Zobacz dokumentację NSView i NSEvent aby uzyskać więcej informacji. Zauważ, że zdarzenia keyDown i keyUp są faktycznie zdefiniowane na NSResponder, super klasie dla NSView.

+3

Należy zwrócić uwagę na to, że keyUp: i keyDown: nie są wywoływane, jeśli użytkownik naciśnie tylko klawisz modyfikujący, taki jak shift, ctrl, alt lub cmd. Jest to oczywiście rozsądne zachowanie dla większości aplikacji, ale być może nie dla gier. Jeśli chcesz, aby aplikacja otrzymywała powiadomienia po naciśnięciu klawisza modyfikującego, możesz zaimplementować [flagsChanged:] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference /Reference.html#//apple_ref/occ/instm/NSResponder/flagsChanged :). – sarnesjo

+0

Zobacz także [acceptsFirstResponder] (http://stackoverflow.com/questions/7475394/nsopenglview-nswindow-nsresponder-makefirstresponder-not-working) –

Powiązane problemy