Làm thế nào để có được thời gian trôi qua của phím nhấn?


8

Tôi cần có khả năng xác định thời gian khóa được giữ với độ chính xác cao. Ví dụ: nếu khóa của họ gõ rất nhanh, nó có thể báo cáo thời gian ít hơn thời gian cho mỗi khung cập nhật.


Dựa trên những nhận xét khác của bạn, tôi phải hỏi, liệu độ chính xác ~ 16ms có thực sự gây bất lợi cho trò chơi của bạn không? Gần như mọi trò chơi tôi từng làm đều không bận tâm đến đầu vào ở quy mô khung phụ. Có thể có một số điều khác khiến trò chơi cảm thấy tồi tệ (mà tôi cho là như vậy, nếu không thì tại sao bạn lại hỏi vậy?)
Tetrad

1
Bạn biết đấy, các trò chơi Mario không cần độ chính xác của khung phụ để tạo ra "tab nhanh cho nhảy thấp, nhấn hoàn toàn cho nhảy cao". Tốt hơn nên thêm một vectơ gia tốc cho 2-3 khung hình đầu tiên của bước nhảy.
Kyte


@Andrew Russel: đó nên là câu trả lời.
Michael Coleman

Câu trả lời:


4

Bạn có thể nắm bắt đầu vào bằng cách sử dụng lớp System.Windows.Forms.NativeWindow. Bạn sẽ nhận được thông báo khi một sự kiện đầu vào xảy ra. Bằng cách đó, bạn sẽ được thông báo nhanh nhất có thể ngay khi nó xảy ra, cho phép bạn ghi lại thời gian với độ chính xác cao hơn. Nó nhận được loại lộn xộn (mã gốc / không an toàn), nhưng nó hoạt động.

Tôi nghĩ rằng điều này chỉ hoạt động trên các cửa sổ, nhưng tôi nghĩ đó là nền tảng mà bạn nhắm mục tiêu (không cần điều này trên Xbox và WP7).

Đây là một ví dụ tốt (từ khung nuclex): WindowInputCapturer (lưu ý: mã này có thể đã được cập nhật gần đây và tôi đã không mã hóa nó)

Chỉnh sửa: Điều này cũng cho phép bạn lấy mã ký tự của phím bấm. Điều này có thể hữu ích cho việc nhập văn bản (đặc biệt là những thứ như ký tự Latinh) Tôi không chắc tại sao bạn cần phải nhập dữ liệu với độ chính xác cao như vậy, nhưng theo tôi thì đây là một cách tốt để làm điều đó.


2

XNA là một khung dựa trên vòng lặp, không phải là khung dựa trên sự kiện. Nếu bạn cần thời gian chính xác xảy ra một sự kiện, hãy xem xét một dự án winforms (một dự án dựa trên sự kiện) và kết nối XNA với một điều khiển nếu cần thiết để kết xuất.


1

Lưu trữ trạng thái khóa thành một biến và so sánh trên vòng lặp tiếp theo với trạng thái khóa hiện tại. Tạo một DateTimeđối tượng để giữ bắt đầu và bạn có thể so sánh với DateTime.Nowkhi trạng thái khóa trước không khớp.

Ví dụ rất đơn giản về những gì tôi muốn nói:

   if(currentKeyboardState.IsKeyDown(Keys.Space)
      && !previousKeyboardState.IsKeyDown(Key.Space))
      { DateTime startTime = DateTime.Now; }
    ...
    if(!currentKeyboardState.IsKeyDown(Keys.Space)
      && previousKeyboardState.IsKeyDown(Key.Space))
      { TimeSpan elapsedTime = DateTime.Now - startTime; }

Tôi đặc biệt yêu cầu một cái gì đó có thể cho tôi thời gian ít hơn thời gian cho mỗi lần cập nhật. Câu trả lời của bạn sẽ chỉ cho tôi thời gian với mức tăng 16ms.
Tấn

1
Vì vậy, chạy nó trong chủ đề riêng của nó. XNA không có trình xử lý sự kiện để thay đổi bàn phím.
Riv_rec

DateTime. Tuy nhiên, độ phân giải kém hơn bản cập nhật. Hãy thử Đồng hồ bấm giờ.
Kyte

0

Tôi không biết bất kỳ cách chính thức nào để làm điều này, bạn có thể chạy một luồng thứ hai trong một vòng lặp rất chặt chẽ chỉ để kiểm tra đầu vào và gửi cái này đến một bộ đệm tròn đủ lớn để yêu cầu rất ít đồng bộ hóa giữa các luồng.

(Lưu trữ một số loại tăng số trong từng vị trí của bộ đệm và cập nhật SAU chủ đề đã ghi tất cả dữ liệu, sau đó tiếp tục đọc các vị trí có dữ liệu từ bộ đệm cho đến khi số giảm (đừng quên kiểm tra số tràn!))


0

Nếu bạn cập nhật ba mươi lần mỗi giây, con người sẽ không thể nhấn phím nhanh hơn bạn có thể lấy mẫu trạng thái bàn phím. Nếu bạn cập nhật chậm hơn con người có thể gõ, thì bạn có thể cần một luồng để kết xuất đồ họa và một luồng khác để đọc và phản hồi với bàn phím / chuột.

Nhưng, nếu bạn cập nhật chậm hơn con người có thể gõ, thì bạn cũng không thể cung cấp phản hồi trực quan cho mỗi lần nhấn phím. Điều này không quan trọng nếu ý tưởng là hiển thị phản hồi tổng hợp, chẳng hạn như thời gian trung bình giữa các lần nhấn phím.


Tôi không bao giờ nói bất cứ điều gì về gõ. Tôi muốn biết thời gian một phím được nhấn xuống, mili giây chính xác.
Tấn

Và thực tế, một con người có thể gõ với tốc độ hơn 30 phím mỗi giây nhưng chỉ trong một vài phím, không phải là một tốc độ duy trì.
Tấn

Nếu bạn cập nhật sáu mươi lần mỗi giây, bạn có độ chính xác đến 16ms. Độ chính xác nào bạn yêu cầu, và tại sao?
bmcnett

Đối với chuyển động của người chơi, tôi muốn người dùng có thể chạm một lần nhanh chóng và khiến người chơi di chuyển ít hơn 1 lần nhấn.
Tấn

@AttackingHobo Bạn có thể không sử dụng các phương trình chuyển động cho việc này không? Trong khi nó giữ áp dụng một vectơ gia tốc cho một vectơ vận tốc? Càng giữ lâu, vận tốc càng cao?
Ray Dey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.