2008-11-08 8 views
11

Tôi đang hack trên một ứng dụng Cocoa đơn giản để làm cho các khối di chuyển xung quanh màn hình như trò chơi điện tử. Tôi cần phát hiện các lần nhấn phím, nhưng tôi sẽ không có các trường nhập văn bản giống như một hộp thoại sẽ có.Làm cách nào để thu thập thông tin nhập chính trong ứng dụng Cocoa kiểu trò chơi điện tử?

Làm cách nào để nhận các lần nhấn phím mà không có điều khiển văn bản? Đặc biệt, tôi cần lấy các phím mũi tên.

+1

Tôi vừa xem bản chỉnh sửa của bạn để tôi cập nhật câu trả lời để hiển thị các phím mũi tên :) HTH, J –

Trả lời

14

Theo quan điểm của trò chơi của bạn, xác định các phương pháp KeyUp và 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 

Xem tài liệu cho NSViewNSEvent để biết thêm. Lưu ý rằng các sự kiện keyDown và keyUp thực sự được xác định trên NSResponder, lớp siêu cho NSView.

+3

Điều cần lưu ý là keyUp: và keyDown: không được gọi nếu người dùng chỉ nhấn phím bổ trợ, chẳng hạn như shift, ctrl, alt hoặc cmd. Đây là hành vi hợp lý của khóa học cho hầu hết các ứng dụng, nhưng có thể không dành cho trò chơi. Nếu bạn muốn ứng dụng của mình được thông báo khi nhấn phím bổ trợ, bạn có thể triển khai [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

Xem thêm [acceptFirstResponder] (http://stackoverflow.com/questions/7475394/nsopenglview-nswindow-nsresponder-makefirstresponder-not-working) –