Pages

Senin, 25 Juni 2012

Mouse


sejak awal mereka pada akhir tahun 1960 sebagai perangkat input CAD, mice telah beradaptasi untuk banyak kegunaan. termasuk game komputer. mereka populer terutama pada PC game, tetapi biasanya tidak mendukung pada konsol game. tidak seperti keyboard atau joystick, mouse tidak hanya menghasilkan tombol atau tombol yang ditekan, tetapi menghasilkan 2D posisi juga. ini memberikan pilihan yang lebih banyak dari pilihan input pada biaya yang lebih tinggi dari belajar curva untuk para pemain.
mice dapat digunakan dalam berbagai skenario, dari memilih unit dalam judul strategi real-time kemouselook populer banyak ditemukan penembak-penembak pertama. dalam semua kasus, pengoperasian mouse dapat dibagai menjadi transmisi informasi posisional(berkat sensor mouse internal) dan mengirim pesan tombol ditekan dan dilepas.
mari kita periksa bagaimana mengoperasikan mouse dibawah DirectInput. Source code ini sangat mirip dengan permintaan keyboard karena DirectInput memperlakukan semua perangkat sama. hal ini menguntungkan bagi programmer karena banyak detail pusat yang tersembunyi. mari kita asumsikan kita mempunyai objek DirectInput utama dan running, dan mulai dengan melewati penciptaan perangkat :
LPDIRECTINPUTDEVICE g_pMouse;
HRESULT             hr;
hr = g_pDI->CreateDevice(GUID_SysMouse, &g_pMouse, NULL);
Seperti yang dapat kamu lihat, ini sangat mirip untuk meminta keyboard; yang menjadi perbedaan hanyalah GUID kita lewati untuk meminta perangkat yang kita inginkan. Kemudian, format data dapat diatur seperti ini
hr = g_pMouse->SetDataFormat(&c_dfDIMouse);
dalam keadaan ini c_dfDIMouse parameter memberitahukan DirectInput kita akan melewati struktur DIMOUSESTATE ke IDirectInputDevice::GetDeviceState. Struktur ini akan mengikuti tanda seperti ini :
typedef struct DIMOUSESTATE {
    LONG lX;
    LONG lY;
    LONG lZ;
    BYTE rgbButtons[4];
} DIMOUSESTATE, *LPDIMOUSESTATE;
Struktur ini mengembalikan posisi X dan Y, dan sumbu Z opsional, yang biasanya ditugaskan untuk roda. Kemudian, tombol array bekerja seperti array keyboard. Tombol yang ditekan jika sedikit high_order diatur. Varian dari struktur ini adalah DIMOUSESTATE2, diatur dalam parameter c_dfDIMouse2. satu-satunya perbedaan adalah bahwa yang terakhir mendukung 8 tombol daripada 4 pendukung oleh DIMOUSESTATE. Inilah yang paling berguna dalam mouse untuk system CAD, sebagai contoh.
Setelah format data telah disetel, kita perlu mengatur tingkat kerjasama. Tidak ada yang mengejutkan disini, karena kode ini sama persis dengan versi keyboard.
hr = g_pMouse->SetCooperativeLevel(hWnd,
               DISCL_EXCLUSIVE | DISCL_FOREGROUND);
Selain itu, kita membutuhkan perangkat yang siap digunakan dengan jalur :
g_pMouse->Acquire();

ini adalah source code lengkapnya :
LPDIRECTINPUTDEVICE g_pMouse;
HRESULT hr = g_pDI->CreateDevice(GUID_SysMouse, &g_pMouse, NULL);
hr = g_pMouse->SetDataFormat(&c_dfDIMouse);
hr = g_pMouse->SetCooperativeLevel(hWnd,
               DISCL_EXCLUSIVE | DISCL_FOREGROUND);
g_pMouse->Acquire();

membaca dari mouse didapatkan dengan memanggil GetDeviceState, yang akan mengembalikan struktur LPDIMOUSESTATE. Kodenya akan menjadi :

DIMOUSESTATE dims;      // DirectInput mouse state structure
ZeroMemory( &dims, sizeof(dims) );
hr = g_pMouse->GetDeviceState( sizeof(DIMOUSESTATE), &dims );
if( FAILED(hr) )
{
           hr = g_pMouse->Acquire();
while( hr == DIERR_INPUTLOST ||  hr == DIERR_OTHERAPPHASPRIO ||
hr == DIERR_NOTACQUIRED)
hr = g_pMouse->Acquire();
}

Perhatikan bagaimana saya telah  menambahkan kode pencegahan untuk menghindari kehilangan jelas dari mouse kita karena kejadian yang tidak terduga. Selain itu, kode ini sangat mirip untuk membaca keyboard. Untuk mengakses atribut mouse, yang harus kita lakukan adalah :
int MouseX = dims.lX;
int MouseY = dims.lY;
bool lbutton = (dims.rgbButtons[0] & 0x80)!=0);

biasanya, tombol 0 ditugaskan untuk tombol kiri mouse, tombol 1 ditugaskan untuk tombol kanan mouse, dan tombol 2 ditugaskan untuk tombol tengah (jika tersedia). Mengenai posisi, ingat bahwa mouse adalah perangkat penunjuk relatif. Ketika pertama kali diperoleh, posisi mouse akan mengulang ke (0,0). Jadi, setiap baru membaca akan kembali ke perpindahan yang terakhir. Jadi, jika kita menggerakan mouse secara vertikal, kita akan melihat perpindahan kearah Y. Tetapi ketika kita berhenti bergerak, nilai dari mouse akan kembali ke (0,0). Ingatlah, mouse tidak bekerja dengan posisi melainkan bekerja dengan perpindahaan. Terakhir, tapi tidak sedikit, mouse biasanya dikonfigurasi ke poin X menjadi  negatif kekiri dan titik positif Y dari posisi badan kita saat duduk dimeja.
Selain itu, ingatlah untuk melepaskan mouse segera setelah anda selesai menggunakannya. Code ini kembali sangat mirip dengan kode melepaskan keyboard :
if( g_pMouse ) g_pMouse->Unacquire();
SAFE_RELEASE( g_pMouse );
SAFE_RELEASE( g_pDI );

Penggunaan yang populer dari mos=use adalah untuk mengimplementasikan mouselook klasik yang digunakan di banyak first-person penembak. Mouselook ini mudah untuk dikode setelah anda memahami bagaimana cara mengoperasikan mouse. Yang harus kita lakukan adalah gunakan kunci untuk mengubah posisi kita, dan gunakan mouse untuk mengarahkan kembali cara pandang kita. Saya akan menjelaskan semua efeknya, sehingga kita dapat menggabungkan apa yang kita pelajari tentang keyboard dan mice. Permainan paling tidak harus mempunyai 4 derajat kebebasan. Kita harus mempunyai posisi yang terdiri dari niali X dan Z, dan kemudian persimpangan dan sudut lintas. Nilai Y sering  ditambahkan dalam campuran sehingga kita dapat mendaki perbedaan ketinggiannya, tetapi putaran umumnya tidak dibutuhkan. Kita akan menggunakan pemetaan berikut :
Mouse : Mouselook
Arah kiri : menembaki kiri
Arah kanan : menembaki kanan
Arah atas : maju kedepan
Arah bawah : bergerak ke belakang
Pertama-tama mari kita fokus pada keyboard dan lupakan tentang orientasi sebentar. Dengan asumsi keyboar DirectInput standar, kita akan membutuhkan kode berikut untuk mengimplementasikan perilaku yang kita inginkan :
int strafe= (buffer[DIK_RIGHT] & 0x80)!=0) - (buffer[DIK_LEFT] & 0x80)!=0);
int fwd= (buffer[DIK_UP] & 0x80)!=0) - (buffer[DIK_DOWN] & 0x80)!=0);
perhatikan bagaimana kita telah membungkus kontrol kursor dengan elegan. Dengan mengurangi lawan arah, kita mendapatkan 2 nomor, strafe dan fwd, dalam jangkauan -1...1. nomor ini digunakan untuk mengemudikan posisi update rutin kita.
pos.x += fwd*FWDSPEED*elapsed*cos(yaw) +
strafe*STRAFESPEED*elapsed*cos(yaw+3.1416/2);
pos.z += fwd*FWDSPEED*elapsed*sin(yaw) +
strafe*STRAFESPEED*elapsed*sin(yaw+3.1416/2);
variable fwd dan strafe mengontrol bagaimana setiap member dikalikan denggan -1, 0, 1 untuk melakukan efek yang diinginkan. Sekarang, marilah menjaga lintasan dan persimpangan melalui mouse :
yaw+= YAWSPEED*elapsed*dims.lX;
pitch+= PITCHSPEED* elapsed*dims.lY;
jadi sekarang kita mempunyai pos.x, pos.z, persimpangan dan lintasan yang baru dari stuktur pemain yang terupdate. Sesungguhnya kita harus menjaga 2 perangakat tetap hidup dan kita harus mendefinisikan semua konstanta dalam topi untuk mengatur kecepatan yang diinginkan. Perhatikan bagaimana jalan ini memastikan performa perangkat independen kita. Untuk kelengkapan, ini adalah kode yang dibutuhkan untuk memperhitungkan semua parameter kamera spesifik yang siap dipasang ke OpenGL atau DirectX.
point campos(pos.x,pos.y,pos.z);
point camlookat(pos.x+cos(yaw)*cos(pitch),pos.y+sin(pitch),
pos.z+sin(yaw)*cos(pitch))
perhitungan koordinat lookat hanya untuk pemetaan bola yang menggunakan pitch dan yaw. Tergantung pada bagaimana sumbu anda ditata, sebuah tanda mungkin akan berubah atau anda mungkin perlu menambahkan sudut konstan seperti Pi ke nilai pitch

READ MORE - Mouse