Adding Text to the Display
S E N G
- H
DirectX Input
A N S
Level 12
U
N S E N
Adding Text to the Display
G
- H
All About Fonts
Creating Fonts and Displaying Text
A N
The Finished Program
S
Building a Game Display
U N
A Too-Simple Wrapper for Sprites Constructing the Radar
Constructing the Health Bar
Constructing the Ammo Indicator
The Finished Program S E N
Simple Input V-Sync and Mouse Lag
G
- H
Reading the Keyboard The Source of Mouse Lag
Reading the Mouse Disabling V-Sync
A N
The Finished Program The Finished Program
S
Raw Mouse Input Picking in Direct3D
U N
Initializing Raw Input The Picking Ray
The WM_INPUT Message Checking Intersection
Using the Data The Finished Program
The Finished Program S E N
Sekarang kita akan melihat cara untuk membaca
G
- H
input dari keyboard dan mouse, bagaimana cara
untuk menerapkannya dalam suatu game, dan
A
bagaimana membuatnya berinteraksi dengan baik
N S dalam lingkungan game Anda.
U
Pertama, kita akan mempelajari teknik sederhana
N untuk membaca input dari keyboard dan mouse.
S E N
Suatu key state adalah status dari sebuah tombol
G
(key), yakni apakah tombol tersebut ditekan atau
- tidak.
H A
Untuk menentukan key state dari sebuah tombol
N digunakan fungsi GetAsyncKeyState().
S U N
Suatu virtual key code adalah suatu code yang ditetapkan pada suatu tombol tertentu di keyboard.
Perhatikan bahwa ‘A’ dan ‘a’ memiliki virtual key code yang sama. S E N
Selanjutnya bagaimana caranya untuk mengetahui
G
sebuah tombol ditekan atau tidak?
- H
Fungsi GetAsyncKeyState() mengembalikan suatu
A
SHORT bukan BOOL, karena fungsi ini
N
mengembalikan lebih banyak data ketimbang hanya
S U apakah sebuah tombol ditekan atau tidak. N
Untuk mengetahui sebuah tombol ditekan, kita cek bit paling signifikan di dalam SHORT yang dikembalikan. S E N
Kita AND-kan nilai yang dikembalikan dengan
G 0x8000 untuk mengetahui status sebuah key.
- H
Sayangnya, menambahkan code di atas terus-
A menerus dapat membuat code terlihat rumit. N S
Dapat dibuat macro untuk menyederhanakan
U penulisannya sebagai berikut. N
Dengan menggunakan macro ini, kita dapat dengan mudah menentukan status sembarang key, seperti berikut. S E N G
- H A N S U N
- H A N S U N
- H A N S U N
http://directxtut orial.com/Lesson .aspx?lessonid=9
- 8-1
http://msdn.microsoft.com/en- us/library/windows/desktop/dd375731%28v=vs.85%29.aspx
Perhatikan bahwa tombol-tombol huruf dan angka tidak selalu diwakili nilai-nilainya sendiri.
S E N G
- H A N S U N
Untuk menggunakannya, Anda memakai nilai hexadecimal, seperti berikut
S E N Membaca posisi tetikus (mouse) sangatlah mudah.
G
Kita akan gunakan fungsi GetCursorPos(), seperti
- H berikut.
A N
A struct that contains 2 int values,
S
x and y
U N
Fills a POINT struct with the current mouse position S E N
Kebanyakan game tidak menggunakan mouse position,
G namun menggunakan mouse movement.
- H
Solusi yang mudah dan kerap digunakan adalah
A
dengan membaca lokasi mouse, lalu memindahkan
N mouse tersebut ke pusat layar.
S U
Saat Anda membaca data mouse kembali, Anda dapat
N
memperoleh perubahan mouse, dibandingkan posisi normal mouse tersebut. S E N G
- Simple function to set the position of the mouse, the
H
x and y coordinates
A N S U N
Subtract the center position from each mouse coordinate in MousePos to get the mouse change S E N G
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
Selain fungsi input umumnya terdapat suatu API yang
G disebut Raw Input.
- H
API ini direkomendasikan oleh Microsoft untuk
A
pembangunan game, yang dapat memberikan kendali
N penuh untuk semua perangkat input.
S U
Sekarang kita akan mempelajari cara memulai Raw
N
Input, dan bagaimana membaca pergerakan mouse
dengan menggunakan pesan WM_INPUT yang dihasilkan oleh Raw Input. S E N
Sebelum menggunakan Raw Input, kita harus
G menginisialisasinya terlebih dahulu.
- H
Kita harus memberitahu Windows perangkat mana
A
yang ingin kita kendalikan → mendaftarkan
N perangkat.
S U N
Sebelum memanggil fungsi ini, kita harus mengisi struct untuk memberitahu apa yang akan diregister.
Untuk meregister suatu perangkat, kita gunakan fungsi RegisterRawInputDevices().
S E N G
- H A N S U N
A series of input devices, use ‘0x01’ A device within a usage page Customization flags S E N
Fungsi ini digunakan untuk meregister mouse dan
G memiliki 3 parameter.
- Yang pertama adalah suatu pointer ke struct
H A RAWINPUTDEVICE yang telah dibuat sebelumnya. N
Parameter kedua adalah jumlah perangkat yang
S diregister (hanya 1 untuk contoh ini). U N
Terakhir adalah ukuran struct RAWINPUTDEVICE.
Dengan menggunakan fungsi ini, kita dapat meregister beberapa perangkat sekaligus dengan
membuat suatu larik RAWINPUTDEVICE structs dan melewatkan pointer ke larik tersebut di dalam parameter pertamanya. S E N G
- H A N S U N
http://directxtutorial.com/Lesson.aspx?lessonid=9-8-2 S E N G
- H A N S U N
http://directxtutorial.com/Lesson.aspx?lessonid=9-8-2 S E N
Setelah meregister perangkatnya, sekarang akan kita
G lihat cara membaca datanya.
- H
Untuk membaca data di dalam Raw Input API, akan
A digunakan WM_INPUT message. N S
Kapanpun terdapat input untuk ditangani dari API ini,
U
WM_INPUT message akan mengirimkannya pada
N kita untuk digunakan.
Kita letakkan WM_INPUT message di dalam WindowProc. S E N G
- H A N S U N
A struct which will be filled with all the input information we want
G
- H
Contains some general data that is
A
sent every time there is any input
N
message, regardless of where it’s from
S U N
Filled with the information about the mouse movement S E N G
- H A N S U
http://
N
direct xtutor ial.co m/Les son.as px?les sonid
Memanggil fungsi ini akan mengisi RAWINPUT struct kita dengan seluruh informasi dari suatu input event.
Fungsi ini merupakan fungsi utama yang paling
penting.S E N G
- H A N S U N
Setelah mengisi RAWINPUT dengan informasi yang
G
dibutuhkan, kita dapat menggunakannya untuk
- H
memutar teapot dengan masukan dari mouse.
A
2 langkah:
N S 1.
Create a BOOL to keep track of the mouse
U
button’s state
N 2.
It there is movement, rotate the teapot S E N
Karena WM_INPUT message hanya akan
G
memberitahu kita kapan status mouse berubah, kita
- H harus menyimpan record-nya sendiri.
A N S U N
S E N G
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
Sekarang kita akan membahas topik permasalahan
G
yang kerap ditemui dalam games, bahkan yang
- H terbaik sekalipun.
A
Terdapat 2 permasalahan umum, yakni input lag dan
N tearing.
S U
Sekarang kita akan membahas V-Syncing dan
N bagaimana V-Sync akan memengaruhi input.
S E N
Istilah ini muncul sebelum era monitor LCD
G modern.
- H
Pada masa CRT, images digambarkan dengan suatu
A
light-pin yang bergerak secara horizontal sepanjang
N
layar dan zig-zag hingga mencapai bawah layar.
S U
Setelah pin tersebut mencapai bawah layar, pin akan
N kembali ke atas dan mulai lagi dari awal.
Jeda waktu ini, saat tidak ada penggambaran, disebut dengan vertical sync, disingkat v-sync. S E N
Di awal perkuliahan, kita telah membahas tearing dan
G page swapping (page flipping).
- H
Teknik page flipping ini dapat disebut juga v-sync,
A
karena pertukaran terjadi pada saat jeda waktu
N
singkat ketika layar mempersiapkan dirinya kembali
S U untuk menampilkan gambar lainnya ke layar. N
Hal ini membuat frame rate tergantung pada refresh rate dari layar monitor Anda.
Sementara beberapa monitor memiliki refresh rate yang relatif rendah (< 60 fps). S E
Berdasarkan sifat alamiah sinyal elektronik, suatu mouse
N akan selalu memiliki lag. G
-
Namun, mouse di Windows umumnya bergerak dengan
H lancar, tanpa terdeteksi adanya lag. A
Sinyal mouse dijalankan oleh Windows pada thread
N S
terpisah, membaca informasi dari mouse tersebut dan
U segera menggantinya di layar monitor. N
Kecepatan pemrosesannya tergantung pada kecepatan mouse tersebut bergerak.
Setelah mouse mengirim informasi ke Windows, kursor
mouse baru segera digambarkan kembali di layar.
Ingat bahwa tidak seperti pada games, Windows tidak S E N
Dalam sebuah game dimana mouse mengontrol suatu
G
camera, mesin mau tidak mau harus me-render kembali
- keseluruhan scene saat mouse digerakkan.
H
Akibatnya, pergerakan mouse dibatasi oleh frame rate
A
monitor, sehingga memperlambat update-rate mouse
N tersebut.
S U
Pada saat menghindari tearing, kita lakukan render pada
N
suatu back-buffer, dan saat monitor VSyncing, kita tukar back dengan front buffer-nya.
Pada dasarnya, apa yang ditampilkan adalah data lama.
Saat render scene didasarkan pada pergerakan mouse, timbul mouse lag, karena gambar tersebut telah di-render pada beberapa frame sebelumnya. S E N
Solusi dari mouse lag adalah dengan menonaktifkan V-
G Sync.
- H
Caranya dengan menggunakan PresentationInterval, yang
A
bertujuan mengatur hubungan antara refresh rate
N monitor dan rate dimana Present() selesai.
S U N
S E N
Terdapat beberapa nilai untuk PresentationInterval,
G namun yang akan dijelaskan hanya 2.
- 1.
H A
Menggunakan back buffer untuk membentuk suatu antrian
N
frames. Setelah 1 frame ditampilkan, frame berikutnya akan
S mengambil alih dan ditampilkan. U
Mouse lag No tearing
N 2.
Memberitahu DirectX untuk menggunakan back buffer, namun langsung melakukan pertukaran saat render gambar selesai. Artinya tidak ada time lag antara render completion dan image display, tapi bisa muncul tearing. S E N
Jadi, sebuah game dapat memiliki tearing dan hampir
G tidak ada mouse lag, atau sebaliknya.
- H
Mana yang lebih baik?
A
Umumnya gamers dapat lebih menerima tearing
N S
ketimbang mouse lag, karena mouse lag dapat
U menimbulkan gangguan yang lebih besar. N
Akibatnya, banyak games yang menyediakan V-Sync sebagai option, dan default-nya disable.
Trik lain untuk mengurangi visibility tearing adalah
dengan menghindari warna-warna yang sangat kontras. S E N G
- H A N S U N
http://directxtutorial.co m/Lesson.aspx?lessonid =9-8-3 S E N G
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
Saat Anda menggunakan mouse pointer dalam sebuah
G
game, tentunya Anda harus tahu apa yang diklik oleh
- player.
H A
Dalam aplikasi 2D hal ini mudah, karena biasanya obyek
N
disimpan dalam suatu bentuk faktor persegi dan Anda
S
dapat dengan mudah menggunakan koordinat untuk
U menentukan apakah mouse diklik atau tidak. N
Untuk 3D, mouse tidak diberikan dalam koordinat 3D, sehingga Anda tidak tahu apa yang Anda klik.
Namun, Direct3D menyediakan beberapa fungsi yang
memungkinkan Anda menentukan apa yang diklik berdasarkan posisi mouse dan posisi kamera. S E N
Sebelum Anda menentukan apa yang diklik oleh
G
player, Anda harus membuat sebuah garis sepanjang
- 3D space yang merepresentasikan klik itu sendiri.
H A N S U N
http://directxtutorial.com/Lesson.aspx?lessonid=9-8-4
Pada gambar sebelah kanan, Anda dapat melihat garis merah yang mewakili setiap titik dalam 3D space yang diklik oleh user. S E N
Dengan menggunakan beberapa fungsi DirectX kita
G
dapat menggunakan ray ini untuk menentukan obyek
- apa yang beririsan dengannya.
H A
Pertama, ray tersebut harus dibuat dalam memory.
N
Dapat digunakan 2 buah structs D3DVECTOR3, yang
S
satu merepresentasikan posisi kamera, dan lainnya
U
merepresentasikan arah mouse klik terhadap posisi
N kamera.
Kedua nilai ini akan disebut sebagai origin dan
direction. Untuk menemukan picking ray, kita harus menghitung origin dan direction-nya.
Beberapa langkah untuk menghitung picking ray: 1.
- H A N S U N
Get the current transform matrices, including projection, view, and world
angle 3. Find the inverse matrix 4.
S E N G
Use the inverse matrix to shift the origin and direction into model space
S E N
Pertama kita harus memperoleh matriks-matriks
G
yang digunakan untuk me-render gambar 3D terakhir
- H (mesh).
A
Digunakan fungsi GetTransfrom() untuk mengambil
N
data dari video memory dan mengisi matriks dengan
S U nilainya. N
S E N
Untuk membuat sebuah garis yang merepresentasi-
G
kan mouse klik, kita harus menemukan sudut garis
- H
tersebut dalam koordinat x dan y (z infinite).
A
Kita akan gunakan nilai float untuk merepresentasi-
N
kan dimana garis tersebut mengarah dalam viewing
S U frustum. N
Jika Anda melihat viewing frustum dari kamera, maka terlihat seperti sebuah persegi panjang.
Untuk tujuan picking, kita akan scale “sudut”-nya menjadi (-1,-1) di kiri atas layar, dan (1,1) di kanan bawah. S E N G
- H A N S U N
http://directxtutorial.com/Lesson.aspx?lessonid=9-8-4 S E N G
- H
Pada bagian pertama persamaan di atas, terdapat
A
ekspresi
N
(((2.0f * MousePos.x) / SCREEN_WIDTH) - 1.0f)
S U
Ekspresi ini mengambil posisi mouse pada layar dan
N mengubah skalanya menjadi antara -1 dan 1.
Di bagian kedua, kita bagi hasilnya dengan suatu cell dari matProjection.
X dibagi dengan cell (0,0) dan Y dibagi dengan cell (1,1).
Nilai kedua cell merepresentasikan sudut dari viewing S E N G
- H A N S U N
Setelah memperoleh sudut picking ray, kita gunakan untuk membuat 2 vektor, yakni origin dan direction. S E N
Dalam rendering, kita mengambil titik-titik,
G
memindahkannya dalam dunia (world space), mengatur
- orientasinya agar sesuai dengan kamera (view space), dan
H
me-resize-nya untuk memperlihatkan kedalaman
A N (projection space).
S
Dalam picking, kita lakukan hal sebaliknya.
U
Dimulai dengan menentukan lokasi dalam projection
N
space, kita harus melakukan un-resize menjadi view space, un-orient menjadi world space, dan undo world transform untuk mendapatkan model space.
Alasannya daripada meletakkan seluruh titik dalam pipeline 2 kali, akan lebih cepat untuk meletakkan picking S E N
Untuk meletakkan sesuatu dalam pipeline secara
G backward, pertama harus didapatkan inverse matrix.
- H A N S
Inverse matrix dapat diperoleh dengan fungsi
U D3DXMatrixInverse() . N
Perhatikan bahwa kita telah memfaktorkan projection menjadi mouse’s angle, sehingga tidak perlu ditemukan lagi di sini.
Kita hanya akan melakukan inverse terhadap world dan view, yang disimpan dalam matInverse. S E N G
- H A N S U N
- H
Untuk origin, kita gunakan
A
D3DXVec3TransformCoord(), yang mengambil
N koordinat dan mengalikannya dengan suatu matriks.
S U
Parameter pertamanya adalah pointer ke resulting
N
vector, parameter kedua adalah pointer ke original
vector, dan parameter ketiga adalah pointer ke
matriksnya. Fungsi ini akan mengubah origin ke dalam posisi kamera dalam model space. S E N G
- H
Kita lakukan hal yang serupa untuk direction, namun
A
karena direction merupakan suatu normal, bukan
N
koordinat, maka digunakan fungsi
S U D3DXVec3TransformNormal(). N
Fungsi ini akan mengubah direction menjadi model space.
Baris ketiga digunakan untuk menormalisasi direction,
yang berarti kita ubah garis direction sehingga panjangnya bernilai 1. S E N G
- H A N S U N
Untuk melakukan picking diperlukan satu fungsi,
G yakni D3DXIntersect().
Meskipun fungsi ini memiliki banyak parameter,
H A kebanyakan parameter tersebut bersifat optional. N S U N
Kita hanya akan menggunakan 4 parameter pertama dan sisanya bernilai NULL. S E N
Contoh pemanggilannya:
G
- H A N
Jika dimanfaatkan parameter pHit:
S U N
S E N G
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
- H A N S U N
http://directxtutorial.com/ http://www.highgraphic.com/thumbs-up-and-down- icons/ Other web resources.
- H A N S U N