Menghapus penundaan saat tombol mulai ditekan

11

Saya membuat game sederhana, dan salah satu masalah yang saya temui adalah keterlambatan yang mengganggu ketika menekan tombol terus menerus.

Jadi pada dasarnya, ketika saya menekan (untuk waktu yang sangat lama) misalnya Up, objek saya akan bergerak 1 unit ke atas, tidak bergerak (sekitar 1 detik), dan kemudian bergerak terus menerus 1 unit ke atas (tanpa penundaan).

Saat ini, saya menggunakan ini untuk memindahkan objek (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
    }
}

Yang ingin saya miliki adalah menghapus penundaan, sehingga objek dapat segera bergerak Upsangat cepat. Apakah ada cara untuk melakukan ini?

Rakete1111
sumber

Jawaban:

19

Dengan menunggu peristiwa key-down untuk dipecat, Anda mungkin pada belas kasihan tingkat pengulangan acara utama bahwa kontrol OS (dan yang pengguna dapat menentukan sendiri).

Sebagai gantinya, Anda mungkin ingin menelepon SDL_GetKeyboardStatedi bagian atas loop pembaruan game Anda (bagian dari pembaruan yang terjadi pada setiap frame, terlepas dari ada atau tidaknya suatu acara) untuk mendapatkan status keyboard dan memeriksa untuk melihat apakah up kunci turun atau tidak selama frame individu.


sumber
Bukankah lebih baik mendengarkan pesan jendela? Menggunakan polling, saya terkadang kehilangan penekanan tombol yang sangat pendek dan masalah ini menjadi lebih buruk ketika framerate rendah.
Roy T.
@ Roy. Itu benar-benar tergantung pada gim Anda dan jenis tindakan yang ingin Anda picu dengan kuncinya. Jika penekanan tombol adalah satu hal, Seperti kunci "aksi", yang menutup dialog, maka antrian pesan adalah pendekatan yang tepat - Anda ingin mendengarkan acara atom. - Jika di lain pihak, status kunci mewakili keadaan berkelanjutan seperti kunci "pindahkan", logikanya biasanya while key UP is down move 30 units per second- dan per detik hanya masuk akal bila Anda memiliki waktu yang terukur antara tombol turun dan naik - biasanya lebih dari satu bingkai.
Falco
@ Roy. Anda juga dapat mendengarkan pesan (dan menggunakannya untuk memperbarui larik keadaan keyboard Anda sendiri); Saya memilih untuk menyarankan pendekatan ini karena kesederhanaannya. Anda tentu dapat menulis jawaban lain. Bagian yang penting adalah hanya menghindari mengandalkan pesan OS untuk memeriksa apakah kunci terus turun, karena itulah yang membuat Anda ke tingkat pengulangan kunci OS.
Dan maksud Anda adalah centang permainan, bukan bingkai video, bukan? Karena kita tidak sedang bermain dan menyandikan logika game di render loop. :-)
corsiKa
@ JoshPetrie Saya sepenuhnya setuju, hanya ingin menunjukkan peringatan kecil ini jika Anda perlu memeriksa 'klik' alih-alih 'tekan'. :)
Roy T.
10

Cara alternatif (pendekatan Josh juga hebat!) Adalah dengan memasang boolean SDL_KEYDOWN, dan mungkin juga mengabaikan semua peristiwa penting yang berulang. Itu bisa Anda lakukan dengan memeriksa repeatanggota acara utama.

Kemudian Anda bisa menerapkan timer Anda sendiri, yang tidak harus mewah, dan menerapkan pengulangan kunci Anda sendiri. Anda bisa memicu tindakan langsung dari penghitung waktu, atau bahkan menghasilkan SDL_KEYDOWNacara, dan menyatukan solusinya.

Tyyppi_77
sumber