Sabtu, 02 Juli 2011

OpenGL Keyboard Interaksi (Versi 2.0)

Pengenalan


Keyboard adalah salah satu hal yang penting untuk game komputer, dan menggunakan komputer secara umum. Bisakah Anda bayangkan mencoba untuk mengetik dengan mouse? Atau jumlah tombol yang akan diperlukan pada mouse untuk memungkinkan pergerakan * dan * memotret di First Person Shooter? Kabar baiknya adalah bahwa keyboard interaksi, berkat GLUT, adalah hal yang sangat mudah untuk menangani. Saya akan melihat 2 GLUT yang berbeda metode untuk menekan tombol, satu untuk ketika tombol pertama ditekan, dan satu untuk ketika tombol dilepaskan. Kemudian saya akan menunjukkan bagaimana untuk melakukan beberapa penyangga kunci untuk memungkinkan penekanan tombol sekaligus.

Coding

Tekan tombol


Untuk memulai dengan keyboard, sama seperti kami menciptakan tampilan dan membentuk metode untuk GLUT untuk digunakan, kita akan perlu membangun metode .Yang pertama metode kita akan berurusan dengan adalah menekan tombol metode , inimetode yang akan memberitahu kita yang saat ini tombol ditekan.

Saya akan nama ini metode keyPressed dan menyatakan GLUT bahwa ia memiliki 3 parameter, satu untuk kunci yang saat ini ditekan, dan dua lagi yang memberikan kita lokasimouse saat kunci itu ditekan

  1. kekosongan keyPressed (unsigned arang kunci, int x, int y) {
  2. }

Sekarang kita telah kosong metode , mari kita pergi ke depan dan memberikan ini informasiuntuk GLUT untuk digunakan. Down di utama kami metode , kita akan mengakses glutKeyboardFunc metode dan pasokan dengan kami metode .

  1. glutKeyboardFunc (keyPressed); / / Katakan GLUT untuk menggunakan metode "keyPressed" untuk penekanan tombol

Dan itu cukup banyak semua ada untuk itu.

Dalam rangka untuk akses yang mereka tombol ditekan, di dalam keyPressed Anda metodeAnda dapat menggunakan salah pernyataan switch atau 'jika' pernyataan, yang memeriksa mereka variabel kunci terhadap karakter ASCII yang ingin Anda periksa , dan akan terlihat seperti ini:

  1. Jika (tombol == 'a') { / / Jika mereka 'sebuah' tombol ditekan
  2. / / Lakukan tindakan yang terkait dengan 'a' kunci
  3. }

Tombol Up

Fungsi tombol register sampai ketika tombol dilepaskan. Ini dapat sangat berguna untuk pengaturan beberapa nilai ketika kunci pertama ditekan, dan ingin menjaga nilai itu sampai tombol dilepaskan. Sekali lagi, karena hal ini ditangani oleh GLUT, kita perlu pergi dan membuat metode untuk menangani hal ini, dan hanya seperti keyPressed metode , yang satu ini akan mengambil dalam 3 parameter. Ketiga parameter yang persis sama dengan 3 dalam keyPressed metode . Tapi kita akan menyebutnya metode keyup. Jadi mari kita pergi ke depan dan membuat metode untuk ini.

  1. kekosongan keyup (unsigned arang kunci, int x, int y) {
  2. }

Dan sekali lagi kita perlu mendaftarkan metode dengan GLUT, dan kali ini kita akan menggunakan glutKeyboardUpFunc metode .

  1. glutKeyboardUpFunc (keyup); / / Katakan GLUT untuk menggunakan metode "keyup" sampai kunci peristiwa

Untuk menggunakan keyup metode , persis sama dengan menggunakan keyPressedmetode , sehingga kita dapat memanggil kode yang sama persis jika kita ingin.

  1. jika (tombol == 'a' ) { / / Jika mereka 'sebuah' kunci dirilis
  2. / / Lakukan tindakan yang terkait dengan 'a' kunci
  3. }

Kunci Buffer

Langkah berikutnya adalah tentu saja , untuk melakukan beberapa penyangga utama, yang akan memungkinkan kita untuk menangani penekanan tombol beberapa di kemudian kamiOpenGL proyek. Seperti yang Anda mungkin menyadari, variabel char adalah sama dengan byte dan dapat mengambil nilai integer dari 0 hingga 255. Hal ini karena variabel arang memiliki ukuran 2, ^ 8 atau 256. Hal ini memungkinkan kita untuk menangani hingga 256 tombol berbeda pada keyboard, atau set karakter ASCII seluruh.

Jadi mari kita mulai dengan menciptakan sebuah array dari nilai Boolean yang akan memegang negara-negara kunci kami. Benar akan ditekan, dan False akan tidak ditekan.Aku akan menyebutnya keyStates variabel karena mudah dimengerti.

  1. bool * keyStates = baru bool [256]; / / Membuat sebuah array nilai boolean panjang 256 (0-255)

Dan sekarang di keyPressed kami metode , mari kita tambahkan baris baru, yang akan menetapkan nilai dari kunci yang kita miliki ditekan. Ini hanya menetapkan posisi saat ini dalam array keyStates, pada posisi kunci saat ditekan, ke true.

  1. kekosongan keyPressed (unsigned arang kunci, int x, int y) {
  2. keyStates [key] = true ; / / Mengatur negara dari kunci saat ini untuk menekan
  3. }

Dan sekarang kita hanya perlu menambahkan hampir kode yang sama persis dengan keyup metode yang kita buat sebelumnya. Hanya saja kali ini, kita akan menetapkan keadaan kunci saat ini menjadi false, artinya tidak lagi ditekan.

  1. kekosongan keyup (unsigned arang kunci, int x, int y) {
  2. keyStates [key] = palsu ; / / Mengatur negara dari kunci saat ini untuk tidak ditekan
  3. }

Semua yang tersisa sekarang untuk kita untuk belajar adalah bagaimana untuk benar-benar menggunakan ini. Kabar baiknya adalah bahwa sekarang bahwa Anda memiliki kunciinformasi , Anda dapat menggunakannya namun Anda inginkan, Anda hanya perlu men-setup suatu tempat dalam kode Anda untuk mengelola ini. Aku akan pergi melalui contoh ini untuk Anda mulai.

Untuk melakukan hal ini, saya akan membuat yang lain metode , kali ini disebut keyOperations, di mana kita akan memeriksa yang tombol telah ditekan, dan kemudian melakukan tindakan mereka. Ini Metode tidak perlu kembali apa-apa, dan tidak perlu menerima parameter apapun. Hanya menyatakan sebelum Anda tampilan () metode , karena kita benar-benar akan menyebutnya dari kami menampilkan metode .

  1. kekosongan keyOperations ( batal ) {
  2. }

Dan seperti yang kita panggil ini dari kami menampilkan metode , maju dan menyebutnya dari awal sangat kami menampilkan metode , sebaiknya sebelum segala sesuatu yang lain.Alasan saya mengatakan menyebutnya sebelum segala sesuatu yang lain, adalah jika Anda menyebutnya setengah melalui render Anda, maka setengah dari membuat Anda akan terpengaruh oleh nilai-nilai diperbarui oleh penekanan tombol, dan setengah lainnya membuat Anda tidak akan terpengaruh, memberikan ketidakcocokan dan artefak mungkin.

  1. kekosongan layar ( kosong ) {
  2. keyOperations ();
  3. glClearColor (1.0f, 0.0f, 0.0f, 1.0f); / / Hapus latar belakang jendela "href =" http://www.swiftless.com/tutorials/opengl/ jendela . html " >jendela untuk merah
  4. ...
  5. }

Akhirnya, kita mengisi keyOperations kami metode dengan sejumlah besar jika laporan untuk memeriksa apakah tombol kita ingin ditekan, dan kemudian melakukan tindakan yang diperlukan.

  1. kekosongan keyOperations ( batal ) {
  2. jika (keyStates [ 'a' ]) { / / Jika 'a' tombol telah ditekan
  3. / / Lakukan 'a' operasi kunci
  4. }
  5. }

Tombol Khusus

Sementara semua di atas adalah sempurna baik untuk menggunakan penekanan tombol yang biasa, ada beberapa kunci Anda mungkin ingin menggunakan, misalnya, tombol panah, yang dapat diwakili berbeda pada beberapa sistem. Untungnya, GLUT memungkinkan kita untuk menggunakan kunci ini, asalkan kita sebut berbeda metode untuk glutKeyboardFunc. Sebaliknya, kita harus menggunakan glutSpecialFunc yang memeriksa penekanan tombol khusus. Sebagai contoh, jika kita ingin mengecek apakah panah kiri telah ditekan, kita dapat menggunakan GLUT_KEY_LEFT. Kabar terbaik adalah bahwametode yang Anda buat untuk menangani tombol khusus Anda, akan hampir identik dengan glutKeyboardFunc metode Anda buat sebelumnya. Di bawah ini adalah contoh penggunaan tombol khusus.

Pertama, membuat baru metode yang saya akan menelepon keySpecial, yang mengambil tiga parameter, semuanya menjadi nilai integer, pertama untuk tombol ditekan, dan dua detik adalah untuk posisi x dan y mouse di saat itu metode yang disebut. Dan kemudian menyebutnya metode utama kami dalam metode bersama dengan sisa penekanan tombol kita.

  1. kekosongan keySpecial ( int kunci, int x, int y) {
  2. }

Dan kemudian untuk fungsi untuk tombol khusus, menyatakan baru metode untuk menangani sampai acara untuk kunci khusus.

  1. kekosongan keySpecialUp ( int kunci, int x, int y) {
  2. }
  1. int main ( int argc, arang ** argv) {
  2. ...
  3. glutReshapeFunc (membentuk kembali); / / Katakan GLUT untuk menggunakan metode "membentuk kembali" untuk membentuk kembali
  4. glutKeyboardFunc (keyPressed); / / Katakan GLUT untuk menggunakan metode "keyPressed" untuk penekanan tombol
  5. glutKeyboardUpFunc (keyup); / / Katakan GLUT untuk menggunakan metode "keyup" untuk kejadian-kejadian kunci
  6. glutSpecialFunc (keySpecial); / / Katakan GLUT untuk menggunakan metode "keySpecial" untuk menekan tombol khusus
  7. glutSpecialUpFunc (keySpecialUp); / / Katakan GLUT untuk menggunakan metode "keySpecialUp" untuk kejadian-kejadian kunci khusus
  8. glutMainLoop (); / / Masukkan loop utama GLUT itu
  9. }

Jika Anda ingin untuk buffer kunci ini, Anda dapat membuat array lain sama seperti yang kami lakukan untuk buffering kunci biasa, dan mendedikasikan array ini untuk setiap tombol khusus ditekan.

  1. bool * keySpecialStates = baru bool [246]; / / Membuat sebuah array nilai boolean panjang 256 (0-255)

Setelah Anda membuat array ini, pastikan Anda menetapkan nilai-nilai ke benar dan palsu, seperti yang Anda lakukan dalam metode kunci biasa, dan kemudian membuat metode lain untuk mengendalikan apa yang terjadi ketika kita menekan tombol khusus kami, saya menelepon keySpecialOperations tambang, yang sudah memiliki kode untuk memeriksa apakah tombol panah kiri telah ditekan.

  1. kekosongan keySpecialOperations ( batal ) {
  2. jika (keySpecialStates [GLUT_KEY_LEFT]) { / / Jika tombol panah kiri telah ditekan
  3. / / Lakukan operasi tombol panah kiri
  4. }
  5. }

Mudah-mudahan ini telah membantu Anda mendapatkan pemahaman tentang bagaimana mengelola menekan kunci dalam GLUT dan OpenGL sehingga Anda bisa mendapatkan beberapa interaksi keyboard yang terjadi di tutorial selanjutnya.

Jika Anda memiliki pertanyaan, silakan email saya di swiftless@gmail.com

Tutorial Kode

  1. # Include
  2. # Include
  3. bool * keyStates = baru bool [256]; / / Membuat sebuah array nilai boolean panjang 256 (0-255)
  4. kekosongan keyOperations ( batal ) {
  5. jika (keyStates [ 'a' ]) { / / Jika 'a' tombol telah ditekan
  6. / / Lakukan 'a' operasi kunci
  7. }
  8. }
  9. kekosongan layar ( kosong ) {
  10. keyOperations ();
  11. glClearColor (1.0f, 0.0f, 0.0f, 1.0f); / / Hapus latar belakang jendela untuk merah
  12. glClear (GL_COLOR_BUFFER_BIT); / / Hapus buffer warna (buffer lebih di kemudian hari)
  13. glLoadIdentity (); / / Load Matrix Identitas untuk mereset lokasi gambar kami
  14. glFlush (); / / Bersihkan buffer OpenGL untuk jendela
  15. }
  16. kekosongan membentuk kembali ( int lebar, int tinggi) {
  17. glViewport (0, 0, (GLsizei), lebar (GLsizei) tinggi); / / Set viewport kita dengan ukuran jendela kita
  18. glMatrixMode (GL_PROJECTION); / / Beralih ke matriks proyeksi sehingga kita dapat memanipulasi bagaimana adegan kami dilihat
  19. glLoadIdentity (); / / Reset matriks proyeksi dengan matriks identitas sehingga kita tidak mendapatkan artefak (membersihkan)
  20. gluPerspective (60, (GLfloat) lebar / (GLfloat) tinggi, 1,0, 100,0); / / Set Bidang sudut pandang (dalam derajat), rasio aspek jendela kami, dan pesawat baru dan jauh
  21. glMatrixMode (GL_MODELVIEW); / / Beralih kembali ke matriks melihat model, sehingga kita dapat mulai menggambar bentuk dengan benar
  22. }
  23. kekosongan keyPressed (unsigned arang kunci, int x, int y) {
  24. keyStates [key] = true ; / / Mengatur negara dari kunci saat ini untuk menekan
  25. }
  26. kekosongan keyup (unsigned arang kunci, int x, int y) {
  27. keyStates [key] = palsu ; / / Mengatur negara dari kunci saat ini untuk tidak ditekan
  28. }
  29. int main ( int argc, arang ** argv) {
  30. glutInit (& argc, argv); / / Inisialisasi GLUT
  31. glutInitDisplayMode (GLUT_SINGLE); / / Mengatur tampilan dasar penyangga (buffer hanya satu untuk sekarang)
  32. glutInitWindowSize (500, 500); / / Set lebar dan tinggi jendela
  33. glutInitWindowPosition (100, 100); / / Mengatur posisi jendela
  34. glutCreateWindow ( "Kau pertama OpenGL Jendela" ); / / Mengatur judul untuk jendela
  35. glutDisplayFunc (tampilan); / / Katakan GLUT untuk menggunakan metode "layar" untuk rendering
  36. glutReshapeFunc (membentuk kembali); / / Katakan GLUT untuk menggunakan metode "membentuk kembali" untuk membentuk kembali
  37. glutKeyboardFunc (keyPressed); / / Katakan GLUT untuk menggunakan metode "keyPressed" untuk penekanan tombol
  38. glutKeyboardUpFunc (keyup); / / Katakan GLUT untuk menggunakan metode "keyup" untuk kejadian-kejadian kunci
  39. glutMainLoop (); / / Masukkan loop utama GLUT itu
  40. }



0 komentar:

Related Posts Plugin for WordPress, Blogger...

Berita Populer