BAB 3
PERANCANGAN DAN PEMBUATAN
3.1 Perancangan Engine
Engine akan dirancang agar memenuhi syarat maintainability, reusability dan usability. Maintainability berarti kode program engine harus mudah dibaca, rapi dan terdokumentasi dengan baik. Reusability berarti engine harus dapat dipakai untuk membuat sebuah project – project game lainnya dan mampu memotong kinerja dalam sebuah pembuatan game. Usability berarti engine harus dapat digunakan dengan mudah oleh user dan untuk mencapai tujuan ini digunakanlah One Point Single Entry, yang berarti pemakai diberi kemudahan memakai engine hanya dengan satu buah jalan masuk, dalam hal ini include filenya.
3.2 Alternatif Pemecahan Masalah
Untuk memecahkan masalah kerumitan dalam pembuatan game skala besar yang telah dijelaskan di latar belakang, maka penulis mencoba untuk membuat sebuah engine game 3 dimensi yang bersifat open source dan sebuah aplikasi game yang dibuat berdasarkan engine ini. Engine ini dibuat untuk mampu menyesuaikan di lingkungan dengan hardware berspesifikasi menengah( middle end ). Engine ini menggunakan back face, viewing frustum dan occlusion culling dalam pengimplementasian teknik culling. Beberapa pertimbangan mengapa memakai algoritma culling tersebut :
Tabel 3.1. Tabel Keuntungan dan Kerugian Teknik Culling
Metoda Keuntungan Kerugian
Back Face di handle oleh DirectX dan
kita tinggal implementasikan saja
Hampir tidak ada karena performa disesuaikan dengan kekuatan kartu grafis
Viewing Frustum Mudah diimplementasikan dan ringan dalam pemrosesan sehingga tidak membebani CPU terlalu banyak
Kurang akurat, banyak polygon yang dalam perhitungan mendekati viewing frustum tetap dirender
Occlusion Akurat dalam membuang
polygon yang terletak di balik polygon lain yang lebih besar
Di lingkungan 3 dimensi yang kompleks dapat memakan kerja CPU yang banyak.
3.3 Rancangan Viewing Frustum Culling
Viewing frustum adalah bidang visibility yang membatasi dunia 3 dimensi yang luas hanya sebatas pandangan camera dan membentuk bangun piramid. Dalam menghitung rumusan bidang viewing frustum kita menggunakan matriks projection dan matriks view. Matriks projection digunakan untuk memproyeksikan benda yang telah berada di view space ( koordinat kamera ). Vertices yang akan dites dengan bidang akan terlebih dulu melewati perkalian matriks projection dan matriks view, maka pembuatan bidang memakai perhitungan matriks tersebut. Misalkan :
Vertex v = ( x y z w = 1 ) dan Matriks M ( Matriks Projection dan View ) 4x4
(
)
⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ • • • • = ⎟⎟ ⎟ ⎟ ⎟ ⎠ ⎞ ⎜⎜ ⎜ ⎜ ⎜ ⎝ ⎛ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ = ′ ′ ′ ′ ⇒ = ′ 4 3 2 1 44 34 24 14 43 33 23 13 42 32 22 12 41 31 21 11 , , , col col col col m w m z m y m x m w m z m y m x m w m z m y m x m w m z m y m x v v v v w z y x vM v ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ = j j j j j m m m mHasil dari v′ merupakan titik yang telah ditransformasi dengan matriks projection dan matriks view, selanjutnya kita tinggal mengecek persamaan apakah titik tersebut terletak di dalam 6 bidang apabila memenuhi persamaan berikut :
w z w y w w x w ′ < ′ < ′ < ′ < ′ − ′ < ′ < ′ − 0 x w′< ′
− x’ terletak di dalam setengah bidang bagian kiri w
x′< ′ x’ terletak di dalam setengah bidang bagian kanan y
w′< ′
− y’ terletak di dalam setengah bidang bagian bawah w
y′< ′ y’ terletak di dalam setengah bidang bagian atas z′
<
0 z’ terletak di dalam setengah bidang bagian near w
z′< ′ z’ terletak di dalam setengah bidang bagian far
Misalkan kita akan mengetes apakah x′ berada di dalam bagian bidang bagian kiri kita dengan syarat ini :
x w′< ′ −
(
•col4) (
< •col1)
− v v(
) (
)
(
)
(
) (
) (
) (
)
(
) (
) (
) (
)
(
14 11)
(
24 21)
(
34 31)
(
44 41)
41 44 31 34 21 24 11 14 41 44 31 34 21 24 11 14 1 4 1 4 , , , 0 0 1 0 0 0 m m d m m c m m b m m a d cz by ax m m m m z m m y m m x w m m w m m z m m y m m x col col col col + = + = + = + = = + + + = + + + + + + + = = + + + + + + + + • < • + • < v v vPersamaan bidang di atas belum normal, maka harus kita normalkan. Berikut ini adalah rumusan lengkap untuk bidang viewing frustum :
Tabel 3.2. Tabel Rumusan Bidang untuk Viewing Frustum
Clipping Plane Persamaan Koefisien
kiri
(
)
(
) (
)
(
4 1)
1 4 1 4 0 0 col col v col v col v col v col v x w + • < • + • < • < • − ′ < ′ − 41 44 31 34 21 24 11 14 m m d m m c m m b m m a + = + = + = + = kanan(
)
(
) (
)
(
4 1)
1 4 4 1 0 0 col col v col v col v col v col v w x − • < • − • < • < • ′ < ′ 41 44 31 34 21 24 11 14 m m d m m c m m b m m a − = − = − = − = bawah(
)
(
) (
)
(
4 2)
2 4 2 4 0 0 col col v col v col v col v col v y w + • < • + • < • < • − ′ < ′ − 42 44 32 34 22 24 12 14 m m d m m c m m b m m a + = + = + = + = atas(
)
(
) (
)
(
4 2)
2 4 4 2 0 0 col col v col v col v col v col v w y + • < • + • < • < • ′ < ′ 42 44 32 34 22 24 12 14 m m d m m c m m b m m a − = − = − = − = near 3 0 0 col v z • < ′ < 43 33 23 13 m d m c m b m a = = = = far(
) (
)
(
4 3)
3 4 4 3 0 0 col col v col v col v col v col v w z − • < • − • < • < • ′ < ′ 43 44 33 34 23 24 13 14 m m d m m c m m b m m a − = − = − = − =Setelah mendapatkan persamaan umum bidang, maka kita harus menormalkan vektor A, B, C di persamaan umum bidang, supaya vektor memiliki besaran bernilai 1.
3.4 Penggunaan Matriks Transformasi
Matriks tranformasi di sini digunakan untuk menyimpan posisi atau koordinat lokal dari masing – masing objek yang ada. Untuk perhitungan matriks transformasi seperti translasi, rotasi dan skala digunakan untuk memindahkan objek dari posisi lokal menuju posisi world, camera, perspective dan lain sebagainya dengan cara mengalikan matriks posisi objeck dengan matrik transformasi yang diiinginkan( matriks transformasi ini bisa merupakan gabungan antara transformasi world, camera, perspective dan lain – lainnya ).
Gambar 3.1 Local Space dan World Space
3.5 Perancangan Class
3.5.1 Class Engine Framework
Framework engine merupakan bagian class yang paling penting, karena memiliki fungsi – fungsi sebagai berikut :
• Menyediakan tempat dan support secara keseluruhan untuk semua komponen – komponen yang membangun engine.
• Mengontrol aliran proses game yang umum dalam satu loop
• Mengontrol komunikasi messaging dengan operating system ( windows ).
• Menyediakan class – class yang memiliki fungsi dasar ( Linked list, Resource Management, Geometry ).
Gambar 3.3 Rancangan Engine Framework
3.5.2 Class Engine Control
Engine yang dirancang haruslah dapat memfasilitasi segala yang dibutuhkan dalam game, jadi tidak hanya mampu merender gambar 3 dimensi saja. Salah satu aspek penting adalah engine control yang bertugas dalam mengontrol proses engine dan user input. Yang merupakan bagian dari engine control adalah class State ( Finite State Machine ) dan Input. Finite State Machine digunakan untuk membuat sebuah sistem di mana engine process akan memproses state yang aktif pada waktu itu dan menyediakan user kemampuan untuk melakukan transisi dari satu state ke state yang lain.
3.5.3 Class Scripting
Scripting adalah salah satu hal yang penting dalam aspek pemrograman game, karena dengan scripting kita dapat merubah sebagian besar game tanpa harus mengcompile ulang program kita, seperti misalnya perubahan level game, penyeimbangan game mechanics dan sebagainya. Engine ini akan menggunakan class Script yang sederhana berupa property scripting.
3.5.4 Class Rendering
Class yang memegang peranan sebagai komponen terpenting dalam engine kita. Class ini bertugas dalam menentukan kompatibilitas hardware dengan engine kita sekaligus menentukan dukungan dari DirectX terhadap video card yang akan digunakan dalam proses rendering engine. Yang merupakan bagian ini adalah class DeviceEnumeration, Fonts dan sebuah dialog window untuk seting awal sebuah video card.
3.5.5 Class Sound System
Game terasa belum lengkap jika tidak didukungan dengan suara – suara pendukung, maupun suara efek. Mengeluarkan suara dalam game adalah hal mudah, yang perlu kita lakukan hanyalah membungkus class dari Direct Music sehingga pemakaian suara akan dapat disinkronkan dengan engine kita. Class SoundSystem, class Sound dan class AudioPath3D akan terintegrasi sebagai class pendukung Sound System.
3.5.6 Class Networking
Memainkan game dengan dukungan Networking tentu sangat mengasyikkan, oleh karena itu engine ini akan dilengkapi dengan fasilitas Networking Server – Client dengan dukungan dari Direct Play.
3.5.7 Class Game Objects
Class Game Objects merupakan class pembungkus dari class Mesh dan Material kita. Tugas dari class ini adalah menyediakan interface pembungkus yang memotong kerumitan didalam menyatukan model mesh dan material sebagai satu kesatuan. Yang
termasuk dalam class ini adalah class Material, class BoundingVolumes, class Mesh, class RenderCache, class SceneObject, class SpawnObject dan class AnimatedObject.
3.5.8 Class Scene Management
Class Scene Management merupakan bagian paling penting dari engine karena memiliki kemampuan dalam memanage seluruh scene yang ditampilkan dalam monitor. Class ini memiliki tingkat kekompleksan yang paling tinggi untuk mendukung performansi hardware sehingga dapat berjalan maksimal, dan menyeimbangkan kerja CPU dan VGA dalam merender suatu gambar 3 dimensi / scene. Yang termasuk dalam bagian ini adalah class ViewFrustum, dan class SceneManager.
3.5.9 Penjelasan Rancangan Aplikasi
Berikut ini akan diberikan gambarang mengai isi dari class – class yang ada dalam pembuatan aplikasi game dengan menggunakan pseudocode.
• Modul Main Awal modul
Inisialisasi variabel untuk engine
Buat dua buah state untuk state game dan state menu Memanggil loop di engine agar engine mulai bekerja Jalankan state menu untuk pertama kalinya
Jalankan state game setelah state menu
Lakukan selama tidak ada penekanan tombol Escape Jalankan fungsi engine untuk looping
Bersihkan variabel – variabel yang dibuat di inisialisasi Tutup window aplikasi
Akhir modul • Modul Game
Awal Modul
Inisialisasi player object
Mempersiapkan file musik untuk dimainkan Mempersiapkan texture untuk crosshair
Mempersiapkan font untuk menulis teks di aplikasi Dalam fungsi update melakukan
Update posisi player
Update state terakhir dari player
Update skor terbaru tiap – tiap player yang ada
Cek jika ada penekanan tombol maka pindah ke state menu Akhir fungsi update
Dalam fungsi render melakukan
Cek jika tidak ada map yang diload maka keluar dari fungsi Render texture dari crosshair
Akhir fungsi render
Bersihkan variabel – variabel yang dibuat di inisialisasi Akhir Modul
• Modul Menu Awal Modul
Inisialisasi window untuk menu Isi nilai untuk nama player Isi nilai untuk nama map Pilih konfigurasi untuk vga Pilih next untuk keluar dari modul Akhir Modul
• Modul Player Awal Modul
Inisialisasi variabel untuk player Update posisi player
Update vektor up, right dan look
Gerakan posisi player di tempat yang diinginkan Gambar objek player