Loại bỏ độ trễ khi bắt đầu nhấn phím


11

Tôi đang tạo một trò chơi đơn giản và một trong những vấn đề tôi gặp phải là sự chậm trễ khó chịu khi nhấn phím liên tục.

Vì vậy, về cơ bản, khi tôi nhấn (trong một thời gian rất dài) chẳng hạn Up, đối tượng của tôi sẽ di chuyển 1 đơn vị lên, không di chuyển (trong khoảng 1 giây), sau đó di chuyển liên tục 1 đơn vị lên (không có bất kỳ độ trễ nào).

Hiện tại, tôi sử dụng điều này để di chuyển đối tượng (SDL2):

while (SDL_PollEvent(&event))
{
    switch (event.type)
    {
    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        {
        case SDLK_UP:
            //Move object 1 unit up
            break;
        //Other unrelated things omitted
        }
        break;
    //Omitted other cases
    }
}

Những gì tôi muốn có là loại bỏ sự chậm trễ, để đối tượng có thể ngay lập tức di chuyển Uprất nhanh. Có cách nào để làm điều này?

Câu trả lời:


19

Bằng cách chờ đợi các sự kiện khóa xuống được kích hoạt, bạn có thể sẽ phải chịu tỷ lệ lặp lại sự kiện chính mà HĐH kiểm soát (và người dùng có thể tự chỉ định).

Thay vào đó, bạn có thể muốn gọi SDL_GetKeyboardStateở đầu vòng lặp cập nhật trò chơi của mình (phần cập nhật xảy ra ở mọi khung hình, cho dù có sự kiện nào xảy ra hay không) để lấy trạng thái của bàn phím và kiểm tra xem liệu có lên không phím có bị hỏng hay không trong bất kỳ khung riêng lẻ nào.


Sẽ không tốt hơn để nghe tin nhắn cửa sổ? Sử dụng bỏ phiếu đôi khi tôi bỏ lỡ các phím bấm rất ngắn và vấn đề này trở nên tồi tệ hơn khi tốc độ khung hình thấp.
Roy T.

@RoyT. Nó thực sự phụ thuộc vào trò chơi của bạn và loại hành động bạn muốn kích hoạt bằng phím. Nếu bấm phím là một lần, như phím "hành động", đóng hộp thoại thì hàng đợi tin nhắn là cách tiếp cận phù hợp - bạn muốn nghe một sự kiện nguyên tử. - Mặt khác, trạng thái khóa đại diện cho trạng thái đang diễn ra như phím "di chuyển", logic thường là while key UP is down move 30 units per second- và mỗi giây chỉ có ý nghĩa khi bạn có thời gian đo được giữa phím xuống và lên - thường là nhiều hơn một khung.
Falco

@RoyT. Bạn cũng có thể nghe tin nhắn (và sử dụng chúng để cập nhật mảng trạng thái bàn phím của riêng bạn); Tôi đã chọn đề xuất phương pháp này vì đơn giản. Bạn chắc chắn có thể viết một câu trả lời khác mặc dù. Phần quan trọng là để tránh phụ thuộc vào các thông báo của HĐH để kiểm tra xem khóa có bị hỏng liên tục hay không, bởi vì đó là yếu tố khiến bạn phải theo tốc độ lặp lại của khóa OS.

Và theo khung bạn có nghĩa là đánh dấu trò chơi, không phải khung hình video, phải không? Bởi vì chúng tôi không phải là plebs và mã hóa logic trò chơi trong vòng lặp kết xuất. :-)
corsiKa

@JoshPetrie Tôi hoàn toàn đồng ý, chỉ muốn chỉ ra cảnh báo nhỏ này nếu bạn cần kiểm tra 'nhấp chuột' thay vì 'nhấn'. :)
Roy T.

10

Một cách khác (cách tiếp cận của Josh cũng rất tuyệt!) Sẽ là thiết lập một boolean trên SDL_KEYDOWNvà cũng có thể bỏ qua tất cả các sự kiện quan trọng lặp đi lặp lại. Điều đó bạn có thể làm bằng cách kiểm tra repeatthành viên của sự kiện quan trọng.

Sau đó, bạn có thể thực hiện bộ đếm thời gian của riêng mình, điều này không phải là bất cứ điều gì lạ mắt và thực hiện việc lặp lại chính bản thân bạn. Bạn có thể kích hoạt hành động trực tiếp từ bộ đếm thời gian hoặc thậm chí tạo SDL_KEYDOWNsự kiện và thống nhất các giải pháp.

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.