Bagaimana cara mengidentifikasi klik mouse dan mouse di game?


8

Apa cara paling umum menangani klik mouse di game?

Mengingat semua yang Anda miliki dengan cara mendeteksi input dari mouse adalah apakah sebuah tombol naik atau turun.

Saat ini saya hanya mengandalkan mouse sebagai klik, tetapi pendekatan sederhana ini sangat membatasi saya dalam apa yang ingin saya capai. Misalnya saya memiliki beberapa kode yang hanya boleh dijalankan sekali pada klik mouse, tetapi menggunakan mouse ke bawah sebagai klik mouse dapat menyebabkan kode untuk menjalankan lebih dari sekali tergantung pada berapa lama tombol ditekan untuk. Jadi saya harus melakukannya dengan sekali klik!

Tapi apa cara terbaik untuk menangani klik? Adalah klik ketika mouse bergerak dari mouse ke atas atau dari bawah ke atas atau apakah itu klik jika tombolnya kurang dari x frame / milidetik dan kemudian jika demikian, apakah itu dianggap mouse ke bawah dan klik jika itu ke bawah untuk frame x / milidetik atau klik lalu tetikus ke bawah?

Saya bisa melihat bahwa masing-masing pendekatan dapat memiliki kegunaannya tetapi yang mana yang paling umum dalam game? Dan mungkin saya akan bertanya lebih spesifik mana yang paling umum di game RTS?


1
Anda berada di jalur yang benar. Tambahkan sesuatu tentang itu mouse ke bawah dan mouse ke atas keduanya harus dekat satu sama lain (atau di dalam batas objek diklik) dan Anda sudah mendapatkannya. Mengklik tombol, lalu menarik keluar, lalu melepaskan tombol bukanlah klik mouse. Tetapi mengklik tombol dan melepaskan ke mana saja di tombol adalah klik mouse.
Tim Holt

Jawaban:


12

Anda berada di jalur yang benar dengan mencari tahu kapan mouse beralih dari bawah ke atas dan menulis pawang untuk itu. Untuk banyak gim, cukup baik memperlakukan acara mouseUp sebagai klik.

Bergantung pada gim Anda, Anda mungkin ingin menangani kedua acara - misalnya, dalam RTS, Anda mungkin ingin memasukkan pemilihan kotak seret serta pemilihan satu klik. Perbedaannya adalah dalam menentukan berapa lama mouse dalam kondisi Down sebelum dirilis.

(Ya, pada dasarnya Anda menjawab pertanyaan Anda sendiri)


2
Seperti komentator lain tunjukkan, Anda mungkin juga ingin memeriksa bahwa target yang sama ditunjukkan pada mouseDown dan mouseUp ketika bekerja dengan satu klik.
Bill

Saya tidak yakin. Misalnya, Tombol Windows tidak peduli di mana mouse berada di mouse ke bawah, selama tombol menerima acara mouse ke atas. Mungkin sistem operasi lain lebih peduli.
John McDonald

@ John McD Ini bukan persyaratan teknis seperti "mencari tahu apa yang sebenarnya dimaksudkan pengguna untuk mengklik".
Bill

1
@ John McD. itu tidak benar. Tekan tombol mouse di suatu tempat di desktop Anda, gerakkan kursor ke Start Menu, dan lepaskan - apakah Start Menu muncul? Bukan untuk saya.
Kylotan

@Kylotan, Anda akan benar, meskipun menu "tombol" berperilaku berbeda dari semua tombol standar lainnya. Sepertinya tombol standar di windows sebenarnya membutuhkan mouse ke bawah dan mouse ke atas, meskipun mouse Anda dapat bergerak di luar batas tombol di antara keduanya. Minimalkan, Maksimalkan, dan Tutup semua pekerjaan seperti ini, serta tombol normal di dalam aplikasi. Tetapi harap dicatat bahwa tidak ada tindakan yang terjadi (kecuali dengan tombol start) sampai tombol mouse dilepaskan, orang-orang seperti saya akan melihat. Lagi pula ... Bill benar, itu turun ke persyaratan.
John McDonald

4

Tidak ada yang 'terbaik' - Anda membutuhkan semuanya.

Jika saya menembakkan senjata, saya tidak ingin menunggu mouse dilepaskan untuk memicu efek tembakan senjata. Dan jika Anda menyeret sebuah kotak di sekitar sekelompok unit, Anda memulai aksi seret pada mouse-down.

Di sisi lain, jika saya mengklik item GUI maka saya ingin menunggu klik penuh karena itulah yang biasa saya lakukan.

Jadi, Anda mungkin harus menerapkan mouse ke bawah, mouse ke atas, tarik mouse (mouse ke atas di tempat yang berbeda secara signifikan ke mouse ke bawah) dan dan klik mouse (mouse ke atas di tempat yang sama dengan mouse ke bawah), dan menghubungkan mereka ke bagian-bagian permainan Anda sebagai Anda mau.


1

Cara sebagian besar sistem windowing menanganinya, serta gim yang telah saya kerjakan (dan sebagian harus saya implementasikan sendiri) adalah memiliki sedikit pada setiap tombol yang mendeteksi jika mouse memasuki keadaan mouse di atas tombol yang diberikan. Ini hanya mengatur bingkai bahwa mouse turun dan hanya dibersihkan ketika tombol mouse dilepaskan. Jika dan hanya jika mouse dilepaskan di atas tombol dan bit diatur, kemudian jalankan acara yang diklik tombol.

(Anda mungkin juga menginginkan bendera yang diset true ketika bit diatur dan mouse melayang di atas tombol Anda, sehingga Anda dapat mengubah tombol untuk menggunakan tekstur yang ditekan alih-alih yang normal.)

Ini adalah skema dasar di balik sebagian besar tombol. Silakan dan temukan prompt dialog. Tekan tombol batal tapi jangan lepaskan. Tombol menjadi tertekan saat mouse berada di atasnya, dan kembali normal jika mouse Anda berhenti melayang di atasnya, tetapi akan kembali ditekan jika Anda bergerak kembali. Itu hanya menjalankan aksinya jika Anda melepaskan dan Anda mengatasinya. Jangan gunakan hitungan milidetik, itu sebagian besar hanya untuk mendeteksi klik ganda dalam ambang Anda.

(dan jika Anda benar-benar ingin berkhayal, ada acara yang dapat Anda hubungkan ke masing-masing transisi tersebut. mis. MouseOver saat masuk, dan saat keluar, MouseDown masuk / keluar, masuk / keluar MouseUp, masuk / keluar MouseClicked masuk / keluar, dll. )


1

Tombol mouse dan tombol keyboard dapat memiliki sejumlah acara yang berbeda, apa yang tersedia tergantung pada pilihan bahasa / pustaka Anda, yang paling umum:

Kunci ke bawah, terpicu ketika tombol ditekan.
Mengunci, memicu ketika tombol dilepaskan.
Tombol terbelakang, terpicu ketika tombol ditekan, dan kemudian dinyalakan berulang kali pada beberapa interval tergantung sistem hingga kunci dilepaskan.

Selain itu, mungkin ada panggilan untuk memberi tahu apakah kunci sedang ditekan atau tidak.

Penting bagi Anda untuk mengetahui dengan tepat alat apa yang Anda gunakan, paling umum Anda akan membutuhkan keduanya terlebih dahulu, jika tidak tersedia, buatlah dari apa pun yang tersedia.

Metode standar untuk mendaftar bahwa tombol di layar ditekan menggunakan mouse adalah untuk menyatakan bahwa tombol yang sama diarahkan pada acara turun dan naik. Namun bagi banyak elemen gim ini mungkin terlalu lambat, jadi untuk banyak aksi mungkin bijaksana untuk mewujudkannya di acara turun.


0

XOr dapat menjadi teman Anda dalam situasi ini.

bool oldIsButtonUp = true;

void pollMouse(bool isButtonUp) {
    if ((oldIsButtonUp ^ isButtonUp) && isButtonUp) {
        sendMouseClickEvent();
    }
    oldIsButtonUp = isButtonUp;
}

Ini akan memanggil sendMouseClickEvent () setiap kali kondisi tombol mouse berubah dari false menjadi true.


4
Atau, agar tidak membuat seorang programmer membuat truthtable di (nya?) Kepala: if (!oldIsButtonUp && isButtonUp) {.
deceleratedcaviar

-1

Versi XNA dari kode ini akan seperti (disederhanakan hanya untuk mendeteksi peristiwa mouse down, untuk mendeteksi klik dua kali Anda akan membutuhkan sesuatu yang lebih canggih);

MouseState previousMouseState; 
protected override void Initialize() 
{ 
    // TODO: Add your initialization logic here 
    //store the current state of the mouse 
    previousMouseState = Mouse.GetState(); 
} 


protected override void Update(GameTime gameTime) 
{ 
    // .. other update code 


    //is there a mouse click? 
    //A mouse click begins if the button goes from a released state 
    //in the previous frame  to a pressed state  
    //in the current frame 
    if (previousMouseState.LeftButton == ButtonState.Released  
        && Mouse.GetState().LeftButton == ButtonState.Pressed) 
    { 
        //do your mouse click response... 

    } 

    //save the current mouse state for the next frame 
    // the current  
    previousMouseState = Mouse.GetState(); 

    base.Update(gameTime); 
} 

Terlepas dari ini adalah kode untuk MouseUp, bukan MouseClick - Seberapa sering pembaruan melakukan? Apa yang akan terjadi jika sebuah klik lebih pendek dari waktu permainan Anda?
Kromster

tergantung pada gim tetapi dalam pembaruan XNA terjadi sekitar 60fps secara default. Akan sangat sulit untuk menekan DAN melepaskan tombol mouse dalam kerangka waktu ini.
Ken

Sebenarnya, ini adalah kode untuk mendeteksi peristiwa mouse down.
Ken

Saya gagal melihat jawaban aktual untuk pertanyaan aktual dalam sampel kode XNA abstrak ini
Kromster

Terima kasih atas koreksi, saya melakukan tes kecil dan Klik memang mengambil 16-100 ms yang sedikit lebih panjang pembaruan. Namun saya tidak akan mendorong pemrosesan input dalam loop Pembaruan untuk timestep bisa kurang dari 60fps, terutama tanpa antrian input.
Kromster
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.