<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Aji Pamungkas</title>
	<atom:link href="http://ajipamungkas.net23.net/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://ajipamungkas.net23.net</link>
	<description>Just another ordinary man's weblog</description>
	<pubDate>Thu, 19 Feb 2009 23:49:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Persiapan</title>
		<link>http://ajipamungkas.net23.net/?p=103</link>
		<comments>http://ajipamungkas.net23.net/?p=103#comments</comments>
		<pubDate>Thu, 19 Feb 2009 15:32:42 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[Ogre3D]]></category>

		<guid isPermaLink="false">http://ajipamungkas.net23.net/?p=103</guid>
		<description><![CDATA[Ogre, Netbeans dan MinGW dapat Anda gunakan untuk mengembangkan aplikasi 3D dengan gratis, terutama untuk pengembangan games. Pengetahuan pemrograman dengan menggunakan bahasa C++ sangat diperlukan agar dapat mengembangkan games dengan Ogre. Tentunya Anda juga memerlukan perangkat lunak lainnya untuk membuat resource seperti Blender untuk membuat model 3D dan GiMP untuk membuat resource 2D.
Ogre
Ogre (Object-oriented Graphics [...]]]></description>
			<content:encoded><![CDATA[<p>Ogre, Netbeans dan MinGW dapat Anda gunakan untuk mengembangkan aplikasi 3D dengan gratis, terutama untuk pengembangan games. Pengetahuan pemrograman dengan menggunakan bahasa C++ sangat diperlukan agar dapat mengembangkan games dengan Ogre. Tentunya Anda juga memerlukan perangkat lunak lainnya untuk membuat resource seperti Blender untuk membuat model 3D dan GiMP untuk membuat resource 2D.<br />
<strong>Ogre</strong><br />
Ogre (Object-oriented Graphics Rendering Engine) adalah mesin render grafis 3D yang dapat berkomunikasi dengan kartu grafis melalui DirectX dan OpenGL. Agar dapat menggunakan Ogre dengan Netbeans, anda perlu memasangnya terlebih dahulu dan juga memasang plugin C/C++. Selain itu, Unduhlah Ogre SDK 1.6 yang khusus untuk Code::Blocks+MingW, bukan Ogre SDK untuk Visual C++ di “http://www.ogre3d.org/download/sdk”. <br />
Setelah terpasang, Ogre SDK memilki beberapa folder, yaitu<br />
<img src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image001-1.gif" alt="image001" width="116" height="222" /><br />
<strong>Netbeans</strong><br />
Netbeans 6.5 adalah IDE (Integrated Development Environment) yang dikembangkan untuk para pengembang perangkat lunak. Semua hal yang diperlukan untuk membuat aplikasi desktop, web dan aplikasi untuk perangkat genggam, tersedia di Netbeans dengan bahasa Java, C/C++ dan bahkan PHP, JavaScript dan Ruby. Netbeans mudah untuk dipasang dan dapat dijalankan pada berbagai platform seperti Windows, Linux, Mac OS X dan Solaris.<br />
Terdapat beberapa unduhan Netbeans yang berbeda isi plugin-nya. Sebaiknya Anda mendownload yang sudah memiliki plugin C/C++ di “http://www.netbeans.org/downloads/”. Tentunya Anda butuh Java Runtime untuk menjalankan Netbeans, unduhlah di “http://java.sun.com/j2se/1.4.2/download.html”.</p>
<p><strong>MingW</strong><br />
MinGW (Minimalist GNU for Windows) adalah sekumpulan koleksi file header dan file library Windows yang gratis dan dapat didistribusikan, termasuk GNU Compiler Collection (GCC). Selain MinNW, Anda juga membutuhkan MSYS, untuk mempermudah pengembangan C++ di Windows dengan menggunakan perintah-perintah yang sama seperti di UNIX. Anda dapat mengunduh keduanya di “http://www.mingw.org/”. Yang Anda butuhkan adalah :<br />
1. MinGW 5.14 Installer.<br />
2. GCC Versi 3.4.5<br />
3. GNU Make 3.81<br />
4. MSYS<br />
<a href="http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe">http://downloads.sourceforge.net/mingw/MSYS-</a></p>
<p><strong>Pengaturan Netbeans</strong><br />
Setelah Anda menginstall Ogre SDK, Java, Netbeans beserta plugin C/C++, MinGW dan MSYS maka jalankanlah Netbeans. Klik File &#8211;&gt; New Project, lalu pilih kategori C/C++ dan pilih Projects “C/C++ Application”. Beri nama proyek Anda, letakkan pada suatu folder, lalu klik Finish.<br />
<img src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image002-5.jpg" alt="image002" width="450" height="142" />;<br />
<img src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image003-1.gif" alt="image003" width="175" height="105" />;<br />
Sekarang Anda akan ditunjukkan proyek baru C/C++ di sebelah kiri Netbeans. Terdapat empat folder kosong yaitu folder “Header files”, “Resource Files”, “Source Files” dan “Important Files”. Klik kanan pada folder “Source Files”, pilih “Add Existing Item”, lalu tunjuk pada folder “/OgreSDK/samples/src” dan pilihlah file “CameraTrack.cpp”.<br />
Agar proyek “cOgreDemo” dapat di Build, Anda harus melakukan pengaturan terlebih dahulu. Klik kanan pada proyek Anda, lalu pilih Properties. Sebuah proyek C++ di Netbeans memiliki dua konfigurasi, yaitu Debug dan Release. Pilih konfigurasi Debug.</p>
<p>Di dalam Categories, pilihlah Build &#8211;&gt; C++ Compiler. Lalu klik tombol “&#8230;” di dalam “Include Directories” untuk menambah folder include yang diperlukan. Tambahkan “/OgreSDK/include” dan “/OgreSDK/samples/include”. Lakukan hal yang sama pada konfigurasi Release.</p>
<p>Untuk Preprocessor Definitions, tambahkan “WIN_32”, “_DEBUG” dan “_WINDOWS” untuk konfigurasi Debug, dan tambahkan “WIN_32”, “NDEBUG” dan “_WINDOWS” untuk konfigurasi Release.</p>
<p>Sekarang untuk pengaturan Linker, tambahkan file library “OgreMain_d” dan “OIS_d” yang berada di folder “/OgreSDK/bin/debug” dan masukkan folder tersebut ke dalam “Additional Library Directories”. Lakukan hal yang sama untuk konfigurasi Release dengan file library “OgreMain” dan “OIS”. Dan kedua konfigurasi, di “Additional Options”, masukkan pilihan “-Wl,&#8211;enable-auto-image-base, -Wl, &#8211;add-stdcall-alias”.</p>
<p>Saat ini, program Anda telah siap untuk di Build menjadi bentuk executable. Klik kanan pada proyek Anda, lalu pilih menu “Build”. Netbeans akan membuat file executable pada folder proyek Anda.<br />
<img src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image004-6.jpg" alt="image004" width="345" height="159" /><br />
File executable yang tercipta, belum dapat Anda gunakan, karena aplikasi Anda, tidak mengetahui dimana keberadaan file library Ogre yang dibutuhkannya. Cara yang paling mudah untuk melihat contoh aplikasi Ogre adalah dengan mengatur “Run Directory” yang terdapat pada properti proyek Anda di kategori “Run”. Masukkan folder “/OgreSDK/bin/debug” untuk konfigurasi Debug dan “/OgreSDK/bin/release” untuk konfigurasi Release. Sekarang, aplikasi Anda dapat dijalankan melalui Netbeans.<br />
<img src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image005-7.jpg" alt="image005" width="450" height="351" /></p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=103</wfw:commentRss>
		</item>
		<item>
		<title>Pemrograman Game - 1</title>
		<link>http://ajipamungkas.net23.net/?p=92</link>
		<comments>http://ajipamungkas.net23.net/?p=92#comments</comments>
		<pubDate>Mon, 16 Feb 2009 05:15:37 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[Pemrograman Game]]></category>

		<guid isPermaLink="false">http://ajipamungkas.net23.net/?p=92</guid>
		<description><![CDATA[Tujuan
Setelah mempelajari bab ini, Anda diharapkan
- Memahami konsep pemrograman game
- Memahami game-loop/p
- Memahami proses render sebuah game yang real-time
2.1 Game-Loop
Game (digital game) adalah sebuah perangkat lunak (software) yang didalamnya terdapat sebuah perulangan secara terus menerus hingga aplikasi dihentikan, dimana didalam perulangan tersebut, aplikasi berinteraksi dengan penggunanya melalui alat masukan untuk mengikuti alur logika permainan. Perulangan [...]]]></description>
			<content:encoded><![CDATA[<p>Tujuan<br />
Setelah mempelajari bab ini, Anda diharapkan<br />
- Memahami konsep pemrograman game<br />
- Memahami game-loop/p<br />
- Memahami proses render sebuah game yang real-time</p>
<p>2.1 Game-Loop<br />
Game (digital game) adalah sebuah perangkat lunak (software) yang didalamnya terdapat sebuah perulangan secara terus menerus hingga aplikasi dihentikan, dimana didalam perulangan tersebut, aplikasi berinteraksi dengan penggunanya melalui alat masukan untuk mengikuti alur logika permainan. Perulangan tersebut disebut game-loop.</p>
<p><img class="aligncenter" src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image002-1.gif" alt="" width="450" height="409" /><br />
Garis tebal pada gambar di atas adalah garis alir dari game-loop. Dimulai dengan inisialisasi, aplikasi game mulai berjalan. Inisialisasi adalah sebuah proses menyiapkan variabel-variabel dan memberi nilai awal variabel tersebut, menyiapkan ruang memori untuk obyek-obyek game dan juga menyiapkan sebuah jendela. Inti dari proses inisialisasi adalah agar semua hal yang dibutuhkan oleh apliksi telah tersedia sebelum aplikasi memasuki game-loop. Sedangkan proses deinisialiasi, kebalikan dari proses inisialisasi, adalah proses penghapusan ruang memori yang menyimpan obyek-obyek game tersebut, agar ruang memori dapat digunakan oleh aplikasi lain.</p>
<p>Secara garis besar, di dalam game-loop, terdapat empat hal yaitu :<br />
- Update<br />
Update berarti merubah nilai variabel dengan nilai baru. Contohnya update transformasi (posisi, rotasi, skala) obyek di ruang 3D atau update logika permainan. Perubahan transformasi dan perubahan logika dapat dipicu oleh input.<br />
- Membersihkan back-bufferbr<br />
Back-buffer adalah ruang memori untuk tempat penggambaran sementara dari frame, sebelum frame ditampilkan di layar. Arti dari membersihkan back-buffer adalah mewarnai seluruh back-buffer dengan suatu warna tertentu.<br />
- Render back-bufferbr<br />
Frame yang ingin ditampilkan ke layar (on-screen image), di render terlebih dahulu pada back-buffer.<br />
- Tampilkan ke layar monitor<br />
Menyalin back-buffer ke layar agar pengguna dapat melihat tampilan aplikasi game yang ia mainkan.<br />
- Input<br />
Event Input (keyboard, mouse, network) mengirim sinyal ke aplikasi bahwa telah terjadi event dari suatu alat input. Sinyal apa yang diterima ditentukan oleh jenis alat input yang kemudian aplikasi menentukan untuk apa sinyal tersebut. Contoh sinyal yang menyatakan alat input KEYBOARD dengan tombol ESCAPE ditekan adalah untuk menghentikan aplikasi. Tanpa alat input, maka aplikasi game akan menjadi suatu animasi yang hanya ditonton oleh pengguna.</p>
<p style="text-align: left;">2.2 Proses Render Game<br />
Menggunakan back-buffer (off-screen image)  untuk menggambar frame, sebelum frame tersebut ditampilkan ke front-buffer (on-screen image) atau layar monitor, adalah suatu cara yang disebut double-buffering. Cara ini dapat menghilangkan tampilan berkedip-kedip (flicker). Gambar dibawah adalah proses penggambaran sebuah obyek.<br />
<img class="aligncenter" src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image003-6.jpg" alt="" width="450" height="101" /><br />
Proses render sebuah obyek untuk satu frame,<br />
kotak paling kanan menunjukkan bahwa obyek telah selesai digambar</p>
<p style="text-align: center;">Garis merah pada gambar tersebut merupakan batas horisontal dari berapa banyak obyek tersebut telah selesai di render. Bila proses render obyek dilakukan secara langsung pada layar, maka pengguna dapat melihat batas tersebut dan akan mengakibatkan flickering. Oleh karena itu, sebaiknya proses render obyek dilakukan di back-buffer agar pengguna tidak melihat proses render suatu obyek. Dan setelah penggambaran satu frame dinyatakan selesai, barulah kemudian frame tersebut ditampilkan di layar monitor.<br />
<img class="aligncenter" src="http://ajipamungkas.net23.net/wp-content/uploads/2009/02/image009.gif" alt="" width="450" height="442" /></p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=92</wfw:commentRss>
		</item>
		<item>
		<title>Ogre3D</title>
		<link>http://ajipamungkas.net23.net/?p=87</link>
		<comments>http://ajipamungkas.net23.net/?p=87#comments</comments>
		<pubDate>Mon, 16 Feb 2009 02:49:29 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[Ogre3D]]></category>

		<guid isPermaLink="false">http://ajipamungkas.net23.net/?p=87</guid>
		<description><![CDATA[ahh&#8230; sabar ya&#8230; hehe
]]></description>
			<content:encoded><![CDATA[<p>ahh&#8230; sabar ya&#8230; hehe</p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=87</wfw:commentRss>
		</item>
		<item>
		<title>Bab V. Tombol Dan In-Game Menu</title>
		<link>http://ajipamungkas.net23.net/?p=57</link>
		<comments>http://ajipamungkas.net23.net/?p=57#comments</comments>
		<pubDate>Sat, 14 Feb 2009 00:49:40 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[5. Tombol dan In-Game Menu]]></category>

		<guid isPermaLink="false">http://ajirifa.wordpress.com/2009/02/14/bab-v-tombol-dan-in-game-menu/</guid>
		<description><![CDATA[Download BAB5-Tombol Dan In-Game Menu.zip (2.47 MB)
In-game menu, adalah bagian dari game yang terdiri atas beberapa tombol dan berinteraksi dengan pemain melalui alat input (keyboard maupun mouse) untuk mengarahkan pemain menuju sub-bagian dari game loop. Umumnya aplikasi game memiliki in-game menu yang berfungsi untuk berbagai hal dari memulai sebuah game baru (new game), loading game [...]]]></description>
			<content:encoded><![CDATA[<p>Download <strong><a href="http://www.megaupload.com/?d=D5IA0UWF">BAB5-Tombol Dan In-Game Menu.zip</a></strong> (2.47 MB)</p>
<p>In-game menu, adalah bagian dari game yang terdiri atas beberapa tombol dan berinteraksi dengan pemain melalui alat input (keyboard maupun mouse) untuk mengarahkan pemain menuju sub-bagian dari game loop. Umumnya aplikasi game memiliki in-game menu yang berfungsi untuk berbagai hal dari memulai sebuah game baru (new game), loading game yang tersimpan (load game), pengaturan / konfigurasi game (game options) hingga menu untuk keluar dari game (quit game), seperti tampak pada gambar di bawah. Pada bab ini Anda akan mempelajari pembuatan tombol dengan menggunakan sprite.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image002.jpg" alt="image002" width="450" height="360" /></p>
<p>5.1 Menggerakkan kursor mouse</p>
<p>Pada bab sebelumnya, Anda telah melakukan pembuatan sebuah sprite yang ditujukan sebagai kursor mouse. Namun, Anda belum dapat menggerakkan kursor mouse tersebut karena Anda belum membuat fungsi yang memeriksa penekanan tombol dan pergerakan mouse sedangkan device mouse telah Anda buat melalui perintah</p>
<p>DirectInput-&gt;CreateDevice(GUID_SysMouse, &amp;DIDeviceMouse, NULL)</p>
<p>Sebuah mouse umumnya terdiri atas 3 tombol (tombol kiri, tombol tengah yang beroda, tombol kanan). Pergerakkannya pun dapat dianggap berada pada sumbu x, y dan z. Perhatikan gambar mouse di bawah ini :</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image003.jpg" alt="image003" width="279" height="270" /></p>
<p>Di pasaran, sebuah mouse pasti memiliki tombol kiri dan tombol kanan tetapi belum tentu memiliki tombol tengah yang beroda (wheel). Ada juga yang memiliki tombol tengah yang tidak beroda. Untuk menggunakan device mouse, Anda panggil perintah Acquire dan kemudian menyimpan data penekanan dan pergerakan mouse pada struktur DIMOUSESTATE melalui perintah GetDeviceState.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>typedef struct DIMOUSESTATE {</strong><strong> LONG lX;</strong></p>
<p><strong> LONG lY;</strong></p>
<p><strong> LONG lZ;</strong></p>
<p><strong> BYTE rgbButtons[4];</strong></p>
<p><strong>} DIMOUSESTATE, *LPDIMOUSESTATE;</strong></td>
</tr>
</tbody>
</table>
<p>Variabel lX, lY dan lZ digunakan untuk menyimpan pergerakan mouse. Nilai variabel tersebut akan berisi 0, 1 dan -1. Bila bernilai 0, mouse diartikan tidak bergerak pada sumbu tersebut, bila bernilai 1, mouse diartikan sedang bergerak ke kanan(X+) / atas(Y+) / maju(Z+) dan bila bernilai -1, mouse diartikan sedang bergerak ke kiri(X-) / bawah(Y-) / mundur(Z-). Array rgbButtons menentukan apakah tombol-tombol mouse ditekan(di klik) atau tidak.</p>
<p>Struktur DIMOUSESTATE ini menganggap terdapat maksimal empat tombol pada mouse. Walaupun saya belum pernah menggunakan tombol keempat, tetapi saya pernah melihat sebuah mouse dengan tombol keempat pada sisi mouse. Tombol rgbButtons[0] adalah tombol kiri mouse, rgbButtons[1] adalah tombol kanan mouse, rgbButtons[2] adalah tombol tengah mouse dan rgbButtons[3] adalah tombol keempat mouse yang, mungkin, terletak di sisi mouse. Perintah Acquire dan GetDeviceState dilakukan setiap frame di dalam game loop.</p>
<p>Untuk keyboard, sama seperti mouse yang harus di cek setiap frame penekanan tombolnya bila ingin digunakan di dalam game. Namun, data penekanan tombol keyboard disimpan dalam array sebanyak 256 buah. Untuk memudahkan programmer, DirectInput telah mendefinisikan ulang isi array tersebut agar mudah diingat. Contohnya nilai array 0&#215;01 adalah DIK_ESCAPE (tombol ESC), 0&#215;02 adalah DIK_1 (angka 1), 0&#215;1E adalah DIK_A (huruf A), dsb. Untuk melihat keseluruhan definisi tersebut, lihat dokumentasi DirectX tentang “Keyboard Device Enumerated Type”.</p>
<p>Agar device keyboard dan mouse dapat digunakan di dalam game, tiap device harus memeriksa apakah terjadi penekanan tombol atau tidak. Bila terjadi penekanan tombol, maka ambil data tombol apa yang ditekan oleh pemain. Karena dimungkinkan device keyboard maupun mouse digunakan oleh aplikasi lain, maka Anda harus terus memanggil perintah Acquire sebelum mengambil state dari device. Fungsi AmbilMasukan() berikut akan melakukan tugas tersebut. Fungsi ini akan terus dipanggil sebelum proses render dilakukan. Ketikkan fungsi ini di dalam file “Gameku.cpp”.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>VOID AmbilMasukan()</strong><strong>{</strong></p>
<p><strong> if (FAILED(DIDeviceKeyboard-&gt;Acquire())) { DIDeviceKeyboard-&gt;Acquire();}</strong></p>
<p><strong> else</strong></p>
<p><strong> {</strong></p>
<p><strong> DIDeviceKeyboard-&gt;GetDeviceState(sizeof(TombolYangDitekan),</strong></p>
<p><strong> (LPVOID)&amp;TombolYangDitekan);</strong></p>
<p><strong> }</strong></p>
<p><strong> if (FAILED(DIDeviceMouse-&gt;Acquire())) { DIDeviceKeyboard-&gt;Acquire();}</strong></p>
<p><strong> else</strong></p>
<p><strong> {</strong></p>
<p><strong> DIDeviceMouse-&gt;GetDeviceState( sizeof(DIMOUSESTATE), &amp;mouse_state );</strong></p>
<p><strong> }</strong></p>
<p><strong>}</strong></p>
<p>VOID Render()</p>
<p>{</p>
<p><strong>AmbilMasukan();</strong></p>
<p>Direct3DDevice -&gt; Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,</p>
<p>D3DCOLOR_XRGB(0,0,0),1.0f,0);</p>
<p>&#8230;</p>
<p>Direct3DDevice -&gt; Present(NULL,NULL,NULL,NULL);</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>Sekarang Anda akan membuat fungsi untuk menggerakkan kursor mouse. Umumnya kursor mouse adalah sprite 2D, walaupun dimungkinkan untuk menggunakan obyek 3D sebagai kursor mouse. Pada bab ini, Anda hanya menggunakan sprite 2D sebagai kursor mouse. Oleh karena itu, Anda hanya membutuhkan pergerakan mouse pada sumbu X dan sumbu Z saja. Ketikkan kode yang ditebalkan berikut di dalam file “DirectXku.h” :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>char TextPembuka[JumTeks][256];char temptext[256];</p>
<p><strong>float fPosKursorX, fPosKursorY;</strong></p>
<p><strong>VOID UpdateKursorMouse(float LebarJendela, float TinggiJendela)</strong></p>
<p><strong>{</strong></p>
<p><strong> fPosKursorX += mouse_state.lX;</strong></p>
<p><strong> fPosKursorY += mouse_state.lY;</strong></p>
<p><strong> if (fPosKursorX&lt;0) { fPosKursorX = 0;}</strong></p>
<p><strong> if (fPosKursorY&lt;0) { fPosKursorY = 0;}</strong></p>
<p><strong> if (fPosKursorX&gt;LebarJendela) { fPosKursorX = LebarJendela;}</strong></p>
<p><strong> if (fPosKursorY&gt;TinggiJendela) { fPosKursorY = TinggiJendela;}</strong></p>
<p><strong>}</strong></td>
</tr>
</tbody>
</table>
<p>Dan ketikkan kode yang ditebalkan berikut di dalam file &#8220;Gameku.cpp&#8221; :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID Render(){</p>
<p>AmbilMasukan();</p>
<p><strong>UpdateKursorMouse(640.0f,480.0f);</strong></p>
<p>Direct3DDevice -&gt; Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,</p>
<p>D3DCOLOR_XRGB(0,0,0),1.0f,0);</p>
<p>Direct3DDevice -&gt; BeginScene();</p>
<p>spSplashScreen.RenderSprite(Direct3DDevice,0,0);</p>
<p><strong>spKursorMouse.RenderSprite(Direct3DDevice,PosKursorX,PosKursorY);</strong></p>
<p>Direct3DDevice -&gt; EndScene();</p>
<p>Direct3DDevice -&gt; Present(NULL,NULL,NULL,NULL);</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>Dua variabel yang menyimpan posisi kursor mouse pada sumbu X dan Y adalah fPosKursorX dan fPosKursorY. Nilai variabel tersebut akan bertambah satu bila mouse bergeser ke kanan (X) atau ke atas (Y). Begitu pula sebaliknya. Agar posisi kursor tidak melebihi ukuran jendela maka perlu ditetapkan batas-batas pergerakan kursor mouse.</p>
<p>Fungsi UpdateKursorMouse() dipanggil di dalam fungsi Render(). Kemudian nilai dari PosKursorX dan PosKursorY digunakan oleh spKursorMouse sebagai posisi penempatan obyek sprite tersebut.</p>
<p>Tidak sulit bukan ? Sekarang build aplikasi Anda. Dan perhatikan apa yang terjadi dengan kursor mouse pada saat Anda menggerakkan mouse.</p>
<p>5.2 Membuat Tombol</p>
<p>Anda akan membuat tombol dari beberapa sprite yang menyatakan keadaan ketika kursor mouse berada di atas tombol, tidak berada di atas tombol, dan ketika tombol ditekan.</p>
<table border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td width="103" valign="top"><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image004.jpg" alt="image004" width="94" height="38" /></td>
<td width="487" valign="top"><span>(<em>over</em>)</span><span>keadaan ketika kursor mouse berada di atas tombol</span></p>
<p><span>file : tombolover.png 131&#215;43pixel </span></td>
</tr>
<tr>
<td width="103" valign="top"><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image005.jpg" alt="image005" width="96" height="37" /></td>
<td width="487" valign="top">(<em>off</em>)<span>keadaan ketika kursor mouse tidak berada di atas tombol</span></p>
<p><span>file : tomboloff.png 131&#215;43pixel</span></td>
</tr>
<tr>
<td width="103" valign="top"><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image006.jpg" alt="image006" width="91" height="36" /></td>
<td width="487" valign="top"><span>(<em>on</em>)</span><span>keadaan ketika tombol di klik</span></p>
<p><span>file : tombolon.png 131&#215;43pixel</span></td>
</tr>
</tbody>
</table>
<p>Karena Tombol sebenarnya adalah tiga buah sprite berukuran sama yang dalam proses render hanya salah satu dari ketiga sprite tersebut yang digambar, maka sebelum mendeklarasikan sebuah tombol, Anda perlu melakukan inisialisasi ketiga sprite tersebut. Variabel-variabel dan fungsi-fungsi yang dibutuhkan adalah sebagai berikut, ketik di dalam file “DirectKu.h” :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>class Tombol</strong><strong>{</strong></p>
<p><strong>public :</strong></p>
<p><strong>float fPosX;</strong></p>
<p><strong>float fPosY;</strong></p>
<p><strong>int iLebar;</strong></p>
<p><strong>int iTinggi;</strong></p>
<p><strong>ObyekSprite* spTomOff;</strong></p>
<p><strong>ObyekSprite* spTomOn;</strong></p>
<p><strong>ObyekSprite* spTomOver;</strong></p>
<p><strong>bool bTombolOn;</strong></p>
<p><strong>bool bTombolOver;</strong></p>
<p><strong>bool bTombolUp;</strong></p>
<p><strong>VOID Init(ObyekSprite* TomOff, ObyekSprite* TomOn, ObyekSprite* TomOver);</strong></p>
<p><strong>VOID RenderDanCekStatusTombol(LPDIRECT3DDEVICE9 m_pd3dDevice);</strong></p>
<p><strong>};</strong></td>
</tr>
</tbody>
</table>
<table class="MsoTableGrid" style="border-bottom:medium none;border-left:medium none;border-collapse:collapse;border-top:medium none;border-right:medium none;" border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">Variabel / Fungsi</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">Keterangan</span></strong></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">float <strong>fPosX, fPosY</strong></span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Posisi tombol relatif terhadap kiri atas layar</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">int <strong>iLebar</strong>,<strong>iTinggi</strong></span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Ukuran tombol</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">ObyekSprite*</span></p>
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">spTomOff, spTomOn, spTomOver</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Pointer ke obyek sprite yang dibutuhkan sebagai kondisi tombol <em>off</em>, <em>on</em> dan <em>over</em></span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">bool <strong>bTombolOn</strong></span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Bernilai TRUE bila tombol diklik</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">bool <strong>bTombolOver</strong></span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Bernilai TRUE bila kursor berada di atas mouse</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Bernilai FALSE bila kursor tidak berada di atas mouse</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 126.9pt;" width="169" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">bool <strong>bTombolUp</strong></span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 315.9pt;" width="421" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Bernilai TRUE bila tombol kiri mouse telah selesai ditekan, berguna untuk Tombol yang hanya sekali diklik saja</span></p>
</td>
</tr>
</tbody>
</table>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>VOID Tombol::Init(ObyekSprite* TomOff, ObyekSprite* TomOn, ObyekSprite* TomOver )</strong><strong>{</strong></p>
<p><strong> if (TomOff == NULL || TomOn == NULL || TomOver == NULL)</strong></p>
<p><strong> {</strong></p>
<p><strong> MessageBox(NULL,&#8221;Salah satu sprite untuk tombol belum diinisialisasikan&#8221;,</strong></p>
<p><strong> NULL,MB_OK);</strong></p>
<p><strong> }</strong></p>
<p><strong> else</strong></p>
<p><strong> {</strong></p>
<p><strong> spTomOff = TomOff; spTomOn = TomOn; spTomOver = TomOver;</strong></p>
<p><strong> iLebar = spTomOff-&gt;SpriteInfo.Width;</strong></p>
<p><strong> iTinggi = spTomOff-&gt;SpriteInfo.Height;</strong></p>
<p><strong> }</strong></p>
<p><strong>}</strong></td>
</tr>
</tbody>
</table>
<p>Fungsi Tombol::Init() hanya melakukan penunjukkan pada obyek sprite yang digunakan sebagai penampakan kondisi-kondisi Tombol. Di dalam fungsi ini juga dilakukan penentuan ukuran Tombol, yang pada awalnya ditentukan oleh ukuran sprite spTomOff. Jadi sebaiknya, gunakanlah ukuran sprite yang sama untuk tiap-tiap kondisi Tombol.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>VOID Tombol::RenderDanCekStatusTombol(LPDIRECT3DDEVICE9 m_pd3dDevice)</strong><strong>{</strong></p>
<p><strong> if ((fPosKursorX &gt; fPosX)&amp;&amp;(fPosKursorX &lt;fPosX + iLebar)</strong></p>
<p><strong> &amp;&amp;(fPosKursorY &gt; fPosY)&amp;&amp;(fPosKursorY &lt; fPosY + iTinggi))</strong></p>
<p><strong> {</strong></p>
<p><strong> bTombolOver = TRUE; bTombolUp = FALSE;</strong></p>
<p><strong> if (mouse_state.rgbButtons[0])</strong></p>
<p><strong> {</strong></p>
<p><strong> bTombolOn = TRUE;</strong></p>
<p><strong> }</strong></p>
<p><strong> }</strong></p>
<p><strong> else</strong></p>
<p><strong> {</strong></p>
<p><strong> bTombolOver = FALSE;bTombolUp = FALSE;bTombolOn= FALSE;</strong></p>
<p><strong> }</strong></p>
<p><strong> if ((mouse_state.rgbButtons[0]==0)&amp;&amp;(bTombolOn==TRUE))</strong></p>
<p><strong> {</strong></p>
<p><strong> bTombolUp = TRUE;bTombolOn = FALSE;</strong></p>
<p><strong> }</strong></p>
<p><strong> if ((bTombolOn == TRUE))</strong></p>
<p><strong> {</strong></p>
<p><strong> spTomOn-&gt;RenderSprite(m_pd3dDevice,fPosX,fPosY);</strong></p>
<p><strong> }</strong></p>
<p><strong> if ((bTombolOn == FALSE)&amp;&amp;(bTombolOver == TRUE))</strong></p>
<p><strong> {</strong></p>
<p><strong> spTomOver-&gt;RenderSprite(m_pd3dDevice,fPosX,fPosY);</strong></p>
<p><strong> }</strong></p>
<p><strong> if ((bTombolOn == FALSE)&amp;&amp;(bTombolOver == FALSE))</strong></p>
<p><strong> {</strong></p>
<p><strong> spTomOff-&gt;RenderSprite(m_pd3dDevice,fPosX,fPosY);</strong></p>
<p><strong> }</strong></p>
<p><strong>}</strong></td>
</tr>
</tbody>
</table>
<p>Fungsi Tombol::RenderDanCekStatusTombol() akan memeriksa posisi kursor mouse pada layar dan penekanan mouse, dan kemudian mengubah status tombol berdasarkan posisi kursor mouse dan penekanan mouse tersebut, apakah kursor mouse sedang berada di atas tombol (bTombolOver = TRUE), tombol sedang ditekan (bTombolOn = TRUE) atau tombol selesai ditekan (bTombolUp = TRUE). Setelah menentukan status tombol, Tombol::RenderDanCekStatusTombol() akan menentukan sprite yang mana yang harus ditampilkan.</p>
<p>5.3 Menggunakan Class Tombol</p>
<p>Class Tombol diatas membutuhkan tiga buah sprite, oleh karena itu hal yang perlu Anda lakukan adalah inisialisasi sprite-sprite tersebut. Saya akan memberi contoh penggunaan dua buah tombol. Dua buah tombol tersebut menggunakan sprite-sprite yang sama untuk menghemat memori. Pendeklarasian dilakukan seperti biasa yaitu :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>ObyekSprite spTombolOff;</strong><strong>ObyekSprite spTombolOn;</strong></p>
<p><strong>ObyekSprite spTombolOver;</strong></td>
</tr>
</tbody>
</table>
<p>Kemudian dilanjutkan dengan inisialisasi sprite-sprite tersebut saat aplikasi game pertama kali dijalankan.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID InitObyekGame(){</p>
<p>&#8230;</p>
<p><strong>spTombolOff.InisialisasiSprite(Direct3DDevice,&#8221;bitmap/tomboloff.png&#8221;);</strong></p>
<p><strong> spTombolOn.InisialisasiSprite(Direct3DDevice,&#8221;bitmap/tombolon.png&#8221;);</strong></p>
<p><strong> spTombolOver.InisialisasiSprite(Direct3DDevice,&#8221;bitmap/tombolover.png&#8221;);</strong></p>
<p><strong> spTombolOff.bPNGAlpha = spTombolOn.bPNGAlpha = spTombolOver.bPNGAlpha = TRUE;</strong></p>
<p>&#8230;</p>
<p>}<strong> </strong></td>
</tr>
</tbody>
</table>
<p>Dan juga penghapusan sprite dari ruang memori bila aplikasi game dihentikan.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID HapusObyekGame(){</p>
<p>&#8230;</p>
<p><strong> spTombolOff.HapusSprite();</strong></p>
<p><strong> spTombolOn.HapusSprite();</strong></p>
<p><strong> spTombolOver.HapusSprite();</strong></p>
<p>}<strong> </strong></td>
</tr>
</tbody>
</table>
<p>Bila pada penggunaan sprite bukan tombol, Anda mungkin sudah menuliskan perintah untuk penggambaran sprite di dalam fungsi Render(). Namun untuk penggunaan sprite tombol, proses penggambaran sprite tombol dilakukan oleh fungsi Tombol::RenderDanCekStatusTombol().</p>
<p>Deklarasikan dua buah tombol, satu untuk memulai permainan dan yang lain untuk menghentikan aplikasi.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>Tombol tomMulai;Tombol tomKeluar;</td>
</tr>
</tbody>
</table>
<p>Inisialisasikan kedua buah tombol tersebut agar menggunakan tiga buah sprite.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID InitObyekGame(){</p>
<p>&#8230;</p>
<p>spTombolOff.bPNGAlpha = spTombolOn.bPNGAlpha = spTombolOver.bPNGAlpha = TRUE;</p>
<p><strong> tomMulai.Init(&amp;spTombolOff,&amp;spTombolOn,&amp;spTombolOver);</strong></p>
<p><strong> tomKeluar.Init(&amp;spTombolOff,&amp;spTombolOn,&amp;spTombolOver);</strong></p>
<p>}</td>
</tr>
</tbody>
</table>
<p>Kini kedua tombol Anda telah siap digunakan. Perhatikan pada fungsi Render(). Ketik kode tebal di bawah ini :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID Render(){</p>
<p><strong>&#8230;</strong></p>
<p>spSplashScreen.RenderSprite(Direct3DDevice,0,0);</p>
<p><strong> tomMulai.fPosX = 425.0f; tomMulai.fPosY = 150.0f;</strong></p>
<p><strong> tomMulai.RenderDanCekStatusTombol(Direct3DDevice);</strong></p>
<p><strong> RenderTeks(&#8221;MULAI&#8221;, 450, 165, D3DCOLOR_XRGB(255,255,255));</strong></p>
<p><strong> if (tomMulai.bTombolOn == TRUE)</strong></p>
<p><strong> {</strong></p>
<p><strong> RenderTeks(&#8221;tomMulai Ditekan&#8230;&#8221;, 0, 0, D3DCOLOR_XRGB(255,255,255));</strong></p>
<p><strong> }</strong></p>
<p><strong> tomKeluar.fPosX = 450.0f; tomKeluar.fPosY = 190.0f;</strong></p>
<p><strong> tomKeluar.RenderDanCekStatusTombol(Direct3DDevice);</strong></p>
<p><strong> RenderTeks(&#8221;KELUAR&#8221;, 475, 205, D3DCOLOR_XRGB(255,255,255));</strong></p>
<p><strong> if (tomKeluar.bTombolUp)</strong></p>
<p><strong> {</strong></p>
<p><strong> bKeluar = TRUE;</strong></p>
<p><strong> }</strong></p>
<p>spKursorMouse.RenderSprite(Direct3DDevice,fPosKursorX,fPosKursorY);</p>
<p>&#8230;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>Untuk tomMulai, posisinya pada layar adalah (425,150). Di atas tombol tersebut digambar teks “MULAI” pada posisi (450, 165). Untuk tomKeluar, posisinya pada layar adalah (450,190). Di atas tombol tersebut digambar teks “KELUAR” pada posisi (475, 205). Bila mouse ditekan pada tomMulai, status tombol bTombolOn pada tomMulai menjadi TRUE, maka aplikasi akan menampilkan teks &#8220;tomMulai Ditekan&#8230;&#8221;. Bila mouse ditekan pada tomKeluar dan kemudian mouse tidak ditekan lagi, status tombol bTombolUp pada tomKeluar menjadi TRUE, maka aplikasi akan merubah nilai bKeluar menjadi TRUE yang berarti aplikasi dihentikan.</p>
<p>Perhatikan, bahwa penggambaran tombol-tombol dilakukan setelah penggambaran spSplashScreen dan sebelum penggambaran spKursorMouse. Anda harus memperhatikan urutan penggambaran obyek sprite pada back-buffer. Sprite yang berada paling belakang digambar paling awal, dalam kasus ini adalah spSplashScreen, dan sprite yang berada paling depan digambar paling akhir, dalam kasus ini adalah spKursorMouse.</p>
<p>Build dan jalankan aplikasi Anda. Dua gambar di bawah menunjukkan kondisi ketika kursor mouse sedang berada di atas salah satu tombol dan ketika salah satu tombol terus ditekan.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image007.jpg" alt="image007" width="322" height="242" /></p>
<p>ketika kursor mouse menekan sebuah tombol</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Tombol Dan InGame Menu_ilkom_files/image008.jpg" alt="image008" width="322" height="242" /></p>
<p>ketika kursor mouse di atas sebuah tombol</p>
<p>Perhatikan bahwa ketika tombol MULAI terus ditekan, teks “tomMulai Ditekan” terus ditampilkan. Sedangkan pada tombol KELUAR, ketika tombol KELUAR selesai ditekan, aplikasi akan dihentikan. Itulah perbedaan penggunaan status tombol, bahwa bTombolOn digunakan untuk tombol yang terus ditekan sedangkan bTombolUp digunakan untuk tombol yang sekali ditekan.</p>
<p>Dua tombol tersebut menunjukkan bahwa Anda telah membuat in-game menu yang berfungsi untuk mengarahkan pemain agar memulai permainan atau menghentikan aplikasi.</p>
<p>5.4 FAQ (Frequently Asked Questions)</p>
<p>Semoga FAQ ini dapat membantu Anda bila mendapat kesulitan&#8230;</p>
<p>Tanya : Mouse ?</p>
<p>Jawab : Karena pada fungsi ObyekSprite::InisialisasiSprite(), digunakan D3DPOOL_MANAGED untuk membuat vertex buffer, maka DirectX mengatur secara otomatis, apakah vertex buffer akan dibuat pada memori sistem atau memori kartu grafik. Kegagalan tersebut terjadi karena salah satu atau kedua memori tersebut telah penuh.</p>
<p>Tanya : Mengapa pada saat aplikasi melakukan inisialisasi sprite, muncul kotak pesan “Gagal : Loading Bitmap &#8220;Splash.BMP&#8221;.” ?</p>
<p>Jawab : Kegagalan tersebut terjadi karena aplikasi tidak dapat menemukan file “Splash.BMP” atau dapat juga terjadi karena memori sistem atau memori kartu grafik telah penuh.</p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=57</wfw:commentRss>
		</item>
		<item>
		<title>Bab IV. Sprite 2D</title>
		<link>http://ajipamungkas.net23.net/?p=49</link>
		<comments>http://ajipamungkas.net23.net/?p=49#comments</comments>
		<pubDate>Sat, 14 Feb 2009 00:15:59 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[4. Sprite 2D]]></category>

		<guid isPermaLink="false">http://ajirifa.wordpress.com/2009/02/14/bab-iv-sprite-2d/</guid>
		<description><![CDATA[Download BAB4-Sprite.zip (1.24 MB)

Pada bab ini, kita akan mempelajari mengenai sprite. Sprite sebagai komponen sebuah game, sangatlah penting untuk dipelajari. Didalam sebuah game, sprite dapat digunakan untuk splash-screen (layar pembuka), HUD (heads-up display), kursor mouse, maupun sebagai tombol bertekstur. Bab ini merupakan lanjutan dari bab sebelumnya, dimana source-code dari bab sebelumnya akan ditambahkan dengan kode-kode [...]]]></description>
			<content:encoded><![CDATA[<p>Download <a href="http://www.megaupload.com/?d=YG1CD3DL"><strong>BAB4-Sprite.zip</strong> (1.24 MB)<br />
</a><br />
Pada bab ini, kita akan mempelajari mengenai sprite. Sprite sebagai komponen sebuah game, sangatlah penting untuk dipelajari. Didalam sebuah game, sprite dapat digunakan untuk splash-screen (layar pembuka), HUD (heads-up display), kursor mouse, maupun sebagai tombol bertekstur. Bab ini merupakan lanjutan dari bab sebelumnya, dimana source-code dari bab sebelumnya akan ditambahkan dengan kode-kode untuk pembuatan dan penggunaan sprite.</p>
<p>Jalankan VisualC++ dan buka file “Gameku.dsw” pada folder “\BAB4-Sprite\sebelum”. Hapus fungsi GameLoop() di dalam file “Gameku.cpp”.</p>
<p>4.1 Sprite 2D</p>
<p>Pada DirectX versi 8 ke atas, DirectDraw tidak digunakan lagi untuk penggambaran obyek dua dimensi. Fungsi untuk melakukan hal tersebut telah diambil alih oleh DirectXGraphics. Walaupun DirectX memiliki interface sendiri untuk proses penggambaran sprite pada layar, yaitu ID3DXSPRITE, namun saya tidak menggunakan interface tersebut di dalam bab ini. Mengapa? Karena dengan membuat class sprite sendiri, Anda dapat belajar tentang loading bitmap untuk tekstur, mengerti tentang penggunaan vertex di dalam pembuatan polygon dan proses penggambaran polygon beserta teksturnya pada back buffer.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Sprite_ilkom_files/image002.jpg" alt="image002" width="450" height="299" /></p>
<p>Perhatikan gambar di atas. Dalam pembuatan sprite, Anda membutuhkan empat buah vertex untuk membuat sebuah bujur sangkar. Bujur sangkar tersebut kemudian “diisi” dengan tekstur bergambar. Lebar dan tinggi bujur sangkar dibuat sama seperti lebar dan tinggi tekstur.</p>
<p>Dengan menggunakan metode Triangle Strips yang ada pada DirectX, Anda dapat membuat sebuah bujur sangkar dari dua buah polygon yang dibentuk oleh empat buah vertex. Polygon pertama dibentuk oleh vertex0, vertex1 dan vertex2. Polygon kedua dibentuk oleh vertex1, vertex2 dan vertex3.</p>
<p>Setiap vertex membutuhkan data posisi, warna, koordinat UV dan FVF yang digunakan. Anda pasti sudah mengerti maksud posisi dan warna vertex, tapi apa itu UV dan FVF. UV adalah koordinat tekstur yang menentukan bagaimana tekstur “ditempelkan” ke polygon (Lihat Dokumentasi DirectX mengenai Texture Wrapping), sedangkan FVF (Flexible Vertex Format) adalah format vertex untuk memberitahukan kepada sistem render bagaimana DirectX akan me-render vertex tersebut (Lihat Dokumentasi DirectX mengenai D3DFVF).</p>
<p>Posisi, warna, UV dan FVF vertex pembentuk sprite dinyatakan dalam sebuah struktur, yaitu SPRITEVERTEX. Ketikkan kode-kode yang ditebalkan dibawah ini untuk membuat struktur SPRITEVERTEX.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID HapusSemuaObyekDirectX()<br />
{<br />
&#8230;<br />
}</p>
<p><strong>struct SPRITEVERTEX </strong><br />
<strong>{</strong><br />
<strong> D3DXVECTOR4 p;</strong><br />
<strong> DWORD       color;</strong><br />
<strong> FLOAT       tu, tv;</strong><br />
<strong> static const DWORD FVF;</strong><br />
<strong>};</strong><br />
<strong>const DWORD SPRITEVERTEX::FVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1;</strong></td>
</tr>
</tbody>
</table>
<p>DirectX memiliki berbagai FVF yang dapat digunakan. Tetapi penggunaan FVF perlu memperhatikan kemampuan kartu grafik saat memproses vertex-vertex dengan format tersebut. Untuk sprite, Anda hanya memerlukan tiga buah format saja yaitu D3DFVF_XYZRHW, D3DFVF_DIFFUSE dan D3DFVF_TEX1. Berikut keterangannya :</p>
<p>1. D3DFVF_XYZRHW</p>
<p>Posisi vertex dapat ditransformasikan.</p>
<p>2. D3DFVF_DIFFUSE</p>
<p>Menggunakan komponen warna.</p>
<p>3. D3DFVF_TEX1</p>
<p>Menggunakan tekstur koordinat nomor 1.</p>
<p>Sekarang Anda akan membuat sebuah class yang mewakili penggunaan sprite dalam aplikasi DirectX Anda. Ketikkan kode di bawah ini :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>class ObyekSprite<br />
{<br />
public :<br />
LPDIRECT3DVERTEXBUFFER9           SpriteVB;<br />
LPDIRECT3DTEXTURE9         TeksturSprite;<br />
D3DXIMAGE_INFO                    SpriteInfo;<br />
SPRITEVERTEX*              vSpriteVertex;</p>
<p>bool bPNGAlpha;</p>
<p>HRESULT InisialisasiSprite(LPDIRECT3DDEVICE9 m_pd3dDevice,LPCTSTR    NamaFileBMP);<br />
VOID HapusSprite();<br />
VOID RenderSprite(LPDIRECT3DDEVICE9 m_pd3dDevice,float PosX, float PosY);<br />
};</td>
</tr>
</tbody>
</table>
<p>Dua interface DirectX digunakan yaitu IDirect3DVertexBuffer9 (ditunjuk oleh variabel SpriteVB) dan IDirect3DTexture9 (ditunjuk oleh variabel TeksturSprite). Struktur D3DXIMAGE_INFO digunakan untuk mengambil informasi bitmap sebagai tekstur sprite. Struktur SPRITEVERTEX telah dijelaskan sebelumnya. Variabel bPNGAlpha, digunakan untuk menentukan apakah tekstur sprite memiliki transparansi (format PNG) atau tidak memiliki transparansi (format BMP). Fungsi InisialisasiSprite akan melakukan tugas inisialisasi sprite dimana parameter yang diperlukan adalah device Direct3D dan nama file bitmap tekstur sprite.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>HRESULT ObyekSprite::InisialisasiSprite(LPDIRECT3DDEVICE9 m_pd3dDevice,<br />
LPCTSTR NamaFileBMP)<br />
{<br />
//buat vertex buffer<br />
if( FAILED( m_pd3dDevice-&gt;CreateVertexBuffer( 4*sizeof(SPRITEVERTEX),<br />
D3DUSAGE_WRITEONLY, SPRITEVERTEX::FVF,<br />
D3DPOOL_MANAGED, &amp;SpriteVB, NULL ) ) )<br />
{<br />
sprintf(temptext,&#8221;Gagal : Vertex Buffer Untuk \&#8221;%s\&#8221;.&#8221;,<br />
NamaFileBMP);<br />
MessageBox(NULL,temptext,NULL,MB_OK);<br />
return E_FAIL;<br />
}<br />
else<br />
{<br />
// jika berhasil membuat vertex buffer, load bitmap untuk tekstur<br />
if (FAILED(D3DXCreateTextureFromFileEx(<br />
m_pd3dDevice,<br />
NamaFileBMP,<br />
0, 0, 0, 0, D3DFMT_A8R8G8B8,<br />
D3DPOOL_MANAGED, D3DX_DEFAULT,<br />
D3DX_DEFAULT, D3DCOLOR_XRGB(0,0,0),<br />
NULL, NULL,<br />
&amp;TeksturSprite<br />
)))<br />
{<br />
sprintf(temptext,&#8221;Gagal : Loading Bitmap \&#8221;%s\&#8221;.&#8221;,<br />
NamaFileBMP);<br />
MessageBox(NULL,temptext,NULL,MB_OK);<br />
return E_FAIL;<br />
}<br />
else<br />
{<br />
// jika berhasil load bitmap, ambil informasi tentang bitmap tersebut<br />
D3DXGetImageInfoFromFile(NamaFileBMP, &amp;SpriteInfo);<br />
}<br />
}<br />
bPNGAlpha = FALSE;<br />
return S_OK;<br />
}</td>
</tr>
</tbody>
</table>
<p>Hal yang pertama Anda lakukan pada fungsi <strong>InisialisasiSprite()</strong> adalah membuat vertex buffer. Apa itu vertex buffer ? Vertex buffer adalah ruang memori yang menyimpan informasi vertex. Device Direct3D membuat vertex buffer melalui perintah CreateVertexBuffer. Berikut keterangan pengisian parameter perintah CreateVertexBuffer pada kode di atas:</p>
<table class="MsoTableGrid" style="border-bottom:medium none;border-left:medium none;border-collapse:collapse;border-top:medium none;border-right:medium none;" border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">No</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">Isi</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">Keterangan</span></strong></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">1</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">4*sizeof(SPRITEVERTEX)</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">Karena hanya dibutuhkan empat vertex, maka besar <em>vertex buffer</em> adalah empat kali ukuran struktur SPRITEVERTEX.</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">2</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">D3DUSAGE_WRITEONLY</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="line-height:150%;"><em><span style="line-height:150%;font-family:Courier;font-size:8pt;">Vertex buffer</span></em> <span style="line-height:150%;font-family:Courier;font-size:8pt;">hanya akan ditulisi. Lihat Dokumentasi DirectX mengenai D3DUSAGE.</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">3</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">SPRITEVERTEX::FVF</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">Format vertex untuk <em>vertex buffer</em> ini adalah fvf pada struktur SPRITEVERTEX</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">4</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">D3DPOOL_MANAGED</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">Vertex Buffer diletakkan di memori sistem komputer. Lihat Dokumentasi DirectX mengenai D3DPOOL.</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">5</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">&amp;SpriteVB</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">Representasi <em>vertex buffer</em> yang akan dibuat.</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 23.4pt;" width="31">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">6</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 1.75in;" width="168">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">NULL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 293.4pt;" width="391">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:8pt;">Tidak digunakan lagi. Isi dengan NULL.</span></p>
</td>
</tr>
</tbody>
</table>
<p class="Default" style="text-align:justify;line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;"> </span></strong> <span style="line-height:150%;font-family:Courier;font-size:10pt;">Bila <em>vertex buffer</em> berhasil dibuat, hal berikutnya adalah membuat tekstur sprite. Tekstur dibuat dari file bitmap melalui perintah</span> <strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">D3DXCreateTextureFromFileEx</span></strong><span style="line-height:150%;font-family:Courier;font-size:8pt;">.</span> <span style="line-height:150%;font-family:Courier;font-size:10pt;">Perintah ini memiliki parameter yang cukup banyak untuk dijelaskan. Lihat dokumentasi DirectX tentang perintah tersebut.</span></p>
<p class="Default" style="text-align:justify;line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;"> Bila <em>Vertex buffer</em> dan tekstur telah berhasil dibuat di memori, hal berikutnya adalah mengambil informasi tekstur, kita memerlukan informasi panjang dan tinggi tekstur untuk menentukan panjang dan tinggi bujur sangkar.</span></p>
<p class="Default" style="text-align:justify;line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;"> Ketikkan kode berikut ini untuk membuat fungsi <strong>RenderSprite</strong>:</span></p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID ObyekSprite::RenderSprite(LPDIRECT3DDEVICE9 m_pd3dDevice,float PosX, float PosY)<br />
{<br />
SpriteVB-&gt;Lock( 0, 0, (void**)&amp;vSpriteVertex, 0 );<br />
for( UINT i=0; i&lt;4; i ++ )<br />
{   vSpriteVertex[i].p = D3DXVECTOR4( 0.0f, 0.0f, 0.9f, 1.0f );<br />
vSpriteVertex[i].color = 0xffffffff;<br />
}<br />
// vertex 0 di kiri bawah<br />
vSpriteVertex[0].p.x = PosX;<br />
vSpriteVertex[0].p.y = PosY+SpriteInfo.Height;<br />
// vertex 1 di kiri atas<br />
vSpriteVertex[1].p.x = PosX;<br />
vSpriteVertex[1].p.y = PosY;<br />
// vertex 2 di kanan bawah<br />
vSpriteVertex[2].p.x = PosX+SpriteInfo.Width;<br />
vSpriteVertex[2].p.y = PosY+SpriteInfo.Height;<br />
// vertex 3 di kanan atas<br />
vSpriteVertex[3].p.x = PosX+SpriteInfo.Width;<br />
vSpriteVertex[3].p.y = PosY;<br />
//uv<br />
vSpriteVertex[0].tu = 0.0f; vSpriteVertex[0].tv = 1.0f;<br />
vSpriteVertex[1].tu = 0.0f; vSpriteVertex[1].tv = 0.0f;<br />
vSpriteVertex[2].tu = 1.0f; vSpriteVertex[2].tv = 1.0f;<br />
vSpriteVertex[3].tu = 1.0f; vSpriteVertex[3].tv = 0.0f;<br />
SpriteVB-&gt;Unlock();</p>
<p>m_pd3dDevice-&gt;SetRenderState( D3DRS_LIGHTING, FALSE );<br />
m_pd3dDevice-&gt;SetRenderState( D3DRS_FOGENABLE, FALSE );<br />
if (bPNGAlpha == TRUE)<br />
{<br />
m_pd3dDevice-&gt;SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );<br />
m_pd3dDevice-&gt;SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );<br />
m_pd3dDevice-&gt;SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );<br />
}</p>
<p>m_pd3dDevice-&gt;SetTexture( 0, TeksturSprite );<br />
m_pd3dDevice-&gt;SetFVF( SPRITEVERTEX::FVF );<br />
m_pd3dDevice-&gt;SetStreamSource( 0, SpriteVB, 0, sizeof(SPRITEVERTEX) );<br />
m_pd3dDevice-&gt;DrawPrimitive( D3DPT_TRIANGLESTRIP , 0, 2 );</p>
<p>m_pd3dDevice-&gt;SetRenderState( D3DRS_LIGHTING, TRUE );<br />
m_pd3dDevice-&gt;SetRenderState( D3DRS_FOGENABLE, TRUE );<br />
if (bPNGAlpha == TRUE)<br />
{<br />
m_pd3dDevice-&gt;SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p>Hmm&#8230; cukup panjang ya&#8230; sekarang udah hampir jam 3 pagi. Ngantuk juga nih&#8230; huammm&#8230; Dikarenakan fungsi ObyekSprite::RenderSprite() dapat menggambar sprite pada posisi yang diinginkan, maka setiap fungsi ini dipanggil, Anda perlu menentukan kembali posisi-posisi vertex pada layar monitor berdasarkan posisi sprite (PosX,PosY) terhadap kiri atas window. Posisi kiri atas sprite, yaitu vertex1, adalah posisi acuan penempatan sprite (Lihat Gambar). Dari gambar dapat dilihat bahwa posisi X vertex0 adalah PosX, posisi Y vertex0 adalah PosY+SpriteInfo.Height. Begitupula dengan posisi vertex-vertex lainnya. Perlu diingat, sebelum memindahkan posisi vertex di dalam vertex buffer, Anda diharuskan mengunci vertex buffer dengan perintah Lock.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Sprite_ilkom_files/image003.jpg" alt="image003" width="450" height="299" /></p>
<p>Perhatikan kode-kode berikut :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>m_pd3dDevice-&gt;SetTexture( 0, TeksturSprite );<br />
m_pd3dDevice-&gt;SetFVF( SPRITEVERTEX::FVF );<br />
m_pd3dDevice-&gt;SetStreamSource( 0, SpriteVB, 0, sizeof(SPRITEVERTEX) );<br />
m_pd3dDevice-&gt;DrawPrimitive( D3DPT_TRIANGLESTRIP , 0, 2 );</td>
</tr>
</tbody>
</table>
<p>Sebelum sprite digambar ke back buffer dengan perintah DrawPrimitive, Anda diharuskan memberitahu kepada device bahwa tekstur yang digunakan adalah TeksturSprite, FVF yang digunakan adalah SPRITEVERTEX::FVF, dan vertex buffer yang digunakan adalah SpriteVB.</p>
<p>Sprite 2D tidak membutuhkan penggunaan cahaya(light) dan kabut (fog), kecuali sprite 3D atau yang biasa disebut billboard. Bila tekstur sprite memiliki transparansi, maka D3DRS_ALPHABLENDENABLE di-set TRUE agar dapat menggunakan transparansi tersebut.</p>
<p>Dan fungsi ObyekSprite yang terakhir adalah ObyekSprite::HapusSprite().</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID ObyekSprite::HapusSprite()<br />
{<br />
if (SpriteVB!=NULL)<br />
{ SpriteVB-&gt;Release(); SpriteVB = NULL;}<br />
if (TeksturSprite!=NULL)<br />
{      TeksturSprite-&gt;Release(); TeksturSprite = NULL;}<br />
}</td>
</tr>
</tbody>
</table>
<p>4.2 Menggunakan Class ObyekSprite</p>
<p>Bagaimana cara menggunakan class ObyekSprite yang telah Anda buat bila Anda memiliki sebuah file BMP sebagai splash-screen dan sebuah file PNG sebagai kursor mouse?</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Sprite_ilkom_files/image004.jpg" alt="image004" width="450" height="337" /><br />
bitmap\splashscreen.bmp,<br />
640&#215;480 pixel<br />
Tidak ada transparansi</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Sprite_ilkom_files/image005.jpg" alt="image005" width="52" height="52" /><br />
bitmap\kursor.png<br />
20&#215;20 pixel<br />
Memiliki transparansi alpha</p>
<p>Bukalah file “Gameku.cpp”. Hal pertama yang harus Anda lakukan untuk menggunakan dua bitmap di atas sebagai sprite adalah mendeklarasikan dua variabel bertipe ObyekSprite. Kemudian di dalam fungsi InitObyekGame(), gunakan perintah ObyekSprite::InisialisasiSprite() dengan memasukkan nama file bitmap di atas pada parameter kedua dari tiap-tiap ObyekSprite. Atur nilai bPNGAlpha pada sprite kursor mouse agar bernilai TRUE. Di dalam fungsi HapusObyekGame(), gunakan perintah ObyekSprite::HapusSprite(). Kemudian di dalam fungsi Render(), gunakan perintah ObyekSprite::HapusSprite() untuk menggambar sprite pada back buffer. Ketikkan kode-kode dibawah ini untuk melakukan menggunakan ObyekSprite.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>#include &lt;windows.h&gt;<br />
#include &#8220;DirectXku.h&#8221;<br />
bool bKeluar = FALSE;</p>
<p><strong>ObyekSprite spSplashScreen;</strong><br />
<strong>ObyekSprite spKursorMouse;</strong></p>
<p>VOID InitObyekGame()<br />
{<br />
// letakkan semua perintah inisialisasi obyek game di sini<br />
spSplashScreen.InisialisasiSprite(Direct3DDevice,&#8221;bitmap/splashscreen.bmp&#8221;);<br />
spKursorMouse.InisialisasiSprite(Direct3DDevice,&#8221;bitmap/kursor.png&#8221;);<br />
spKursorMouse.bPNGAlpha = TRUE;<br />
}</p>
<p>VOID HapusObyekGame()<br />
{<br />
<strong> spSplashScreen.HapusSprite();</strong><br />
<strong> spKursorMouse.HapusSprite();</strong><br />
}</p>
<p>VOID Render()<br />
{<br />
<strong>Direct3DDevice -&gt; Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,</strong><br />
<strong> D3DCOLOR_XRGB(0,0,0),1.0f,0);</strong><br />
<strong>Direct3DDevice -&gt; BeginScene();</strong></p>
<p><strong>spSplashScreen.RenderSprite(Direct3DDevice,0,0);</strong><br />
<strong>spKursorMouse.RenderSprite(Direct3DDevice,200,200);</strong></p>
<p><strong>Direct3DDevice -&gt; EndScene();</strong><br />
<strong>Direct3DDevice -&gt; Present(NULL,NULL,NULL,NULL);</strong><br />
}</td>
</tr>
</tbody>
</table>
<p>Pada fungsi Render() di atas, terlihat bahwa sebelum penggambaran ObyekSprite dilakukan, back buffer harus dibersihkan terlebih dahulu dengan perintah Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0). Kemudian proses penggambaran ObyekSprite dilakukan di antara perintah BeginScene dan EndScene. Back Buffer ditampilkan ke layar monitor dengan perintah Present(NULL,NULL,NULL,NULL). Tidak terlalu rumit bukan ?</p>
<p>Compile dan Build aplikasi Anda. Berikut adalah gambar tampilan aplikasi Anda bila dijalankan.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Sprite_ilkom_files/image006.jpg" alt="image006" width="450" height="338" /></p>
<p>Perhatikan sprite kursor mouse (gambar panah berwarna merah), amati bahwa Anda telah menggunakan transparansi untuk menggambar sprite tersebut. Kursor tersebut belum dapat Anda gerakkan, pada bab berikutnya Anda akan mempelajari tentang hal tersebut dan sekaligus membuat tombol dan in-game menu.</p>
<p>Selamat !!! Anda telah dapat membuat dan menggambar sprite. Sebenarnya masih banyak fitur dari sprite yang dapat kita buat. Contohnya penggunaan sprite beranimasi, mengatur transparansi, menampilkan sprite untuk beberapa frame saja, sprite dengan skew dan merubah warna difuse sprite untuk pemain berbeda. Di lain waktu dan kesempatan, saya akan mencoba membuat tutorial lain untuk menguprade fitur-fitur sprite yang Anda buat pada bab ini.</p>
<p>4.3 FAQ (Frequently Asked Questions)</p>
<p>Semoga FAQ ini dapat membantu Anda bila mendapat kesulitan&#8230;</p>
<p>Tanya : Mengapa pada saat aplikasi melakukan inisialisasi sprite, muncul kotak pesan “Gagal : Vertex Buffer Untuk &#8220;Splash.BMP&#8221;. Mungkin memori penuh?” ?<br />
Jawab : Karena pada fungsi ObyekSprite::InisialisasiSprite(), digunakan D3DPOOL_MANAGED untuk membuat vertex buffer, maka DirectX mengatur secara otomatis, apakah vertex buffer akan dibuat pada memori sistem atau memori kartu grafik. Kegagalan tersebut terjadi karena salah satu atau kedua memori tersebut telah penuh.</p>
<p>Tanya : Mengapa pada saat aplikasi melakukan inisialisasi sprite, muncul kotak pesan “Gagal : Loading Bitmap &#8220;Splash.BMP&#8221;.” ?<br />
Jawab : Kegagalan tersebut terjadi karena aplikasi tidak dapat menemukan file “Splash.BMP” atau dapat juga terjadi karena memori sistem atau memori kartu grafik telah penuh.</p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=49</wfw:commentRss>
		</item>
		<item>
		<title>Bab III. Inisialisasi Direct3D dan DirectInput</title>
		<link>http://ajipamungkas.net23.net/?p=35</link>
		<comments>http://ajipamungkas.net23.net/?p=35#comments</comments>
		<pubDate>Fri, 13 Feb 2009 23:04:19 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[3. Inisialisasi DX]]></category>

		<guid isPermaLink="false">http://ajirifa.wordpress.com/2009/02/13/bab-iii-inisialisasi-direct3d-dan-directinput/</guid>
		<description><![CDATA[Download BAB3-Inisialisasi DirectX.zip (1.27 MB)
Pada bab ini akan dijelaskan mengenai cara melakukan inisialisasi Direct3D dan DirectInput. Direct3D adalah komponen yang mengatur penggunaan kartu grafik untuk operasi­-operasi 3D. Tetapi pada DirectX versi 8.0 ke atas, komponen ini digabungkan dengan DirectDraw sehingga operasi-operasi 2D pun dapat dilakukan hanya dengan melakukan inisialisasi Direct3D saja. Proses inisialisasi Direct3D adalah [...]]]></description>
			<content:encoded><![CDATA[<p>Download <a href="http://www.megaupload.com/?d=UUZ1P41J"><strong>BAB3-Inisialisasi DirectX.zip</strong> (1.27 MB)</a></p>
<p>Pada bab ini akan dijelaskan mengenai cara melakukan inisialisasi Direct3D dan DirectInput. Direct3D adalah komponen yang mengatur penggunaan kartu grafik untuk operasi­-operasi 3D. Tetapi pada DirectX versi 8.0 ke atas, komponen ini digabungkan dengan DirectDraw sehingga operasi-operasi 2D pun dapat dilakukan hanya dengan melakukan inisialisasi Direct3D saja. Proses inisialisasi Direct3D adalah proses terpenting yang harus Anda lakukan terlebih dahulu.</p>
<p>Di dalam bab ini, kita juga akan menggunakan teks pembuka sebelum memasuki game loop. Teks pembuka ini berfungsi untuk menampilkan proses inisialisasi DirectX.</p>
<p>3.1 Membuat Header Baru</p>
<p>Kita akan memisahkan proses-proses yang berhubungan dengan DirectX dan proses-proses pada game loop. Proses-proses yang berhubungan dengan DirectX akan diletakkan pada header “DirectxKu.h”. Untuk membuat header, klik pada File&#8211;&gt;New dan pada tab “Files” klik pada “C/C++ Header File”. Aktifkan pilihan “Add to project” dan beri nama header tersebut dengan “DirectXku.h”. Klik OK untuk membuat header tersebut dan pada workspace akan tampak header “DirectXku.h”.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Inisialisasi Direct3D_ilkom_files/image002.jpg" alt="image002" width="450" height="109" /></p>
<p>3.2 Deklarasi Variabel Dan Fungsi</p>
<p>Pertama-tama kita deklarasikan variabel dan fungsi yang akan kita gunakan nanti.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>#include &lt;d3dx9.h&gt;</p>
<p>#include &lt;dinput.h&gt;</p>
<p>#include &lt;stdio.h&gt;</td>
</tr>
</tbody>
</table>
<p>Include header-header yang diperlukan. Header “d3dx9.h” diperlukan karena kita akan menggunakan komponen Direct3D. Header “dinput.h” diperlukan karena kita akan menggunakan komponen DirectInput. Header “stdio.h” diperlukan karena kita akan menggunakan fungsi “sprintf”, “strcpy” dan “strcmp” untuk memanipulasi string teks.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>//definisi font yang akan digunakan</p>
<p>LOGFONT log_font_arial={</p>
<p>15,</p>
<p>0,</p>
<p>0,</p>
<p>0,</p>
<p>FW_SEMIBOLD,</p>
<p>FALSE,</p>
<p>FALSE,</p>
<p>FALSE,</p>
<p>DEFAULT_CHARSET,</p>
<p>OUT_DEFAULT_PRECIS,</p>
<p>CLIP_DEFAULT_PRECIS,</p>
<p>ANTIALIASED_QUALITY,</p>
<p>DEFAULT_PITCH,</p>
<p>&#8220;Arial&#8221;</p>
<p>};</td>
</tr>
</tbody>
</table>
<p>Untuk menggunakan font, kita perlu mendefinisikan atribut font. Atribut ini akan digunakan pada saat inisialisasi font.</p>
<p>typedef struct tagLOGFONT {</p>
<p>LONG lfHeight; //tinggi font</p>
<p>LONG lfWidth; // lebar font</p>
<p>LONG lfEscapement; // perputaran font</p>
<p>LONG lfOrientation; // orientasi font</p>
<p>LONG lfWeight; // ketebalan font</p>
<p>BYTE lfItalic; // nilai TRUE aktifkan Italic (miring)</p>
<p>BYTE lfUnderline; // nilai TRUE aktifkan Underline (garis bawah)</p>
<p>BYTE lfStrikeOut; // nilai TRUE aktifkan Strike Out (garis tengah)</p>
<p>BYTE lfCharSet; // set karakter</p>
<p>BYTE lfOutPrecision;</p>
<p>BYTE lfClipPrecision;</p>
<p>BYTE lfQuality;</p>
<p>BYTE lfPitchAndFamily;</p>
<p>TCHAR lfFaceName[LF_FACESIZE];</p>
<p>} LOGFONT, *PLOGFONT;</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>//deklarasi variabel-variabel</p>
<p>LPDIRECT3D9          Direct3D      = NULL;</p>
<p>LPDIRECT3DDEVICE9          Direct3DDevice       = NULL;</p>
<p>ID3DXFont            *font_Arial   = NULL;</p>
<p>D3DDISPLAYMODE             ModeTampilanDekstop;</p>
<p>D3DPRESENT_PARAMETERS      Direct3D_PP;</p>
<p>D3DADAPTER_IDENTIFIER9     InfoKartuGrafik;</p>
<p>LPDIRECTINPUT8             DirectInput;</p>
<p>LPDIRECTINPUTDEVICE8 DIDeviceKeyboard;</p>
<p>LPDIRECTINPUTDEVICE8 DIDeviceMouse;</p>
<p>DIMOUSESTATE         mouse_state;</p>
<p>char TombolYangDitekan[256];</p>
<p>char temptext[256];</td>
</tr>
</tbody>
</table>
<p>Berikut adalah keterangan variabel-variabel di atas :</p>
<table class="MsoTableGrid" style="border-bottom:medium none;border-left:medium none;border-collapse:collapse;border-top:medium none;border-right:medium none;" border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td style="border: 1pt solid windowtext; padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><em><span style="font-family:Courier;font-size:10pt;">Variabel</span></em></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><em><span style="font-family:Courier;font-size:10pt;">Keterangan</span></em></strong></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">LPDIRECT3D9 Direct3D</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><span style="font-family:Courier;font-size:10pt;">Direct3D, dibutuhkan untuk membuat device baru</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">LPDIRECT3DDEVICE9 Direct3DDevice</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><span style="font-family:Courier;font-size:10pt;">Device Direct3D sebagai representasi kartu grafik yang digunakan oleh sistem komputer</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">D3DDISPLAYMODE ModeTampilanDekstop</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><span style="font-family:Courier;font-size:10pt;">Struktur yang akan menyimpan informasi tampilan desktop</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">D3DPRESENT_PARAMETERS Direct3D_PP</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><span style="font-family:Courier;font-size:10pt;">Struktur parameter-parameter Direct3D</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">D3DADAPTER_IDENTIFIER9 InfoKartuGrafik</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><span style="font-family:Courier;font-size:10pt;">Struktur yang akan menyimpan informasi mengenai kartu grafik pada sistem</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">LPDIRECTINPUT8 DirectInput</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DirectInput</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">LPDIRECTINPUTDEVICE8 DIDeviceKeyboard</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Device Keyboard sebagai representasi keyboard pada sistem</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">LPDIRECTINPUTDEVICE8 DIDeviceMouse</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Device Mouse sebagai representasi mouse pada sistem</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">DIMOUSESTATE MouseState</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Untuk menyimpan informasi mengenai apa yang terjadi pada mouse</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">char TombolYangDitekan[256]</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Untuk menyimpan informasi penekanan tombol yang terjadi pada keyboard</span></p>
</td>
</tr>
<tr>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default"><strong><span style="font-family:Courier;font-size:10pt;">char temptext[256]</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 221.4pt;" width="295">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Untuk menyimpan teks-teks yang bersifat sementara (temporary)</span></p>
</td>
</tr>
</tbody>
</table>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>void RenderTeks(char TextYgAkanDitampilkan[256], int PosX, int PosY,D3DCOLOR Warna);</p>
<p>VOID HapusSemuaObyekDirectX();</p>
<p>HRESULT InisialisasiDirectX(HWND hWnd, HINSTANCE hInstance);</td>
</tr>
</tbody>
</table>
<p>Pembuatan fungsi-fungsi di atas akan dijelaskan pada sub-bab berikut.</p>
<p>3.3 Fungsi RenderTeks</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// fungsi untuk menggambari back buffer dengan text</p>
<p>void RenderTeks(char TextYgAkanDitampilkan[256], int PosX, int PosY,D3DCOLOR Warna)</p>
<p>{</p>
<p>RECT rect_font = {0,0,640,480};</p>
<p>font_Arial-&gt;Begin();</p>
<p>rect_font.top=PosY;</p>
<p>rect_font.left = PosX;</p>
<p>font_Arial-&gt;DrawText(TextYgAkanDitampilkan,-1,&amp;rect_font,DT_LEFT,Warna);</p>
<p>font_Arial-&gt;End();</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>Fungsi RenderTeks akan menggambar teks pada back buffer dengan teks dan posisi teks yang diinginkan ketika memanggil fungsi ini. Perintah untuk menggambar font yaitu DrawText diletakkan diantara fungsi Begin dan fungsi End. Perintah ini memiliki lima parameter yaitu sebagai berikut :</p>
<table class="MsoNormalTable" style="width: 432.25pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr style="height: 17pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 152pt; height: 17pt;" width="203">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">Parameter</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 280.25pt; height: 17pt;" width="374">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">Keterangan</span></strong></p>
</td>
</tr>
<tr style="height: 14pt;">
<td style="padding: 0pt 5.4pt; width: 152pt; height: 14pt;" width="203">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">LPCSTR pString</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 280.25pt; height: 14pt;" width="374">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Teks yang akan digambar pada window</span></p>
</td>
</tr>
<tr style="height: 45.45pt;">
<td style="padding: 0pt 5.4pt; width: 152pt; height: 45.45pt;" width="203">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">INT Count</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 280.25pt; height: 45.45pt;" width="374">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Jumlah karakter pada teks yang ingin digambar, nilai -1 akan menggambar seluruh teks</span></p>
</td>
</tr>
<tr style="height: 14pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 152pt; height: 14pt;" width="203">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">LPRECT pRect</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 280.25pt; height: 14pt;" width="374">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Rectangle sebagai tempat teks</span></p>
</td>
</tr>
<tr style="height: 135.6pt;">
<td style="padding: 0pt 5.4pt; width: 152pt; height: 135.6pt;" width="203">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">DWORD Format</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 280.25pt; height: 135.6pt;" width="374">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Metode penempatan teks pada rectangle, diantaranya yaitu :</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DT_BOTTOM : Meletakkan teks di posisi paling bawah</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DT_CENTER : Meletakkan teks di tengah rectangle</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DT_LEFT : Meletakkan teks di kiri rectangle</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DT_RIGHT : Meletakkan teks di kanan rectangle</span></p>
</td>
</tr>
<tr style="height: 14pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 152pt; height: 14pt;" width="203">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DCOLOR Color</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 280.25pt; height: 14pt;" width="374">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Warna teks</span></p>
</td>
</tr>
</tbody>
</table>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Inisialisasi Direct3D_ilkom_files/image003.jpg" alt="image003" width="293" height="207" /></p>
<p>Gambar di sebelah dapat membantu Anda untuk memahami proses penggambaran teks pada back buffer.</p>
<p>3.4 Fungsi InisialisasiDirectX</p>
<p>Berikutnya adalah proses terpenting di dalam menggunakan DirectX yaitu proses inisialisasi. Inisialisasi adalah proses mengalokasikan ruang memori untuk interface DirectX dan obyek-obyek game (bitmap, model 3D, dll) agar dapat dimanfaatkan dan dimanipulasi nantinya. Gambar berikut menjelaskan urutan-urutan dari proses inisialisasi Direct3D dan DirectInput.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Inisialisasi Direct3D_ilkom_files/image004.jpg" alt="image004" width="450" height="281" /></p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// inisialisasi Directx</p>
<p>HRESULT InisialisasiDirectX(HWND hWnd, HINSTANCE hInstance)</p>
<p>{</p>
<p>HRESULT hr;</p>
<p>// inisialisasi Direct3D</p>
<p>if ((Direct3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)</p>
<p>{</p>
<p>MessageBox(hWnd, &#8220;Inisialisasi Direct3D&#8230; Gagal&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>Sangat mudah sekali untuk melakukan proses inisialisasi Direct3D karena DirectX memiliki perintah untuk melakukan proses tersebut yaitu Direct3DCreate9. Bila gagal, maka aplikasi akan menampilkan teks &#8220;Inisialisasi Direct3D&#8230; Gagal&#8221; dan aplikasi dihentikan.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// memeriksa mode tampilan desktop</p>
<p>if( FAILED( Direct3D-&gt;GetAdapterDisplayMode(</p>
<p>D3DADAPTER_DEFAULT,</p>
<p>&amp;ModeTampilanDekstop )))</p>
<p>{      MessageBox(hWnd, &#8220;Mengambil Informasi Tampilan Dekstop&#8230; Gagal&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</td>
</tr>
</tbody>
</table>
<p>Untuk meminimalisasi kesalahan yang terjadi akibat perbedaan format antara back buffer dengan desktop, akan lebih baik bila kita memeriksa mode tampilan dekstop terlebih dahulu dan kemudian menyamai format tersebut untuk back buffer, walaupun dimungkinkan untuk menggunakan format-format yang berbeda untuk back buffer. Lihat dokumentasi DirectX SDK untuk melihat perbedaan format-format tersebut.</p>
<p>Perintah GetAdapterDisplayMode akan mengambil informasi mode tampilan dekstop (resolusi, format, refresh rate) dan menyimpannya pada variabel ModeTampilanDekstop.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// mengatur parameter direct3D</p>
<p>Direct3D_PP.Windowed = TRUE;</p>
<p>Direct3D_PP.BackBufferCount = 1;</p>
<p>Direct3D_PP.SwapEffect = D3DSWAPEFFECT_DISCARD;</p>
<p>Direct3D_PP.BackBufferWidth = 640;</p>
<p>Direct3D_PP.BackBufferHeight = 480;</p>
<p>Direct3D_PP.BackBufferFormat = ModeTampilanDekstop.Format;</p>
<p>Direct3D_PP.EnableAutoDepthStencil = TRUE;</p>
<p>Direct3D_PP.AutoDepthStencilFormat = D3DFMT_D16;</p>
<p>// inisialisasi device berdasarkan parameter</p>
<p>if (FAILED (Direct3D-&gt;CreateDevice (</p>
<p>0,</p>
<p>D3DDEVTYPE_HAL,</p>
<p>hWnd,</p>
<p>D3DCREATE_SOFTWARE_VERTEXPROCESSING,</p>
<p>&amp;Direct3D_PP,</p>
<p>&amp;Direct3DDevice)))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal Membuat Device Direct3D&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</td>
</tr>
</tbody>
</table>
<p>Saatnya untuk membuat device yang merepresentasikan kartu grafik pada sistem komputer dengan menggunakan perintah <strong>CreateDevice</strong>. Tetapi sebelumnya, Anda harus mengatur beberapa parameter-parameter penting Direct3D (seperti tampak pada <em>source-code</em> di atas). Parameter-parameter tersebut merupakan anggota dari struktur <strong>D3DPRESENT_PARAMETERS</strong>, yang keseluruhannya dapat Anda lihat pada tabel di bawah ini:</p>
<table class="MsoNormalTable" style="width: 432.4pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr style="height: 14.9pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 216.4pt; height: 14.9pt;" width="289">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><em><span style="line-height:150%;font-family:Courier;font-size:10pt;">Anggota</span></em></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.9pt;" width="288">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><em><span style="line-height:150%;font-family:Courier;font-size:10pt;">Keterangan</span></em></strong></p>
</td>
</tr>
<tr style="height: 14.75pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 14.75pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">UINT BackBufferWidth</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.75pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Lebar back buffer yang diinginkan</span></p>
</td>
</tr>
<tr style="height: 14.5pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 14.5pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">UINT BackBufferHeight</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.5pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Tinggi back buffer yang diinginkan</span></p>
</td>
</tr>
<tr style="height: 14.75pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 14.75pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DFORMAT BackBufferFormat</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.75pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Format back buffer</span></p>
</td>
</tr>
<tr style="height: 14.5pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 14.5pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">UINT BackBufferCount</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.5pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Jumlah back buffer yang digunakan</span></p>
</td>
</tr>
<tr style="height: 75.4pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 75.4pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DSWAPEFFECT SwapEffect</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 75.4pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Metode penyalinan dari back buffer ke layar monitor (front</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">buffer). D3DSWAPEFFECT_DISCARD akan mengatur</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">metode terbaik.</span></p>
</td>
</tr>
<tr style="height: 60.45pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 60.45pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">HWND hDeviceWindow</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 60.45pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Window sebagai front buffer. Bila bernilai NULL, maka window</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">pada perintah CreateDevice yang akan digunakan.</span></p>
</td>
</tr>
<tr style="height: 14.75pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 216.4pt; height: 14.75pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">BOOL EnableAutoDepthStencil</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.75pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Mengaktifkan fitur Depth-Buffer</span></p>
</td>
</tr>
<tr style="height: 14.5pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 14.5pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DFORMAT AutoDepthStencilFormat</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.5pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Format Depth-Buffer yang digunakan</span></p>
</td>
</tr>
<tr style="height: 14.75pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 14.75pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">DWORD Flags</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 14.75pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Flag</span></p>
</td>
</tr>
<tr style="height: 12.4pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 12.4pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">UINT FullScreen_RefreshRateInHz</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 12.4pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Biarkan dua anggota ini agar diurus oleh DirectX secara</span></p>
</td>
</tr>
<tr style="height: 45.1pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 45.1pt;" width="289" valign="bottom">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">UINT PresentationInterval</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 45.1pt;" width="288" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">otomatis karena kedua anggota ini berhubungan dengan refresh-</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">rate monitor.</span></p>
</td>
</tr>
<tr style="height: 75.5pt;">
<td style="padding: 0pt 5.4pt; width: 216.4pt; height: 75.5pt;" width="289">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">BOOL Windowed</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3in; height: 75.5pt;" width="288">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Nilai TRUE bila aplikasi ingin ditampilkan dalam bentuk</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">jendela.Nilai FALSE bila aplikasi ingin ditampilkan secara full-</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">screen.</span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="line-height:150%;font-family:Courier;font-size:10pt;">Perintah <strong>CreateDevice</strong> tersebut memiliki beberapa parameter yaitu :</span></p>
<table class="MsoNormalTable" style="width: 432.4pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="577">
<tbody>
<tr style="height: 15.15pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 205.6pt; height: 15.15pt;" width="274">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><em><span style="line-height:150%;font-family:Courier;font-size:10pt;">Parameter</span></em></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3.15in; height: 15.15pt;" width="302">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><em><span style="line-height:150%;font-family:Courier;font-size:10pt;">Keterangan</span></em></strong></p>
</td>
</tr>
<tr style="height: 150.6pt;">
<td style="padding: 0pt 5.4pt; width: 205.6pt; height: 150.6pt;" width="274">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DDEVTYPE DeviceType</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3.15in; height: 150.6pt;" width="302">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Nilai D3DADAPTER_DEFAULT adalah kartu grafik yang digunakan oleh Dekstop. Pada sistem komputer dimungkinkan terdapat lebih</span></p>
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">dari satu kartu grafik, tetapi tutorial ini hanya menggunakan kartu grafik yang digunakan oleh Dekstop.</span></p>
</td>
</tr>
<tr style="height: 14pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 205.6pt; height: 14pt;" width="274">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">HWND hFocusWindow</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3.15in; height: 14pt;" width="302">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Window sebagai front buffer.</span></p>
</td>
</tr>
<tr style="height: 56.5pt;">
<td style="padding: 0pt 5.4pt; width: 205.6pt; height: 56.5pt;" width="274">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">DWORD BehaviorFlags</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3.15in; height: 56.5pt;" width="302">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DCREATE_SOFTWARE_VERTEXPROCESSING tidak menggunakan hardware untuk memproses vertex. Tetapi bila Anda yakin bahwa kartu grafik Anda dapat menggunakan hardware untuk memproses vertex, gunakan D3DCREATE_HARDWARE_VERTEXPROCESSING.</span></p>
</td>
</tr>
<tr style="height: 56.5pt;">
<td style="padding: 0pt 5.4pt; width: 205.6pt; height: 56.5pt;" width="274">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DPRESENT_PARAMETERS *pPresentationParameters</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3.15in; height: 56.5pt;" width="302">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Variabel bertipe D3DPRESENT_PARAMETER yang Anda atur sebelumnya. Pada tutorial ini, variabel tersebut adalah Direct3D_PP.</span></p>
</td>
</tr>
<tr style="height: 56.5pt;">
<td style="padding: 0pt 5.4pt; width: 205.6pt; height: 56.5pt;" width="274">
<p class="Default" style="line-height:150%;"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirect3DDevice9** ppReturnedDeviceInterface</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 3.15in; height: 56.5pt;" width="302">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Device DirectX Anda. Pada tutorial ini, variabel tersebut adalah Direct3DDevice.</span></p>
</td>
</tr>
</tbody>
</table>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// inisialisasi font</p>
<p>hr = D3DXCreateFontIndirect(Direct3DDevice, &amp;log_font_arial, &amp;font_Arial);</p>
<p>if (FAILED(hr)){MessageBox(hWnd, &#8220;Gagal membuat font&#8221;, NULL, MB_OK);}</p>
<p>// mengambil informasi kartu grafik</p>
<p>if (FAILED(Direct3D-&gt;GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &amp;InfoKartuGrafik)))</p>
<p>{      MessageBox(hWnd, &#8220;error id&#8221;, NULL, MB_OK);}</p>
<p>Direct3D_PP.BackBufferHeight);</td>
</tr>
</tbody>
</table>
<p>Inisialisasi font dilakukan oleh perintah D3DXCreateFontIndirect yang menggunakan LOGFONT yang telah Anda definisikan sebelumnya. Kemudian inisialisasi DirectInput dilakukan. Pada DirectX9, tidak ada perubahan mengenai komponen DirectInput. Sehingga, kita akan menggunakan perintah DirectInput8Create dari DirectX8.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// inisialisasi DirectInput</p>
<p>hr = DirectInput8Create(</p>
<p>hInstance,</p>
<p>DIRECTINPUT_VERSION,</p>
<p>IID_IDirectInput8,</p>
<p>(void**)&amp;DirectInput, NULL);</p>
<p>// membuat device keyboard</p>
<p>hr = DirectInput-&gt;CreateDevice(</p>
<p>GUID_SysKeyboard,</p>
<p>&amp;DIDeviceKeyboard,</p>
<p>NULL);</p>
<p>if (FAILED(hr))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal Membuat Device Keyboard&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</p>
<p>hr = DIDeviceKeyboard-&gt;SetDataFormat(&amp;c_dfDIKeyboard );</p>
<p>if (FAILED(hr))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal SetDataFormat Keyboard&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</p>
<p>hr = DIDeviceKeyboard-&gt;SetCooperativeLevel(</p>
<p>hWnd,</p>
<p>DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);</p>
<p>if (FAILED(hr))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal Melakukan Koneksi Dengan Jendela&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</td>
</tr>
</tbody>
</table>
<p>Pembuatan device keyboard dilakukan dengan perintah CreateDevice dengan menggunakan GUID_SysKeyboard pada parameter pertama dari perintah ini. Setelah device berhasil dibuat, Anda diharuskan mengatur format data dari device dengan menggunakan c_dfDIKeyboard pada perintah SetDataFormat. Kemudian device keyboard menunjuk pada window aplikasi game kita (hWnd) dan device keyboard dapat digunakan bila window aktif atau tidak aktif (DISCL_BACKGROUND) dan device keyboard tidak mengganggu window lain (DISCL_NONEXCLUSIVE).</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// membuat device mouse</p>
<p>if (FAILED(DirectInput-&gt;CreateDevice(GUID_SysMouse, &amp;DIDeviceMouse, NULL)))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal create device mouse&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</p>
<p>if (FAILED(DIDeviceMouse-&gt;SetDataFormat(&amp;c_dfDIMouse)))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal SetDataFormat mouse&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</p>
<p>if (FAILED(DIDeviceMouse-&gt;SetCooperativeLevel(hWnd, DISCL_FOREGROUND |</p>
<p>DISCL_EXCLUSIVE)))</p>
<p>{      MessageBox(hWnd, &#8220;Gagal SetCooperativeLevel&#8221;, NULL, MB_OK);</p>
<p>return E_FAIL;}</td>
</tr>
</tbody>
</table>
<p>Pembuatan device mouse hampir mirip dengan pembuatan device keyboard. Bedanya hanya pada GUID dan format data dimana device mouse harus menggunakan GUID_SysMouse dan format data c_dfDIMouse.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>return S_OK;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>3.5 Fungsi HapusSemuaObyekDirectX</p>
<p>Sebelum aplikasi ditutup, seluruh obyek DirectX harus dihapus dari memori agar ruang memori yang telah digunakan oleh obyek DirectX tersebut dapat digunakan oleh aplikasi lain. DirectX mememiliki perintah untuk menghapus obyek-obyek dari interface DirectX yang tidak diperlukan lagi, perintah tersebut adalah Release. Urutan proses penghapusan obyek ini merupakan kebalikan dari urutan proses inisialisasi, dimana obyek yang terakhir dihapus adalah obyek dari interface Direct3D.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>VOID HapusSemuaObyekDirectX()</p>
<p>{</p>
<p>if (DIDeviceMouse != NULL)</p>
<p>{</p>
<p>DIDeviceMouse-&gt;Release();</p>
<p>DIDeviceMouse=NULL;</p>
<p>}</p>
<p>if (DIDeviceKeyboard != NULL)</p>
<p>{</p>
<p>DIDeviceKeyboard-&gt;Release();</p>
<p>DIDeviceKeyboard=NULL;</p>
<p>}</p>
<p>if (DirectInput != NULL)</p>
<p>{</p>
<p>DirectInput-&gt;Release();</p>
<p>DirectInput=NULL;</p>
<p>}</p>
<p>if ( font_Arial != NULL )</p>
<p>{ font_Arial -&gt; Release();</p>
<p>font_Arial = NULL;}</p>
<p>if ( Direct3DDevice != NULL )</p>
<p>{ Direct3DDevice -&gt; Release();</p>
<p>Direct3DDevice = NULL;}</p>
<p>if ( Direct3D != NULL )</p>
<p>{ Direct3D -&gt; Release();</p>
<p>Direct3DDevice = NULL;}</p>
<p>// akhir dari fungsi HapusSemuaObyekDirectX</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>3.6 Menggunakan Header &#8220;DirectXku.h&#8221;</p>
<p>Fungsi InisialisasiDirectX dan fungsi HapusSemuaObyekDirectX pada header &#8220;DirectXku.h&#8221; akan digunakan pada file source &#8220;Gameku.cpp&#8221;. Untuk menggunakan fungsi-fungsi tersebut, include header &#8220;DirectXku.h&#8221;. Lihat kembali source &#8220;Gameku.cpp&#8221; dan ketikkan kode yang ditebalkan di bawah ini:</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>#include &lt;windows.h&gt;</p>
<p>#include &#8220;DirectXku.h&#8221;</td>
</tr>
</tbody>
</table>
<p>Kini kita dapat menggunakan seluruh variabel dan fungsi­-fungsi yang terdapat pada header “DirectXku.h”. Pada fungsi WinMain, kita akan memanggil fungsi InisialisasiDirectX dan fungsi HapusSemuaObyekDirectX. Perhatikan fungsi WinMain dan ketikkan kode yang ditebalkan di bawah ini..</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>// fungsi-fungsi</strong></p>
<p><strong>VOID GameLoop()</strong></p>
<p><strong>{</strong></p>
<p><strong>Direct3DDevice -&gt; Clear (0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,</strong></p>
<p><strong> D3DCOLOR_XRGB(0,0,0),1.0f,0);</strong></p>
<p><strong>Direct3DDevice -&gt; BeginScene();</strong></p>
<p><strong> RenderTeks(&#8221;Direct3D dan DirectInput telah diinsialisasikan&#8221;,</strong></p>
<p><strong> 10,10,D3DCOLOR_XRGB(255,255,255));</strong></p>
<p><strong>Direct3DDevice -&gt; EndScene();</strong></p>
<p><strong>Direct3DDevice -&gt; Present(NULL,NULL,NULL,NULL);</strong></p>
<p><strong>}</strong></p>
<p>// winmain</p>
<p>INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE , LPSTR , int nCmdShow)</p>
<p>{</p>
<p>// pembuatan struktur window class</p>
<p>WNDCLASSEX wc;</p>
<p>wc.cbSize = sizeof(WNDCLASSEX);</p>
<p>wc.style = CS_OWNDC|CS_NOCLOSE;</p>
<p>wc.lpfnWndProc = MsgProc;</p>
<p>wc.cbClsExtra = 0L;</p>
<p>wc.cbWndExtra = 0L;</p>
<p>wc.hInstance = hInstance;</p>
<p>wc.hIcon = NULL;</p>
<p>wc.hCursor = NULL;</p>
<p>wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);</p>
<p>wc.lpszMenuName = NULL;</p>
<p>wc.lpszClassName = &#8220;Gameku&#8221;;</p>
<p>wc.hIconSm = NULL;</p>
<p>RegisterClassEx( &amp;wc );</p>
<p>// membuat window</p>
<p>HWND hWnd = CreateWindow( &#8220;Gameku&#8221;, &#8220;Judul Game Anda Di Sini&#8221;,</p>
<p>WS_BORDER, 0, 0, 640, 480,</p>
<p>GetDesktopWindow(), NULL, wc.hInstance, NULL );</p>
<p>MSG msg;</p>
<p>// tampilkan jendela</p>
<p>ShowWindow( hWnd, SW_SHOWDEFAULT );</p>
<p>// inisialisasi interface-interface DirectX</p>
<p><strong>if (SUCCEEDED(InisialisasiDirectX(hWnd, hInstance)))</strong></p>
<p><strong> {</strong></p>
<p>// game loop</p>
<p>while (bKeluar != TRUE)</p>
<p>{</p>
<p>// cek message</p>
<p>if ( PeekMessage( &amp;msg, NULL, 0U, 0U, PM_REMOVE))</p>
<p>{</p>
<p>TranslateMessage(&amp;msg);</p>
<p>DispatchMessage(&amp;msg);</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p><strong>// proses render dan logika game</strong></p>
<p><strong> GameLoop();</strong></p>
<p>}</p>
<p>}</p>
<p><strong>}</strong></p>
<p><strong>HapusSemuaObyekDirectX();</strong></p>
<p>DestroyWindow(hWnd);</p>
<p>UnregisterClass( &#8220;Gameku&#8221;, wc.hInstance );</p>
<p>return 0;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>3.7 Compile Dan Build</p>
<p>Sebelum Anda melakukan compile dan build aplikasi game Anda, satu hal lagi yang perlu Anda lakukan yaitu me-link library-library DirectX yang kita gunakan. Klik menu Project&#8211;&gt;Settings dan klik tab “Link”. Anda akan melihat library-library yang akan di-link saat proses build aplikasi Anda. Library-library tersebut adalah library standar pembuatan aplikasi window.</p>
<p>Karena kita telah melakukan inisialisasi Direct3D dan DirectInput maka kita harus me-link library “d3d9.lib” dan “dinput8.lib”. Interface font berada pada library “d3dx9.lib”. Pada saat pembuatan device keyboard dan device mouse kita menggunakan GUID DirectX, maka kita harus me-link library “dxguid.lib”. Maka library-library yang akan di-link akan tampak seperti pada gambar di bawah ini&#8230;</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Inisialisasi Direct3D_ilkom_files/image005.jpg" alt="image005" width="450" height="295" /></p>
<p>Sekarang Anda dapat melakukan compile dan build aplikasi Anda. Klik pada menu Build&#8211;&gt;Rebuild All. Selamat !!! Anda telah dapat menyiapkan Direct3D dan DirectInput untuk aplikasi game Anda. Cukup menyenangkan bukan? Gambar di bawah adalah tampilan window aplikasi Anda.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Inisialisasi Direct3D_ilkom_files/image006.jpg" alt="image006" width="450" height="336" /></p>
<p>Keseluruhan source-code dan EXE dari bab ini, silahkan buka file “Bab3-InisialisasiDirectX.ZIP”. Mohon maaf bila terdapat kesalahan penulisan kode pada bab ini.</p>
<p>3.9 FAQ (Frequently Asked Questions)</p>
<p>Semoga FAQ ini dapat membantu Anda bila mendapat kesulitan&#8230;</p>
<p>Tanya : Kenapa pada saat compile, VC++ menampilkan pesan “error C2065:</p>
<p>&#8216;InisialisasiDirectX&#8217; : undeclared identifier” dan “error C2065:</p>
<p>&#8216;HapusSemuaObyekDirectX&#8217; : undeclared identifier” ?</p>
<p>Jawab : “Undeclared identifier” berarti suatu variabel atau fungsi yang digunakan belumlah di deklarasikan. Tetapi karena kita yakin sekali bahwa fungsi InisialisasiDirectX dan fungsi HapusSemuaObyekDirectX telah kita buat pada header “DirectXku.h”, maka kesalahan ini disebabkan karena kita belum meng-include header “DirectXku.h”. Pastikan Anda telah meng-include header ini pada source “Gameku.cpp”. Pastikan juga Anda telah meng-include header-header yang diperlukan oleh header “DirectXku.h” seperti “d3dx9.h”, “dinput.h” dan “stdio.h” karena bila hal ini tidak Anda lakukan&#8230; akan menyebabkan kesalahan yang sama seperti kasus di atas.</p>
<p>Tanya : Mengapa pada saat build, VC++ menampilkan pesan “Unresolved external symbol&#8230;” seperti pada gambar di bawah ??</p>
<p>Jawab : “Unresolved external symbol&#8230;” terjadi karena VC++ tidak menemukan simbol pada library yang diperlukan untuk membentuk aplikasi Anda. Pada tutorial ini digunakan library DirectX “dxguid.lib, dinput8.lib, d3d9.lib”. Pastikan Anda telah mengatur library</p>
<p>tersebut pada Project Settings untuk di-link oleh VC++.</p>
<p>Tanya : Bisakah saya menampilkan aplikasi secara full-screen ?</p>
<p>Jawab : Bisa banget ! Atur nilai dari anggota Windowed dari parameter Direct3D (Direct3D_PP.Windowed) agar bernilai FALSE.</p>
<p>Tanya : Mengapa ketika saya jalankan, aplikasi menampilkan kotak pesan “Inisialisasi Direct3D&#8230; Gagal” ?</p>
<p>Jawab : Hmm&#8230; saya belum pernah mengalami hal ini. Tetapi mungkin kesalahan di atas disebabkan karena terkorupsinya DLL Direct3D atau driver kartu grafik Anda. Coba install ulang DirectX 9 Runtime atau driver kartu grafik Anda.</p>
<p>Tanya : Mengapa ketika saya jalankan, aplikasi menampilkan kotak pesan “Gagal Membuat Device Direct3D” ?</p>
<p>Jawab : Kesalahan tersebut disebabkan karena pada saat pembuatan device Direct3D, format depth-buffer tidak dapat dilakukan oleh DirectX. Mungkin kartu grafik Anda tidak mendukung format tersebut. Perhatikan parameter Direct3D “Direct3D_PP.AutoDepthStencilFormat = D3DFMT_D16;” dan cobalah ubah nilainya dengan format lainnya. Format back buffer&#8230; saya rasa tidak ada masalah karena kita menggunakan format tampilan desktop. Bila desktop Anda menggunakan 32-bit dan aplikasi gagal dijalankan, coba ubah desktop Anda menjadi 16-bit. Saya pernah</p>
<p>mengalami ini ketika game saya di coba ke komputer teman yang menggunakan format desktop 32-bit.</p>
<p>OK&#8230; ini akhir dari bab 3 saya&#8230; mudah-mudahan berguna bagi Anda.</p>
<p>Saran, kritik maupun pekerjaan untuk saya dapat Anda kirimkan melalui e-mail, atau menghubungi saya di Yahoo Messenger (ID Apineraka_dn) ketika saya online.</p>
<p>Salam&#8230;</p>
<p>Aji Pamungkas</p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=35</wfw:commentRss>
		</item>
		<item>
		<title>Bab II.Pembuatan Window</title>
		<link>http://ajipamungkas.net23.net/?p=28</link>
		<comments>http://ajipamungkas.net23.net/?p=28#comments</comments>
		<pubDate>Fri, 13 Feb 2009 19:40:31 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[2. Pembuatan Window]]></category>

		<guid isPermaLink="false">http://ajirifa.wordpress.com/2009/02/13/bab-iipembuatan-window/</guid>
		<description><![CDATA[Download BAB2-Pembuatan Window.zip (487.94 KB)
Pada bab ini akan dipelajari pembuatan sebuah window yang akan digunakan oleh DirectX untuk menampilkan frame hasil render. Bila Anda telah mengetahui cara membuat sebuah window, Anda dapat melewati bab ini. Bab ini dan bab seterusnya mengharap Anda telah mengerti perintah dasar C++ misalnya apa itu komentar, tipe-tipe data, global, private, [...]]]></description>
			<content:encoded><![CDATA[<p>Download <a href="http://www.megaupload.com/?d=UVS0HWEH"><strong>BAB2-Pembuatan Window.zip</strong> (487.94 KB)</a></p>
<p>Pada bab ini akan dipelajari pembuatan sebuah window yang akan digunakan oleh DirectX untuk menampilkan frame hasil render. Bila Anda telah mengetahui cara membuat sebuah window, Anda dapat melewati bab ini. Bab ini dan bab seterusnya mengharap Anda telah mengerti perintah dasar C++ misalnya apa itu komentar, tipe-tipe data, global, private, public, class, if, if-else, switch, while dan sebagainya. Carilah buku dan referensi mengenai bahasa C++.</p>
<p>2.1 Tentang Window</p>
<p>Sebuah aplikasi game pada PC memerlukan sebuah window sebagai tempat untuk menampilkan frame hasil render. Berbeda dengan aplikasi-aplikasi jenis lain, sebagian besar aplikasi game menggunakan seluruh ruang (viewport / client-area) pada window untuk menampilkan frame walaupun dimungkinkan untuk menggunakan sebagian ruang window. Hal ini dilakukan agar pengguna dapat melihat tampilan aplikasi secara lebih jelas dan detil bila aplikasi ditampilkan dalam bentuk jendela.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image002.jpg" alt="image002" width="450" height="156" /></p>
<p>Perhatikan perbedaan kedua window ini. Window disebelah kiri menggunakan sebagian ruang window sebagai viewport, sedangkan window disebelah kanan menggunakan seluruh ruang window sebagai viewport. DirectX menampilkan hasil render pada viewport tersebut. Tutorial ini akan menggunakan “Single document window”.</p>
<p>2.2 Membuat Window</p>
<p>Membuat sebuah window tidaklah terlalu sulit. Yang terpenting adalah Anda mengetahui dan mengerti caranya. Berbeda dengan Delphi yang memiliki Form untuk mempermudah pembuatan window, pemrogram VC++ harus membuat window sendiri.</p>
<p>1. Klik File&#8211;&gt; New dan pada tab Projects, buatlah sebuah “Win32 Application” dengan nama “Gameku”. Klik OK maka VC++ akan meminta Anda untuk memilih satu diantara “An empty project”,</p>
<p>“A simple Win32 Application” atau “A typical &#8216;Hello World!&#8217; Application”. Pilihlah “An empty project” karena Anda akan mempelajari pembuatan sebuah window dari awal. Klik Finish untuk membuat sebuah “empty project”.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image003.jpg" alt="image003" width="327" height="139" /> <img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image004.jpg" alt="image004" width="174" height="83" /></p>
<p>2. Perhatikan workspace Anda. Sebuah project baru telah terbentuk tetapi project tersebut masih kosong. Kemudian klik FileàNew dan pada tab Files pilihlah “C++ Source Files”. Isi dengan name “Gameku” dan aktifkan pilihan “Add to Project”. Klik OK untuk membuat file “Gameku.cpp”.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image005.jpg" alt="image005" width="153" height="159" /></p>
<p>3. Perhatikan workspace Anda. File “Gameku.cpp” telah terbentuk. Klik ganda file tersebut dan VC++ akan membawa Anda pada editor. Pada Editor inilah Anda akan melakukan coding (menulis kode program).</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image006.jpg" alt="image006" width="306" height="111" /></p>
<p>4. Untuk membuat sebuah window, Anda dapat menggunakan file “windows.h” yang merupakan header bawaan VC++ (Anda tak perlu bingung mencarinya). Ketikkan saja :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// include header yang diperlukan<br />
#include &lt;windows.h&gt;</p>
<p>// deklarasi variabel-variabel global<br />
bool bKeluar = FALSE;</p>
<p>// fungsi-fungsi<br />
// winmain<br />
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE , LPSTR , int nCmdShow)<br />
{<br />
return 0;<br />
}</td>
</tr>
</tbody>
</table>
<p>Variabel bKeluar akan digunakan untuk menutup aplikasi. Fungsi main merupakan fungsi utama C++ yang akan dipanggil pertama kali bila sebuah aplikasi dijalankan. Pada pemrograman GUI (graphic user-interface) di Windows, fungsi main diubah menjadi fungsi WinMain. Fungsi ini memerlukan empat buah parameter untuk diisi ketika ia dipanggil.</p>
<p>Berbeda dengan aplikasi DOS, aplikasi Windows merupakan event-driven. Maksudnya adalah aplikasi window menunggu sistem untuk mengirim input dan pesan (message) mengenai apa yang terjadi pada window tersebut. Karena di sebuah window (parent window) dimungkinkan memiliki window-window lainnya (child window), maka diperlukan sebuah prosedur yaitu sebuah fungsi yang akan memproses pesan yang dikirim oleh sistem.</p>
<p>Perhatikan gambar di bawah ini untuk memahami pengertian parent window dan child window. Dekstop merupakan parent bagi Window Dev-C++ dan Window VC++. Jadi bila Anda menutup Desktop, maka child window dari Desktop juga akan ditutup. Window VC++ memiliki child dan menjadi parent bagi Window Basetsd.h, Window Stlcomp.h dan Window Gameku.cpp. Child window tersebut akan ditampilkan ketika Anda melakukan editing. Bila Anda menutup Window VC++, maka seluruh child window dari VC++ juga akan ditutup tetapi Window Dev-C++ tidak akan ditutup.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image008.jpg" alt="image008" width="450" height="253" /></p>
<p>Pada aplikasi game, jarang sekali yang menggunakan banyak window di dalam sebuah window untuk berinteraksi dengan pengguna. Sebagian besar aplikasi game hanya memiliki satu window yang full-screen dan satu prosedur. Bagaimana membuat prosedur untuk memproses input-input yang terjadi pada window dari aplikasi game ?</p>
<p>5. Ketikkan kode berikut dibawah komentar “// fungsi-fungsi” dan sebelum fungsi main.</p>
<p>Pesan-pesan yang terjadi, disimpan oleh variabel “msg”. Bila terdapat pesan WM_KEYDOWN dengan wParam VK_ESCAPE maka aplikasi akan ditutup. Begitupula bila terjadi pesan WM_DESTROY. Fungsi DefWindowProc akan memastikan bahwa semua pesan harus diproses. Pesan-pesan yang mungkin terjadi diantaranya :</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// fungsi yang memproses pesan untuk window<br />
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)<br />
{<br />
switch (msg)<br />
{<br />
case WM_KEYDOWN:<br />
switch (wParam)<br />
{<br />
case VK_ESCAPE:<br />
bKeluar = TRUE;<br />
break;<br />
}<br />
break;<br />
case WM_DESTROY:<br />
bKeluar = TRUE;<br />
break;<br />
}<br />
return DefWindowProc(hWnd, msg, wParam, lParam);<br />
}</td>
</tr>
</tbody>
</table>
<p>6. Saatnya membuat window. Ketikkan kode yang ditebalkan berikut ini :</p>
<table border="1" cellspacing="0" cellpadding="0" width="329">
<tbody>
<tr>
<td width="168">
<p align="center"><strong><em>MSG</em></strong></p>
</td>
<td width="161" valign="top"><strong><em>Penjelasan</em></strong></td>
</tr>
<tr>
<td width="168">WM_CREATE</td>
<td width="161">window dibuat</td>
</tr>
<tr>
<td width="168">WM_DESTROY</td>
<td width="161">window ditutup</td>
</tr>
<tr>
<td width="168">WM_KEYDOWN</td>
<td width="161">terjadi penekanan tombol keyboard</td>
</tr>
<tr>
<td width="168">WM_MOVE</td>
<td width="161">window telah selesai digerakkan</td>
</tr>
<tr>
<td width="168">WM_MOVING</td>
<td width="161">window sedang digerakkan</td>
</tr>
<tr>
<td width="168">WM_QUIT</td>
<td width="161">window ditutup berdasarkan perintah PostQuitMessage</td>
</tr>
<tr>
<td width="168">WM_SIZE</td>
<td width="161">window telah dirubah ukurannya</td>
</tr>
<tr>
<td width="168">WM_SIZING</td>
<td width="161">window sedang dirubah ukurannya</td>
</tr>
</tbody>
</table>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td>// winmain<br />
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE , LPSTR , int nCmdShow)<br />
{<br />
<strong>// pembuatan struktur window class</strong><br />
<strong> WNDCLASSEX wc;</strong><br />
<strong> wc.cbSize = sizeof(WNDCLASSEX);</strong><br />
<strong> wc.style = CS_OWNDC|CS_NOCLOSE;</strong><br />
<strong> wc.lpfnWndProc = MsgProc;</strong><br />
<strong> wc.cbClsExtra = 0L;</strong><br />
<strong> wc.cbWndExtra = 0L;</strong><br />
<strong> wc.hInstance = hInstance;</strong><br />
<strong> wc.hIcon = NULL;</strong><br />
<strong> wc.hCursor = NULL;</strong><br />
<strong> wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);</strong><br />
<strong> wc.lpszMenuName = NULL;</strong><br />
<strong> wc.lpszClassName = &#8220;Gameku&#8221;;</strong><br />
<strong> wc.hIconSm = NULL;</strong><br />
<strong> RegisterClassEx( &amp;wc );</strong></td>
</tr>
</tbody>
</table>
<p>Sebelum membuat window, terlebih dahulu Anda harus membuat window class berdasarkan struktur WNDCLASSEX. Kemudian anggota window class tersebut Anda isi sebelum di-register dengan perintah RegisterClassEX. Berikut adalah penjelasan dari beberapa anggota struktur WNDCLASSEX :</p>
<table border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td width="153"><strong><em>Anggota WNDCLASSEX</em></strong></td>
<td width="423"><strong><em>Penjelasan</em></strong></td>
</tr>
<tr>
<td width="153">cbSize</td>
<td width="423">Ukuran byte dari struktur. Harus diisi dengan “sizeof(WNDCLASSEX)”</td>
</tr>
<tr>
<td width="153">style</td>
<td width="423">Elemen tambahan. Isi dengan CS_OWNDC.</td>
</tr>
<tr>
<td width="153">lpfnWndProc</td>
<td width="423">Prosedur proses yang digunakan oleh window.</td>
</tr>
<tr>
<td width="153" valign="top">hbrBackground</td>
<td width="423">Memberi latar window dengan warna tertentu. Isi dengan “(HBRUSH) (BLACK_BRUSH)” untuk memberi warna hitam.<br />
GetStockObject</td>
</tr>
<tr>
<td width="153">lpszClassName</td>
<td width="423">Nama <em>class.</em></td>
</tr>
</tbody>
</table>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong>// membuat window</strong></p>
<p><strong> HWND hWnd = CreateWindow( &#8220;Gameku&#8221;, &#8220;Judul Game Anda Di Sini&#8221;,</strong><br />
<strong> WS_OVERLAPPEDWINDOW, 0, 0, 640, 480,</strong><br />
<strong> GetDesktopWindow(), NULL, wc.hInstance, NULL );</strong></p>
<p><strong> MSG msg;</strong></p>
<p><strong> // tampilkan jendela</strong><br />
<strong> ShowWindow( hWnd, SW_SHOWDEFAULT );</strong></p>
<p><strong> // inisialisasi interface-interface DirectX</strong></td>
</tr>
</tbody>
</table>
<p>Window dibuat dengan perintah CreateWindow dengan mengisi parameter-parameter fungsi tersebut. Berikut adalah penjelasan parameter-parameter tersebut :</p>
<p>HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);</p>
<table border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td width="167">
<p align="center"><strong><em>Parameter</em></strong></p>
</td>
<td width="409">
<p align="center"><strong><em>Penjelasan</em></strong></p>
</td>
</tr>
<tr>
<td width="167">lpClassName</td>
<td width="409">Nama <em>class</em> pada <em>window class</em> yang Anda buat sebelumnya.</td>
</tr>
<tr>
<td width="167">lpWindowName</td>
<td width="409">Nama window yang akan ditampilkan di sebelah kiri atas window.</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="0" width="480">
<tbody>
<tr>
<td width="167">
<p align="center"><strong><em>Parameter</em></strong></p>
</td>
<td width="409">
<p align="center"><strong><em>Penjelasan</em></strong></p>
</td>
</tr>
<tr>
<td width="167">dwStyle</td>
<td width="409"><em>Style</em> dari window yang Anda gunakan.</td>
</tr>
<tr>
<td width="167">x</td>
<td width="409">Posisi x window berdasarkan <em>window parent-</em>nya</td>
</tr>
<tr>
<td width="167">y</td>
<td width="409">Posisi y window berdasarkan <em>window parent</em>-nya</td>
</tr>
<tr>
<td width="167">nWidth</td>
<td width="409">Lebar window</td>
</tr>
<tr>
<td width="167">nHeight</td>
<td width="409">Tinggi window</td>
</tr>
<tr>
<td width="167" valign="top">hWndParent</td>
<td width="409"><em>Parent</em> dari window yang akan dibuat. Gunakan fungsi GetDesktopWindow untuk menggunakan desktop sebagai <em>parent</em> dari window ini.</td>
</tr>
<tr>
<td width="167">hMenu</td>
<td width="409">Menu pada window Anda. Gunakan NULL bila window tersebut tidak memiliki menu.</td>
</tr>
<tr>
<td width="167">hInstance</td>
<td width="409"><em>Instance</em> yang digunakan.</td>
</tr>
<tr>
<td width="167">lpParam</td>
<td width="409">Parameter. Isi dengan NULL.</td>
</tr>
</tbody>
</table>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong> // game loop</strong><br />
<strong> while (bKeluar != TRUE)</strong><br />
<strong> {</strong><br />
<strong> // cek message</strong><br />
<strong> if ( PeekMessage( &amp;msg, NULL, 0U, 0U, PM_REMOVE))</strong><br />
<strong> { </strong><br />
<strong> TranslateMessage(&amp;msg);</strong><br />
<strong> DispatchMessage(&amp;msg);</strong><br />
<strong> }</strong><br />
<strong> else</strong><br />
<strong> { </strong><br />
<strong> // proses render dan logika game</strong><br />
<strong> }</strong><br />
<strong> }</strong></td>
</tr>
</tbody>
</table>
<p>Perulangan di atas akan terus dilakukan selama variabel bKeluar tidak bernilai TRUE. Kita telah mengatur bahwa bila terjadi pesan WM_KEYDOWN dengan wParam VK_ESCAPE, maka variabel bKeluar akan bernilai TRUE. Penekanan tombol ESC pada keyboard tersebut akan menghentikan perulangan tersebut. Perulangan ini disebut juga game loop pada aplikasi game.</p>
<p>Hal pertama yang harus dilakukan adalah melihat apakah terdapat pesan dengan menggunakan fungsi PeekMessage. Bila terdapat terdapat pesan, maka pesan tersebut akan diterjemahkan dan dikirim ke prosedur pesan (MsgProc). Jika tidak terdapat pesan, maka game akan ditampilkan. Hal ini akan menyebabkan, misalkan window di maximize atau sedang dipindahkan, maka game tidak akan ditampilkan. Di dalam game loop inilah semua hal yang berhubungan dengan game Anda, misalkan rendering dan logika game, akan dilakukan.</p>
<table style="font-family:Courier New;font-size:10pt;" border="0" cellspacing="0" cellpadding="0" width="100%" bgcolor="#eeeeee">
<tbody>
<tr>
<td><strong> DestroyWindow(hWnd);</strong><br />
<strong> UnregisterClass( &#8220;Gameku&#8221;, wc.hInstance );</strong><br />
<strong> return 0;</strong><br />
<strong>// akhir dari winmain</strong><br />
<strong>}</strong></td>
</tr>
</tbody>
</table>
<p>Fungsi DestroyWindow akan menutup window. Fungsi ini akan dipanggil bila aplikasi keluar dari game loop. Bila nanti Anda telah mempelajari inisialisasi interface DirectX, maka proses menghapus interface tersebut dari memori, akan dilakukan sebelum fungsi DestroyWindow dipanggil.</p>
<p>2.3 Tampilan Aplikasi</p>
<p>Compile, Build dan jalankan aplikasi Anda. Maka tampilan window yang telah Anda buat akan tampak seperti gambar di bawah ini. Selamat !!! . Untuk melihat keseluruhan source-code dan EXE dari bab ini, silahkan buka file “BAB2-Pembuatan Window”.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Pembuatan Window_ilkom_files/image009.jpg" alt="image009" width="450" height="349" /></p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=28</wfw:commentRss>
		</item>
		<item>
		<title>Bab 1. Persiapan</title>
		<link>http://ajipamungkas.net23.net/?p=14</link>
		<comments>http://ajipamungkas.net23.net/?p=14#comments</comments>
		<pubDate>Fri, 13 Feb 2009 18:15:12 +0000</pubDate>
		<dc:creator>Aji Pamungkas</dc:creator>
		
		<category><![CDATA[1. Persiapan]]></category>

		<guid isPermaLink="false">http://ajirifa.wordpress.com/2009/02/13/bab-1-persiapan/</guid>
		<description><![CDATA[Download BAB1-Persiapan.zip (470.7 KB)
Didalam bab ini akan sedikit dijelaskan mengenai tool-tool yang Anda butuhkan, apa itu DirectX, proses installasi DirectX, menyiapkan VC++ agar dapat menggunakan DirectX dan membuat aplikasi DirectX dengan menggunakan wizard. Ketika saya baru pertama kali mempelajari DirectX, saya sempat frustasi menyiapkan DirectX pada VC++. Oleh karena itu, bila Anda seorang pemula, bacalah [...]]]></description>
			<content:encoded><![CDATA[<p>Download <a href="http://www.megaupload.com/?d=7F2LV3BP"><strong>BAB1-Persiapan.zip</strong> (470.7 KB)</a></p>
<p>Didalam bab ini akan sedikit dijelaskan mengenai tool-tool yang Anda butuhkan, apa itu DirectX, proses installasi DirectX, menyiapkan VC++ agar dapat menggunakan DirectX dan membuat aplikasi DirectX dengan menggunakan wizard. Ketika saya baru pertama kali mempelajari DirectX, saya sempat frustasi menyiapkan DirectX pada VC++. Oleh karena itu, bila Anda seorang pemula, bacalah bab ini dengan seksama karena bab ini merupakan dasar dari penggunaan DirectX pada VC++. Tetapi bila Anda telah mengetahui semua hal tersebut, Anda dapat melewati bab ini.</p>
<p>1.1 Tool-tool yang dibutuhkan</p>
<p>Untuk membuat sebuah game 3D dengan menggunakan DirectX, tool-tool berikut wajib Anda miliki:</p>
<p>1. DirectX SDK 9.0</p>
<p>SDK ini dapat Anda download dari situs Microsoft. Dikarenakan ukurannya yang sangat besar untuk didownload, Anda dapat mencari CD DirectX SDK di toko-toko yang menjual CD Software atau meminjam dari teman Anda yang memilikinya. Ukuran yang besar tersebut disebabkan oleh banyaknya contoh-contoh aplikasi DirectX (pada folder Samples), sedangkan yang Anda butuhkan, minimal, hanyalah file-file include(.H), library (.LIB) dan dokumentasi (.CHM).</p>
<p>2. IDE (Integrated Development Environment)</p>
<p>IDE adalah sekumpulan tool-tool untuk mengembangkan sebuah perangkat lunak pada suatu sistem operasi. Umumnya IDE terdiri atas editor, compiler dan builder. Aplikasi DirectX dapat di-compile dan di-build dengan mulus bila Anda menggunakan Visual C++ 6.0 atau Visual Studio .NET 2003. Dikarenakan IDE tersebut tidak gratis, Anda dapat menggunakan IDE CodeBlocks (<a href="http://www.codeblocks.org">www.codeblocks.org</a>) dengan compiler Microsoft VC++ Toolkit 2003 dan Microsoft Platform SDK.</p>
<p>3. 3D Model Editor dan Image Editor</p>
<p>3D Model Editor digunakan untuk membuat model-model 3D dengan animasinya. Tool-tool 3D Model Editor yang umum digunakan adalah 3D Studio Max, Maya dan Milkshape3D. Tool gratis yang dapat Anda gunakan yaitu Blender 3D. Model 3D yang Anda buat diharuskan untuk disimpan dalam format DirectX, yaitu X. Terdapat beberapa plug-in yang dapat meng-export model Anda tersebut untuk dijadikan format X. DirectX memiliki sebuah program, conv3ds.exe, yang tersimpan didalam folder “bin” pada SDK DirectX. Program tersebut dapat mengkonversi model Anda yang disimpan dengan format 3DS agar menjadi format X.</p>
<p>Sedangkan Image Editor digunakan untuk membuat dan memanipulasi suatu image (gambar/citra) dimana format image yang dapat digunakan oleh DirectX adalah format BMP, GIF, JPG dan TGA. Tool-tool yang umum digunakan adalah Adobe Photoshop dan Paint Shop Pro. Tool gratis dari Image Editor ini adalah The Gimp yang kini tersedia untuk Windows dan Linux.</p>
<p>4. Tekad, semangat dan kemauan keras</p>
<p>Ini tool yang Anda perlukan bagi diri Anda sendiri. Tanpa tool ini, apapun yang Anda lakukan, takkan mencapai tujuan yang Anda inginkan. Masuki alam bawah sadar Anda dan sugestikan di dalam pikiran Anda (kayak program hipnotis di tipi aja), bahwa Anda bisa dan mampu untuk mencapai tujuan yaitu membuat game 3D dengan DirectX.</p>
<p>Selain tool-tool wajib tersebut, satu hal yang perlu Anda perhatikan adalah jangan terlalu asik bersama komputer untuk membuat game. Bagilah waktu untuk kehidupan sosial Anda misalnya pergi jalan-jalan bersama teman, bergosip ria, fitness (olahraga) atau berduaan dengan sang pacar (kalo punya lho&#8230;). Jangan seperti saya yang di PHK (putus hubungan kekasih) gara-gara di depan komputer terus. <img src='http://ajipamungkas.net23.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>1.2 DirectX oh DirectX</p>
<p>DirectX merupakan sekumpulan API (Application Programming Interface) yang dikembangkan oleh Microsoft Corporation. API ini menyediakan berbagai interface, perintah serta fungsi untuk pengembangan aplikasi waktu nyata (real-time) dengan performa tinggi pada sistem operasi Windows. DirectX dapat digunakan secara gratis (bila Anda memiliki lisensi legal dari Windows yang Anda gunakan) dan dapat di-download dari situs Mirosoft (<a href="http://www.Microsoft.com/directx">www.Microsoft.com/directx</a>). SDK DirectX berisi file-file header berekstensi h, file-file library berekstensi LIB, file-file binari utilitas, contoh-­contoh aplikasi DirectX dan dokumentasi.</p>
<p>Motivasi utama Microsoft mengembangkan DirectX adalah dikarenakan performa aplikasi game dan aplikasi multimedia tanpa DirectX untuk platform Windows95 jauh dibawah performa aplikasi yang sama bila dikembangkan pada platform DOS. Tetapi kekurangan pemrograman aplikasi DOS yaitu yang harus memperhatikan konfigurasi perangkat keras yang berbeda-beda, menyebabkan para pemrogram memerlukan waktu dan biaya tambahan agar perangkat lunak yang dikembangkan menjadi kompatibel dengan berbagai perangkat keras.</p>
<p>Tutorial ini akan menggunakan DirectX versi 9.0. Bila Anda memiliki SDK DirectX terbaru, SDK tersebut dapat Anda gunakan dengan kode-kode yang terdapat dalam tutorial ini. DirectX versi 9.0 terdiri atas beberapa komponen sebagai berikut :</p>
<p>1. DirectXGraphics</p>
<p>Merupakan kombinasi dari dua komponen yang sebelumnya terpisah, pada DirectX versi 7 kebawah, yaitu Direct3D dan DirectDraw. Microsoft juga memberikan beberapa interface tambahan pada komponen ini, yaitu Direct3DX, yang mempermudah pemrogram untuk melakukan tugas-tugas manipulasi mesh, pembuatan buffer untuk menyimpan data-data vertex, mempermudah operasi loading file model 3D, penggunaan font dan penggunaan sprite.</p>
<p>2. DirectXAudio</p>
<p>Komponen ini digunakan untuk pemrograman suara digital (WAV) dan musik (MIDI).</p>
<p>3. DirectInput</p>
<p>DirectInput menangani input dari perangkat pengontrolan di dalam aplikasi game termasuk mouse, keyboard dan joystick.</p>
<p>4. DirectPlay</p>
<p>DirectPlay menangani koneksi pada suatu jaringan komputer seperti koneksi Internet, koneksi menggunakan protokol TCP-IP dan direct connection.</p>
<p>5. DirectShow</p>
<p>Komponen DirectShow berisi perintah-perintah untuk pembuatan aplikasi media streaming seperti menangkap dan memainkan format file audio video.</p>
<p>Ketersediaan seluruh komponen-komponen game PC (grafik, suara, musik, networking dan instalasi) dan dominasi sistem operasi Windows pada desktop computer, menjadikan DirectX sebagai API yang sering digunakan oleh para pengembang game. Kelebihan yang dimiliki DirectX adalah kemampuan untuk mengakses Hardware Abstraction Layer (HAL). Hardware Abstraction Layer merupakan fitur-fitur tambahan pada kartu grafik untuk meningkatkan performa operasi-operasi grafik 2D dan 3D. Kelebihan lainnya yaitu kemampuan emulasi (menyamai) fitur-fitur HAL seandainya kartu grafik pada sistem tidak memiliki fitur-fitur HAL. Proses emulasi ini disebut dengan Hardware Emulation Layer (HEL) tetapi akan mengakibatkan aplikasi berjalan lebih lambat.</p>
<p>DirectX memiliki banyak interface dan perintah yang tersimpan di dalam file –file dynamic link library (DLL). Ketika suatu aplikasi DirectX dijalankan, sistem operasi Windows memanggil file DLL DirectX yang menyimpan interface dan perintah tersebut. Beberapa interface penting DirectX dapat dilihat pada tabel dibawah ini.</p>
<table class="MsoNormalTable" style="width: 437pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr style="height: 11.5pt;">
<td style="border: 1pt solid black; padding: 0pt 5.4pt; width: 131.5pt; height: 11.5pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><strong><em><span style="line-height:150%;font-family:Courier;font-size:10pt;">Interface</span></em></strong><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">DirectX</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 11.5pt;" width="100" valign="top">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">DLL</span></strong></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 11.5pt;" width="307" valign="top">
<p class="Default" style="text-align:center;line-height:150%;" align="center"><strong><span style="line-height:150%;font-family:Courier;font-size:10pt;">Fungsi</span></strong></p>
</td>
</tr>
<tr style="height: 45.25pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 45.25pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirect3D</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 45.25pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3D8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 45.25pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Menyiapkan obyek Direct3D, menyiapkan lingkungan Direct3D dan mendeteksi kemampuan perangkat kartu grafik.</span></p>
</td>
</tr>
<tr style="height: 28.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 28.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirect3DDevice8</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 28.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3D8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 28.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Mengatur cahaya dan material, menyiapkan <em>back buffer</em>, menyiapkan <em>viewport</em>.</span></p>
</td>
</tr>
<tr style="height: 11.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 11.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirect3DTexture8</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 11.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3D8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 11.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Mengambil bitmap dari file BMP, DDS, JPG</span></p>
</td>
</tr>
<tr style="height: 11.25pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 11.25pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirect3DVertexBuffer8</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 11.25pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3D8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 11.25pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Manipulasi vertex</span></p>
</td>
</tr>
<tr style="height: 11.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 11.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">ID3DXMesh</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 11.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DX8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 11.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Membuat <em>mesh</em> dari file X dan memanipulasinya</span></p>
</td>
</tr>
<tr style="height: 11.25pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 11.25pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">ID3DXBuffer</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 11.25pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DX8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 11.25pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Tempat penyimpanan data vertex</span></p>
</td>
</tr>
<tr style="height: 28.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 28.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">ID3DXFont</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 28.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DX8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 28.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Pengaturan <em>font</em> (karakter-karakter teks) dan proses <em>render font</em> pada <em>device</em></span></p>
</td>
</tr>
<tr style="height: 11.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 11.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">ID3DXSprite</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 11.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">D3DX8.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 11.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Mempermudah proses <em>render sprite</em></span></p>
</td>
</tr>
<tr style="height: 28.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 28.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirectInput8</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 28.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DINPUT.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 28.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Membuat obyek DirectInput dan membuat <em>device keyboard</em> dan <em>device mouse</em></span></p>
</td>
</tr>
<tr style="height: 28.4pt;">
<td style="padding: 0pt 5.4pt; width: 131.5pt; height: 28.4pt;" width="175" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">IDirectInputDevice8</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 75.25pt; height: 28.4pt;" width="100" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">DINPUT.DLL</span></p>
</td>
<td style="padding: 0pt 5.4pt; width: 230.25pt; height: 28.4pt;" width="307" valign="top">
<p class="Default" style="line-height:150%;"><span style="line-height:150%;font-family:Courier;font-size:10pt;">Inisialisasi <em>device</em> DirectInput, mendapatkan akses pada perangkat keras input.</span></p>
</td>
</tr>
</tbody>
</table>
<p>1.3 Installasi SDK DirectX</p>
<p>Setelah Anda memiliki SDK DirectX, jalankan file “setup.exe” atau “install.exe”. Install pada folder “C:\DXSDK”. Setelah proses installasi selesai, maka drive C Anda akan bertambah ratusan mega akibat proses installasi tersebut :D.Berikut tampilannya&#8230;</p>
<p>Pada saat proses installasi, bila pada sistem Anda tidak terdapat runtime DirectX versi 9, maka Anda akan diminta untuk menginstall runtime DirectX tersebut. Anda juga dapat membatalkan installasi runtime DirectX bila Anda yakin pada sistem Anda telah terinstall DirectX 9.0. Untuk memastikannya, klik Start&#8211;&gt; Run dan ketikkan “dxdiag” pada window Run. Setelah window DirectX Diagnostic Tool muncul, Anda dapat melihat versi DirectX yang terinstall pada komputer Anda. Windows XP telah memiliki runtime DirectX 8.1. Bila Anda menggunakan SDK DirectX 8.1, maka Anda tak perlu melakukan installasi runtime. Pastikan versi runtime DirectX tersebut sama atau lebih tinggi dari versi SDK DirectX yang akan Anda gunakan.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image002.jpg" alt="image002" width="450" height="212" /></p>
<p>1.4 Menyiapkan VC++</p>
<p>Hal berikut yang harus dilakukan adalah menyiapkan VC++ agar dapat menggunakan SDK DirectX. Terdapat dua versi Visual C++ yang umum digunakan yaitu VC++ 6.0 pada Visual Studio 6.0 dan VC++ .NET pada Visual Studio .NET 2003. Menyiapkan VC++ pada kedua versi tersebut tidaklah jauh berbeda. Bila Anda menginstall SDK DirectX pada folder “C:\DXSDK” maka persiapan tersebut adalah :</p>
<p>1. Pada VC++ 6.0 klik pada menu Tools&#8211;&gt;Options dan tab Directories. Lihat Combo-box “Show directories for:” dan pastikan berada pada menu “Include files”. Kemudian tambahkan informasi direktori “C:\DXSDK\Include”. Pastikan direktori ini berada paling atas diantara direktori-direktori standar VC++.</p>
<p>2. Lihat kembali Combo-box “Show directories for:” dan ubah menjadi “Library files”. Tambahkan informasi direktori “C:\DXSDK\Lib” ke dalamnya. Tekan OK. Dan kini VC++ Anda telah mengetahui folder tempat file-file header dan library dari SDK DirectX. Hal ini penting di dalam proses compile dan build aplikasi Anda nantinya. Pastikan direktori ini berada paling atas diantara direktori-direktori standar VC++.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image003.jpg" alt="image003" width="395" height="316" /></p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image004.jpg" alt="image004" width="426" height="336" /></p>
<p>1.5 Mencoba Wizard Untuk Membuat Aplikasi DirectX 9</p>
<p>Bila Anda melakukan installasi SDK DirectX setelah installasi VC++, maka secara otomatis proses installasi akan menambahkan sebuah application wizard untuk aplikasi DirectX 9.0.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image005-1.jpg" alt="image005" width="310" height="200" /></p>
<p>Untuk melihat apakah terdapat DirectX9 AppWizard pada VC++ Anda, klik menu File&#8211;&gt;New dan klik tab Projects. Perhatikan wizard yang terdapat di window tersebut. Bila terdapat DirectX9 AppWizard, isikan nama project Anda, misalkan “tesDX1”. Secara otomatis VC++ akan membuatkan folder “tesDX1”. Klik OK.</p>
<p>Application Wizard ini dapat Anda gunakan untuk melakukan pengetesan apakah SDK DirectX dan VC++ telah disiapkan dengan baik dan benar. Setelah Anda menekan OK, Anda akan ditampilkan kotak-kotak jendela yang merupakan langkah-langkah (wizard) dari DirectX 9 AppWizard. Pada langkah pertama (Step 1 of 3), pilih “Single document window” dan non-aktifkan pilihan DirectInput dan DirectMusic. Anda hanya akan melakukan pengetesan, bukan membuat aplikasi sesungguhnya sehingga tidak memerlukan DirectInput dan DirectMusic. Perhatikan jumlah langkah yang berkurang menjadi “Step 1 of 2” akibat non-aktifnya DirectInput dan DirectMusic.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image006.jpg" alt="image006" width="444" height="216" /></p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image007.jpg" alt="image007" width="176" height="133" /></p>
<p>Klik Next dan Anda akan ditampilkan kotak langkah kedua. Pilih “Teapot”, “Direct3D fonts” dan “3D meshes (.x files)”. Kemudian klik tombol “Finish” dan kemudian VC++ akan mengenerasi file-file yang dibutuhkan.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image008.jpg" alt="image008" width="450" height="189" /></p>
<p>Perhatikan FileViewer dan klik file “tesDX1.cpp”. Kalo Anda ingin pusing, perhatikan dengan seksama kode-kode yang terdapat pada file tersebut J . Tetapi jangan ambil pusing dulu dengan kode-kode tersebut, ingat Anda hanya akan melakukan pengetesan.</p>
<p>Untuk mengetahui apakah SDK DirectX dan VC++ telah disiapkan dengan baik dan benar, Anda perlu melakukan compile dan build. Compile akan menjadikan file-file source code C++ (“bahasa manusia” pada file berekstensi CPP) menjadi binari (anggap aja “bahasa mesin” pada file berekstensi OBJ). File-file OBJ belum dapat dieksekusi (dijalankan pada mesin komputer) dan harus disatukan kembali untuk menjadi sebuah file executable (EXE) yang dapat dijalankan. Proses penyatuan OBJ untuk dijadikan EXE disebut dengan proses Build atau linking. Untuk membuat membuat file EXE, klik pada menu Build&#8211;&gt;Build tesDX1.exe atau menekan tombol F7. Build juga dapat dilakukan melalui menu Build&#8211;&gt;Rebuild All.</p>
<p>Bila Anda telah menyiapkan SDK DirectX dan VC++ dengan baik dan benar, maka proses compile dan build akan berjalan dengan lancar. Perhatikan pada jendela message dibawah VC++, file “tesDX1.exe” akan terbentuk bila VC++ menyatakan “0 error(s), 0 warning(s)”.</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image009.jpg" alt="image009" width="450" height="188" /></p>
<p>Selamat ! ! ! Anda telah membuat aplikasi DirectX menggunakan DirectX9 AppWizard. Klik menu Build&#8211;&gt;Execute tesDX1.exe untuk menjalankan aplikasi DirectX Anda. Berikut adalah tampilan aplikasi tersebut&#8230;</p>
<p><img src="http://ajipamungkas.net23.net/wp-content/images/dxtut/DX-Persiapan_ilkom_files/image010.jpg" alt="image010" width="339" height="288" /></p>
<p>Awas gucinya jangan digosok. Nanti keluar jinnya lho&#8230; hehehe&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ajipamungkas.net23.net/?feed=rss2&amp;p=14</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Code -->
