Trò chơi cần quyền truy cập ở mức độ thấp vào đầu vào bàn phím. Trên Windows, có DirectInput. Nhưng các nhà phát triển trò chơi Mac OS X sử dụng công nghệ nào?Trò chơi Mac OS X có thể nhận các sự kiện nhập bàn phím cấp thấp như thế nào?
Rõ ràng, có đủ trò chơi Mac mà có được bàn phím đầu vào vừa phải, nếu không có sự hạn chế của các giải pháp thường được gọi:
Giải pháp # 1: Use keyUp/keyDown events
-(void)keyUp:(NSEvent*)event;
-(void)keyDown:(NSEvent*)event;
nhược điểm Inacceptable: keyDown các sự kiện được lặp lại dựa trên cài đặt tùy chọn hệ thống cho "tốc độ lặp lại chính" và "độ trễ lặp lại chính". Điều này gây ra một sự kiện keyDown ban đầu theo sau bởi một tạm dừng trước khi nó bắt đầu lặp lại với tốc độ được xác định bởi một thiết lập tùy chọn hệ thống. Không thể sử dụng giải pháp này cho các sự kiện quan trọng liên tục.
Tôi tự hỏi liệu hành vi lặp lại chính có thể bị vô hiệu hóa không? Tôi cho rằng bạn có thể đọc khóa keyDown đầu tiên, sau đó nhớ trạng thái "key with keyCode x is down" trong lớp của bạn cho đến khi nhận được sự kiện keyUp cho khóa đó, do đó bỏ qua sự chậm trễ lặp lại và các vấn đề về tốc độ lặp lại.
Giải pháp # 2: Use Quarts Event Taps
Xem Quartz Event Services Reference. Nó dường như đủ thấp.
Hạn chế không thể chấp nhận: yêu cầu bật thiết bị hỗ trợ trong tùy chọn hệ thống trong Universal Access - Bàn phím. Mặc dù điều này có thể được bật theo mặc định, không có gì đảm bảo rằng nó có thể bị tắt trên một số hệ thống.
Tôi cũng đọc rằng các sự kiện Quartz yêu cầu ứng dụng chạy dưới dạng gốc, nhưng không tìm thấy xác nhận nào cho điều này.
Giải pháp # 3: Carbon Events/IOKit HID
Các Carbon Event Manager Reference được đánh dấu là di sản và không nên được sử dụng cho sự phát triển mới.
Hạn chế không thể chấp nhận: không ai biết sự kiện Carbon sẽ tiếp tục được hỗ trợ trong các phiên bản Mac OS trong tương lai.
Ngoài Carbon là một khung kế thừa, điều này vẫn có vẻ là giải pháp tốt nhất. Nhưng có bất kỳ hạn chế nào khác đối với việc sử dụng Sự kiện Carbon không?
Câu hỏi:
Những công nghệ làm Mac OS X phát triển game sử dụng để tiếp nhận các sự kiện bàn phím đầu vào ở mức độ thấp? Nếu họ sử dụng một trong những công nghệ trên, làm thế nào để họ làm việc xung quanh những hạn chế tôi đã đề cập?
UPDATE:
tôi cuối cùng đã quay sang sử dụng các thông điệp NSEvent thường xuyên và bọc chúng trong một neat API for polling the keyboard states.
Tại sao hành vi lặp lại cho khóaDown: không được chấp nhận? Bạn không thể bỏ qua các sự kiện bổ sung cho đến khi bạn nhận được một keyUp ;? – Flyingdiver
Tôi không thực sự biết giải pháp tốt nhất là gì nhưng liên quan đến nhược điểm của giải pháp # 1 - 'NSEvent' có phương thức' isARepeat' để xác định xem sự kiện có phải là kết quả của sự lặp lại khóa tự động hay không. Bạn có thể đơn giản bỏ qua chúng và giả sử khóa được nhấn liên tục cho đến khi bạn nhận được một sự kiện 'keyUp:' tương ứng. – omz
Tôi đã thêm điều này làm ghi chú cho giải pháp # 1. Những gì tôi đã hy vọng cho là một khuôn khổ cho các nhà phát triển trò chơi mà chỉ đơn giản là sẽ cho phép bạn gọi một phương pháp như isKeyDown: (UInt16) virtualKeyCode. – LearnCocos2D