Friday, 8 February 2013

DirectX 9 : Program Sederhana (Part I)


IDE : Code::Blocks 10.05
Download SDK DirectX 9

Kita akan memulai dengan project kosong, pilih File-> Project -> Empty Project -> Go, ikuti petunjuk dari Wizard yg tampil seperti menentukan lokasi penyimpanan (masukkan nama project yang anda inginkan), menentukan Compiler (pilih kedua opsi, yaitu Debug dan Release). Kurang lebih seperti gambar berikut :

Gambar 1. Empty Project

Setelah finish, klik kanan pada project (pada sisi sebelah kiri), pilih Properties -> Build Targets -> Pilih Release, Pada bagian Type ubah yang sebelumnya Console application, menjadi GUI Application. Ini bertujuan agar tidak muncul console di belakang jendela program kita. Berikut gambar langkah-langkahnya :

Gambar 2. GUI Application

Selanjutnya kita tambahkan Compiler dan Linker DirectX kita pada project, caranya klik kanan File Project -> Build Options -> Pada bagian kiri pilih nama project kita diatas Debug dan Release. Lalu pilih tab Search Directories, dibagian bawah ada 3 tab, pilih tab Compiler lalu tambahkan (Add) lokasi file header DirectX kita, jika anda menginstall SDK DirectX secara default, maka kita dapat mengisikan lokasinya dengan "C:\Program Files\Microsoft DirectX SDK (June 2010)\Include" atau anda dapat mengklik tombol Browse untuk mencari lokasinya, lalu ok, jika ditanya Relative Path, pilih No. Jika terlanjur memilih Yes, dapat memilih browse lagi lalu ok maka akan ditanya lagi hahaha atau dapat melanjutkannya dengan nama lokasi "..\..\..\..\..\Program Files\Microsoft DirectX SDK (June 2010)\Include". Kita lanjut ke tab kedua yaitu Linker. Tambahkan lokasi Object File Library (.lib) dengan memilih folder lib. Kita tambahkan kedua folder di dalam lib, yaitu folder 'x64' dan 'x86'. Hasil akhir :

Gambar 3. Menambahkan lokasi library DirectX

Lalu tambahkan file cpp baru, dengan memilih File -> Empty File, jika ditanya apakah anda ingin menambahkan ke project, pilih yes, lalu namakan dengan "Main.cpp" atau sesuai yang anda inginkan. Selanjutnya ketikkan (jangan di kopi-paste yah ) kode berikut :


#include <windows.h>

#define SCREEN_LEBAR 640
#define SCREEN_TINGGI 480

const char gClassName[] = "myWindowClass";

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    //style , dapat resize horizontal dan vertikal 
    wc.style = CS_HREDRAW | CS_VREDRAW;
    //prosedur windows
    wc.lpfnWndProc = WindowProc;
    //instance windows
    wc.hInstance = hInstance;
    //kursor berbentuk panah
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    //warna background
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = gClassName;

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          gClassName,
                          "DirectX 9 : Program Sederhana",
                          WS_OVERLAPPED | WS_SYSMENU, //for fullscreen -> WS_EX_TOPMOST | WS_POPUP,
                          0, 0,
                          SCREEN_LEBAR, SCREEN_TINGGI,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // enter the main loop:
    MSG msg;
 
 //GetMessage, program menunggu pesan yang siap untuk diproses
    while(GetMessage(&msg, NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch(message)
    {
        case WM_SYSKEYDOWN:
        case WM_KEYDOWN:

        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;           //everything is gonna be ok :)
        } break;
    }

    return DefWindowProc (hWnd, message, wParam, lParam);
}

Kode diatas akan membuat sebuah jendela program sederhana yang (sangat) minimalis, dan kosong melompong dengan background putih (Seperti pada Contoh Aplikasi Win32). Pada kode diatas belum nampak satupun kode DirectX, file headernya aja belom dipanggil . Looping utama program ada pada fungsi GetMessage, fungsi ini baru bereaksi jika ada pesan (intruksi dari user) yang tersedia untuk diproses, seperti menutup program (meng-klik tombol Close). Tetapi untuk membuat sebuah game (pada zaman sekarang), program harus terus berjalan dan menampilkan gambar walaupun dalam keadaan nganggur/idle (tidak dimainkan). Untuk itu kita perlu menggunakan fungsi lain untuk program kita, yaitu fungsi PeekMessage. Fungsi ini akan tetap memproses sekalipun tidak ada pesan yang dikirim. Ada 5 parameter yang harus diisi pada PeekMessage. Untuk itu kita sedikit modifikasi agar program tidak langsung menutup. Berikut potongan kodenya :


    //get the message
    while(TRUE)
    {
        while(PeekMessage(&msg, NULL,0,0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if(msg.message == WM_QUIT) break;
    }

Penambahan nilai PM_REMOVE agar pesan yang diterima dan telah diproses dibuang dalam antrian (queue), masih ada beberapa nilai lagi yang dapat digunakan, tapi penggunaan PM_REMOVE sudah lebih dari cukup . Dengan ini setidaknya program kita sudah memiliki pondasi yang kuat. Sampai ketemu diartikel selanjutnya...

 - krofz
 

back to top

back to top