RSS

Hardware Abstraction

27 Jun

Permainan yang berjalan pada platform yang mendukung berbagai kontroler masukan menawarkan pengalaman gaming terkaya.Ini adalah kasus tidak hanya dengan PC (yang menggunakan keyboard, mouse, dan joystick), tetapi juga dengan sebagian konsol permainan melalui peripheral eksotis. Dalam beberapa tahun terakhir, kami telah menggunakan standar controller, pesawat-gaya joystick, Snowboards, tari bantalan dari segala macam, dan bahkan pancing!

Ada dua jalur pengembang mungkin mengikuti ketika coding untuk seperti platform. Beberapa game akan memilih untuk menggunakan satu (dan hanya satu) dari controller yang ada. Ini adalah kasus dalam permainan strategi yang paling, yang untuk alasan gameplay biasanya dikodekan dengan mouse PC dalam pikiran. Di sisi lain, beberapa permainan lainnya akan membiarkan pengguna memilih metode input yang dia inginkan untuk mempekerjakan. Aksi game untuk PC sering bisa dimainkan dengan joystick, keyboard, gamepad, dan kadang-kadang bahkan mouse. Meskipun baik untuk pemain, itu datang pada biaya rumit kode penanganan masukan secara signifikan, dan ini adalah perangkat keras persis di mana abstraksi menjadi masalah.

Dengan abstraksi hardware, maksud saya coding permainan Anda dengan controller “virtual” dalam pikiran, sehingga kontroler apapun yang sesuai dengan profil yang abstrak dapat dipasang ke dalam kode dengan nol dampak pada mesin permainan. yang Anda perlu Anda lakukan adalah menulis handler kontroler generik (biasanya, kelas abstrak murni) dari yang khusus pengendali berasal melalui warisan. Kemudian, pada saat runtime, hanya jenis kontroler dipilih oleh pemain adalah dibuat, memberikan cara halus dan elegan mengintegrasikan kontroler yang berbeda. Gambar 5.3 menunjukkan bagaimana struktur kelas akan berhasil.

Gambar 5.3. Struktur memungkinkan kelas untuk mengimplementasikan abstraksi perangkat.

Perhatikan bagaimana, demi kejelasan, saya telah membuat controller global yang sangat menyerupai permainan menghibur. Ini memiliki dua pengendali arah dan empat tombol. Masukan ini kemudian dapat dipetakan ke keyboard (menggunakan tombol untuk opsi-opsi yang berbeda), sebuah analog joystick, atau joystick digital. Item hanya kita perlu diperhatikan adalah sensitivitas yang berbeda ditemukan pada tombol dan tongkat. Sebuah kunci dapat ditekan atau dilepas, sehingga membutuhkan hanya nilai biner, sedangkan joystick mungkin akan memetakan ke satu set terus menerus. Dengan demikian, beberapa kode diskritisasi akan diminta untuk menawarkan output standar.

Sebuah alternatif lebih baik lagi jika Anda menggunakan DirectInput adalah untuk mengambil keuntungan dari tindakan pemetaan, yang memungkinkan perangkat untuk kembali nilai-nilai negara tidak spesifik tetapi permainan yang berorientasi nilai. Kami dapat menetapkan peristiwa perangkat untuk peristiwa permainan, sehingga controller input akan menerima nilai-nilai yang entah bagaimana perangkat independen. untuk
contoh, kita dapat memiliki joystick dan menetapkan sebuah gerakan pada sumbu X ke “muka kiri” tindakan. kita bisa kemudian menetapkan tombol khusus untuk acara yang sama, sehingga kode kontrol input menjadi independen dari perangkat. Kita dapat mengubah perangkat, dan sebagai kontrol adalah menerima pesan abstrak, semuanya akan tetap bekerja.

Pemetaan tindakan tidak sulit untuk mendapatkan kerja di bawah DirectInput, meskipun kode yang terlalu panjang menjadi rinci di sini. Langkah pertama adalah mendefinisikan tindakan dalam permainan kami:

enum GAME_ACTIONS {
WALK,
WALK_LEFT,
WALK_RIGHT,
JUMP
QUIT
};

Kemudian, kita harus menyediakan sebuah peta tindakan yang berhubungan sumbu dan tombol atau kunci untuk tindakan yang berbeda:

DIACTION g_adiaActionMap[] =
{
// Joystick input mappings
{ WALK, DIAXIS_FIGHTINGH_LATERAL, 0, ACTION_NAMES[WALK], },
{ JUMP, DIBUTTON_FIGHTINGH_JUMP, 0, ACTION_NAMES[JUMP], },
// Keyboard input mappings
{ WALK_LEFT, DIKEYBOARD_LEFT, 0, ACTION_NAMES[WALK_LEFT], },
{ WALK_RIGHT, DIKEYBOARD_RIGHT, 0, ACTION_NAMES[WALK_RIGHT], },
{ JUMP, DIKEYBOARD_J, 0, ACTION_NAMES[JUMP], },
{ QUIT, DIKEYBOARD_Q, DIA_APPFIXED, ACTION_NAMES[QUIT], },
// Mouse input mappings
{ WALK, DIMOUSE_XAXIS, 0, ACTION_NAMES[WALK], },
{ JUMP, DIMOUSE_BUTTON0, 0, ACTION_NAMES[JUMP], },
};

Inisialisasi sistem input akan sangat mirip dengan contoh sebelumnya. Semua kita perlu
lakukan adalah menghitung perangkat input semua didukung oleh peta tindakan. Hal ini akan dicapai dengan panggilan untuk EnumerateDevicesBySemantics, yang akan menerima peta dan memerlukan tindakan callback di mana semua perangkat mungkin akan dikembalikan. Callback kemudian harus membangun peta aksi yang spesifik perangkat. Setelah itu dibersihkan, panggilan berikutnya akan kembali membaca perangkat data spesifik, seperti dalam berikut
contoh:

hr = pdidDevice->Poll();
hr = pdidDevice->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),
rgdod, &dwItems, 0 );
for( DWORD j=0; j<dwItems; j++ )
{
UINT_PTR dwAction = rgdod[j].uAppData;
switch( dwAction )
{
case WALK:
(…)
}
}

Perhatikan bahwa GetDeviceData mengembalikan daftar tindakan, sehingga kami dapat memproses beberapa tombol atau kunci dalam yang sama loop.

 

 

 
Leave a comment

Posted by on June 27, 2012 in Uncategorized

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: