2008-11-08 6 views
11

Je pirate une simple application Cocoa pour faire bouger les blocs autour de l'écran comme un jeu vidéo. J'ai besoin de détecter les pressions de touches, mais je ne vais pas avoir de champs de saisie de texte comme une boîte de dialogue.Comment puis-je collecter des données clés dans une application Cocoa de style jeu vidéo?

Comment puis-je obtenir des touches sans contrôles de texte? En particulier, j'ai besoin de touches fléchées.

+1

Je viens de voir votre modification, donc j'ai mis à jour ma réponse pour montrer les flèches :) HTH, J –

Répondre

14

Dans votre vue du jeu, définir les méthodes keyUp et 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 

Voir la documentation NSView et NSEvent pour plus d'informations. Notez que les événements keyDown et keyUp sont en fait définis sur NSResponder, la super classe pour NSView.

+3

Quelque chose à noter, est ce keyUp: et keyDown: ne sont pas appelés si l'utilisateur appuie seulement sur une touche de modification, comme shift, ctrl, alt ou cmd. Ceci est bien sûr un comportement raisonnable pour la plupart des applications, mais peut-être pas pour les jeux. Si vous souhaitez que votre application soit avertie lorsqu'une touche de modification est enfoncée, vous pouvez implémenter [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

Voir aussi [acceptsFirstResponder] (http://stackoverflow.com/questions/7475394/nsopenglview-nswindow-nsresponder-makefirstresponder-not-working) –

Questions connexes