Thursday, 7 March 2013

DirectX 9 : Program Sederhana (Part II)



Tulisan ini merupakan lanjutan dari:
DirectX 9 : Program Sederhana (Part I)


Ada sedikit ralat untuk pengaturan pada bagian Search Directories -> Linker . Jika sistem yang digunakan berbasis 32bit maka gunakan folder 'x86' sedangkan pada sistem 64bit gunakan folder 'x64' . Menambahkan keduanya tidak masalah yang penting posisi folder yang dicari sesuai, misal pada sistem 32bit posisi folder 'x86' berada di posisi paling atas. Pada dasarnya kita menunjuk kompiler untuk mencari file library (.lib) yang sesuai.

Gambar 1. Pengaturan pada sistem 32 bit (x86)

Tambahkan kode berikut setelah header windows:
#include <windows.h> //header direct3d #include <d3d9.h> #include <d3dx9.h> #define SCREEN_LEBAR 640 #define SCREEN_TINGGI 480 const char gClassName[] = "myWindowClass"; //variabel device LPDIRECT3D9 d3d; //Long pointer (LP) Direct 3D (d3d) LPDIRECT3DDEVICE9 d3ddev; //d3ddev = Direct 3D Device //prototipe fungsi void aturDevice(HWND jendela); void prosesRender(); void Bersihin();
Pertama kita membuat long pointer (LPDIRECT3D9) untuk membuat class iDirect3D9. Selanjutnya variabel device yang menampung informasi tentang driver grafis, kartu video, dan segala sesuatu yang berkaitan dengan grafis pada sisi hardware. Karena menyimpan semua informasi, segala pengaturan (setup) dan rendering melalui variabel ini. Selanjutnya membuat prototipe fungsi yang memudahkan kita. Lalu tambahkan implementasi fungsi-fungsi tersebut dimanapun anda suka, yang penting rapi dan sesudah variabel dan fungsi global. Karena kalau diletakkan sebelum variabel dan fungsi global tersebut pasti error hahaha. Selanjutnya letakkan 'aturDevice' sebelum proses main loop untuk inisialisasi awal, 'prosesRender' di dalam main loop, dan fungsi 'Bersihin' setelah main loop :
... aturDevice(hWnd); // enter the main loop! while(TRUE) { while(PeekMessage(&msg, NULL,0,0, PM_REMOVE)) //PeekMessage(∓msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } if(msg.message == WM_QUIT) break; prosesRender(); } Bersihin(); ...
Berikut ini isi didalam fungsi tersebut :
void aturDevice(HWND jendela) { d3d = Direct3DCreate9( D3D_SDK_VERSION); D3DPRESENT_PARAMETERS dxpp; //pp = Present Paramater if( d3d == NULL){ ::MessageBox(jendela,"DirectX runtime library tidak diinstal dengan baik!", "System Error", MB_ICONEXCLAMATION | MB_OK); } ZeroMemory(&dxpp, sizeof(dxpp)); // clear out the struct for use dxpp.Windowed = TRUE; // program windowed, not fullscreen dxpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // hapus frames lama dxpp.hDeviceWindow = jendela; // mengatur agar jendela mengunakan Direct3D // membuat device class d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, jendela, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dxpp, &d3ddev); } void prosesRender() { //membersihkan layar dan menutupinya dengan warna biru d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); //memulai proses rekam gambar d3ddev->BeginScene(); //mengakhiri proses rekam gambar d3ddev->EndScene(); //menampilkan semua proses yang telah selesai ke layar d3ddev->Present(NULL, NULL, NULL, NULL); } void Bersihin() { //menutup dan melepaskan memory yang //dipakai pada d3d dan d3ddev if (d3d){ d3d->Release(); d3d = NULL; } if (d3ddev){ d3ddev->Release(); d3ddev = NULL; } }
Agar program dapat berjalan dengan baik, kita harus menyertakan versi SDK yang sesuai melalui '3d = Direct3DCreate9(D3D_SDK_VERSION);' pada program kita. Tujuannya agar kompatibel pada mesin/komputer yang lain, jika komputer lain memiliki versi yg lebih tinggi, mereka akan mencoba mencari versi (sebelumnya) yg sesuai dengan versi SDK yang digunakan program kita. Bagaimana kalau versinya lebih rendah? kita harus menyertakan runtime directX terbaru, tetapi tentu dengan batasan sistem yang gunakan, misal DirectX 10 atau 11 tidak memungkinan untuk digunakan pada Windows XP apalagi Windows 98 . D3DPRESENT_PARAMETERS adalah struct yang akan berisi informasi tentang perangkat grafis. ZeroMemory akan menginisialisasi seluruh isi dxpp menjadi NULL. Lalu dxpp.Windowed = TRUE , berfungsi agar program kita tidak full screen. Masukkan FALSE jika ingin menjadi full screen. Tapi tunggu dulu, jika anda langsung merubahnya menjadi FALSE maka program akan crash atau gagal, dikarenakan pengaturan yang lain tidak sesuai untuk fullscreen. Sehingga perlu beberapa pengaturan tambahan, yaitu pada :
//di dalam fungsi aturdevice dxpp.hDeviceWindow = jendela; // mengatur agar jendela mengunakan Direct3D //tambahan untuk fullscreen dxpp.BackBufferFormat = D3DFMT_X8R8G8B8; // mengatur format back buffer menjadi 32-bit dxpp.BackBufferWidth = SCREEN_LEBAR; // mengatur lebar buffer dxpp.BackBufferHeight = SCREEN_TINGGI; // mengatur tinggi buffer ... //di dalam fungsi main //sembuyikan warna background pada jendela sebelumnya (Win32) //karena sudah ditutupi oleh directx (lihat fungsi 'prosesRender') //wc.hbrBackground = (HBRUSH)COLOR_WINDOW; //boleh dihapus hWnd = CreateWindowEx(NULL, gClassName, "Proses Belajar", //ubah pada bagian ini // fullscreen, tanpa adanya border program dan tombol X / silang WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_LEBAR, SCREEN_TINGGI, NULL, NULL, hInstance, NULL); ...
Salah satu fungsi yang sangat penting, yaitu CreateDevice(), prototipe fungsi : //prototipe HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface); // membuat device class d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, jendela, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dxpp, &d3ddev);
Fungsi ini akan membuat kelas baru yang akan menangani kebutuhan grafis dan menyediakan hampir seluruh fungsi yang akan digunakan pada Direct3D. Parameter pertama diisi dengan grafis adapter yang akan digunakan, dalam hal ini default grafis card kita, parameter kedua berfungsi agar program memproses dari sisi Hardware, jika tidak ada masalah. Parameter ketiga diisi dengan jendela hWnd, parameter keempat adalah metode pemrosesan 3D, kita menggunakan metode pemrosesan dengan software. Parameter kelima kita isi dengan dxpp, parameter keenam menunjuk pointer d3ddev. Pengaturan awal telah berjalan sempurna maka kita mulai proses renderingnya. Tekan tombol Escape untuk keluar dari program. Sebelum program benar-benar tertutup kita harus pastikan semuanya sudah dibersihkan. Untuk penjelasan kodenya silahkan lihat pada bagian komentar pada masing-masing kode .

Jika sudah semua compile dan jalankan, seharusnya program akan menampilkan jendela dengan warna biru gelap. Semakin seru, jadi tunggu artikel selanjutnya. Akhir kata Happy Coding!

- krofz

No comments:

Post a Comment

Maaf jika komentar anda lama terbitnya ^__^, penulis berusaha OL sesering mungkin. Komentar anda adalah semangat blog ini, dan juga semangat para blogger lainnya. You can use XHTML tags: <a href="" rel="link"> </a>, <strong> </strong>, <b> </b>, <em> </em>, <i> </i>.

Spesial character use :
&lt; for <
&gt; for >


Use Pastebin.com for alternative to display your code :) .

 

back to top

back to top