Grafik Library

11.2. Grafik Library

Pada pemrograman C++ dipelajari. Untuk lebih jelasnya ikuti mempunyai library yang disebut langkah-langkah program berikut: OpenGL. Library ini memanfaatkan 

Pada saat membuat proyek baru Windows API dalam proses

harus kita arahkan ke library pembentukan grafik. Dengan

OpenGL

menggunakan OpenGL pembuatan  Setelah proyek diciptakan maka grafik jadi sangat mudah. Namun

kita langsung mempunyai main() demikian perlu diketahui bahwa

program yang apabila dijalankan pemrograman menggunakan library

(run) langsung ada hasilnya harus mengikuti prosedur yang telah

Selanjutnya tugas pemrogram ditetapkan oleh pembuatnya.

tinggal memodifikasi bagian- Pada prinsipnya kita tinggal

bagian tertentu disesuaikan memodifikasi program yang telah

dengan rancangan program yang ada, pada bagian mana yang

telah ditetapkan

dimodifikasi agar sesuai dengan Gambaran pembuatan proyek baru keperluannya itulah yang harus seperti berikut:

Gambar 11.1. pembuatan proyek

Pada saat anda sudah memilih siap dan di dalamnya sudah ada membuat proyek baru maka pilihlan main() program yang siap OpenGL sebagai basis proyek ini, ditampilkan; program inilah yang siap seperti terlihat dalam gambar di atas.

dimodifikasi. Perhaikan gambar di Setelah OK maka proyek langsung bawah:

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

Gambar 11.2. proyek OpenGL

Terlihat pada gambar bahwa sudah

11.3. Grafik Sederhana

ada main() program dan yang penting Pengenalan grafik biasanya dalam editor terlihat library yang dimulai dengan membuat garis. Garis hendak dipakai untuk membuat grafik

di dalam grafik merupakan kumpulan ini. Lihat cara penulisan dibawah ini:

titik-titik yang berupa pixel, resolusi pixel akan mempengaruhi hasil

#include <windows> tampilan; makin rapat pixel grafik #include <gl/gl.h>

yang dihasilkan makin halus sehingga kadang kelihatan jadi lebih

Dua buah header tersebut yang indah dan menarik. Perintah dalam dibutuhkan untuk menghubungi OpenGL untuk membuat garis: library pada saat dibutuhkan oleh program dalam membentuk grafik.

Program 11.1

glClearColor ( 1.0f , 1.0f , 1.0f , 0.0f );

glClear (GL_COLOR_BUFFER_BIT);

glBegin (GL_LINES);

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , 0.5f );

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , ‐ 0.5f );

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.5f , 0.0f );

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , 0.0f );

glEnd ();

SwapBuffers (hDC);

Setelah dieksekusi potongan merupakan dua perintah bukan satu program diatas maka akan perintah. Namun karena keduanya menampilan hasil grafik seperti saling terkait satu sama lain maka gambar dibawah ini:

dijadikan satu baris, walaupun jika hendak ditulis pada baris yang berbeda juga tidak mengapa. Penjelasan lebih lanjut, format glColor3f adalah :

glColor3f(red, green, blue);

Argumen red, green, blue untuk mengaktifkan masing-masing diisi bilangan pecahan 1 (1.0), untuk mematikan diisi bilangan pecahan 0 (0.0). Dapat dilihat contoh di atas semuanya dimatikan berarti titik-titik pixel akan berwarna hitam (seperti dilihat di gambar hasil eksekusi). Kombinasi dari ketiga argument ini akan menghasilkan warna yang

Gambar 11.3. Garis indah dan sangat menarik. Perlu diketahui pula bahwa grafik yang

Fungsi utama sehingga dapat terjadi merupakan grafik Cartesian menghasilkan grafik seperti gambar yaitu grafik yang titik nolnya di di atas adalah:

tengah, oleh karena itu untuk membuat garis tegak dibutuhkan dua

glColor3f (0.0f, 0.0f, 0.0f); glVertex2f glVertex2f yang masing-masing (0.0f, 0.5f);

argumen diisi dengan( 0.0, 0.5) dan glColor3f (0.0f, 0.0f, 0.0f); glVertex2f

(0.0, -0.5). Begitu juga dengan garis (0.0f, ‐0.5f);

mendatar dibutuhkan dua glVertex2f, tentu saja dengan argumen yang

bisa dipahami bahwa glColor3f(0.0f, berbeda dalam hal ini (-0.5, 0.0) dan 0.0f, 0.0f) merupakan perintah untuk

(0.5, 0.0). Dengan memodifikasi member warna titik-titik dari pixel program tersebut bisa didapatkan

yang dihasilkan oleh glVertex2f(0.0f, tampilan grafik yang menarik. 0.5f). Sebenarnya masingmasing

Selanjutnya harus ada glBegin() baris pada potongan program di atas

dan glEnd(), karena perintah itu 376

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

merupakan awal dan akhir program angka pecahan dan dapat grafik yang dijalankan. Pada glBegin

dikombinasikan sehingga ada argumen GL_LINES, ini mendapatkan warna yang menarik. dimaksudkan untuk membuat garis. Pada contoh program ini sengaja Sedangkan apabila hendak membuat

dibuat putih dengan bentuk yang lain maka perlu mengkombinasikan red, green, blue disesuaikan, contoh ada semuanya diisi 1 (1.0). Untuk GL_TRIANGLES untuk segitiga, menciptakan atau mendapatkan GL_QUADS untuk segi empat, atau perubahan argumen (jika diubah) GL_POLYGON untuk segi banyak.

diperlukan perintah:

Perintah glClearColor untuk mengatur warna latar belakang glClear(GL_COLOR_BUFFER_BIT); window, dengan format sebagai berikut :

yang berarti perubahan warna pada perintah sebelumnya disimpan di

glClearColor(red, green, blue, alpha); buffer yang nanti pada saat eksekusi akan ditampilkan.

seperti perintah sebelumnya Program selengkapnya dapat argumen yang ada bisa diisi dengan

dilihat di bawah ini:

Program 11.2. #include <windows.h> #include <gl/gl.h>

/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC;

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f ;

/* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample" ; RegisterClass (&wc);

/* create main window */ hWnd = CreateWindow ( "GLSample" , "OpenGL Sample" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0 , 0 , 256 , 256 , NULL, NULL, hInstance, NULL);

/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);

/* program main loop */ while (!bQuit) {

/* check for messages */

if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))

{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }

else

{ TranslateMessage (&msg); DispatchMessage (&msg);

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

else

{ /* OpenGL animation code goes here */

glClearColor ( 1.0f , 1.0f , 1.0f , 0.0f );

glClear (GL_COLOR_BUFFER_BIT);

glBegin (GL_LINES);

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , 0.5f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , ‐ 0.5f );

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.5f , 0.0f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , 0.0f );

glEnd ();

SwapBuffers (hDC); } }

/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);

/* destroy the window explicitly */ DestroyWindow (hWnd);

return msg.wParam; }

/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

switch (message) { case WM_CREATE:

return 0 ; case WM_CLOSE:

PostQuitMessage ( 0 );

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

return 0 ;

case WM_DESTROY: return 0 ;

case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:

PostQuitMessage( 0 );

return 0 ; } return 0 ;

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

/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;

/* get the device context (DC) */ *hDC = GetDC (hWnd);

/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);

pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); }

/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }

Dalam program ini terlihat sangat ukuran window tinggal mengubah panjang, tetapi itulah yang terjadi argumen di dalam create main apabila memprogram menggunakan window, disana defaultnya adalah 0, library yang tersedia. Namun jika

0, 256, 256, angka ini dapat diubah harus membuat sendiri dari awal untuk mendapatkan window yang maka pemrograman kita akan lebih diinginkan. Begitu pula untuk header lama. Dengan memanfaatkan library window dapat disesuaikan. yang ada maka proses pemrograman

Lebih lanjut mengenai grafik akan menjadi lebih cepat efektif. untuk membuat segitiga misalnya Seperti telah diuraikan sebelumnya diperlukan tiga buah vertex, sehingga pemrogram tinggal mencari dimana perintah-perintah yang dibutuhkan yang harus dimodifikasi sesuai segabai berikut: kebutuhan. Contoh untuk mengubah

Program 11.3 glClear (GL_COLOR_BUFFER_BIT);

glBegin (GL_TRIAGLES);

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.0f , 0.5f );

glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f ( 0.5f , ‐ 0.5f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , ‐ 0.5f );

glEnd ();

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

Jangan lupa mengubah

11.4. Animasi Grafik

GL_LINES pada glBegin menjadi Pembuatan animasi bentuk- GL_TRIANGLES, kalau tidak diubah

bentuk dasar dalam OpenGL telah maka yang muncul akan satu garis disediakan. Untuk dapat

saja. memanfaatkannya kita harus Begitu juga untuk membuat segi

memahami perintah-perintah itu empat (kotak), segi lima, segi enam,

beserta arti argumen-argumen yang dan sebagainya. Makin banyak segi dipakainya. Sebagai contoh akan

dibutuhkan makin banyak vertex. dibuat sebuah program yang menganimasi kotak. Cermati program

berikut:

Program 11.4 #include <windows.h> #include <gl/gl.h>

/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = 0.0f ;

/* register window class */ 382

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GLSample" ; RegisterClass (&wc);

/* create main window */ hWnd = CreateWindow ( "GLSample" , "OpenGL Sample" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0 , 0 , 256 , 256 , NULL, NULL, hInstance, NULL);

/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);

/* program main loop */ while (!bQuit) {

/* check for messages */

if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))

{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }

else

{ TranslateMessage (&msg); DispatchMessage (&msg); } }

else

{ /* OpenGL animation code goes here */

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

glClearColor ( 1.0f , 1.0f , 1.0f , 0.0f );

glClear (GL_COLOR_BUFFER_BIT);

glPushMatrix ();

glRotatef (theta, 0.0f , 0.0f , 1.0f );

glBegin (GL_QUADS);

glColor3f ( 1.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , 0.5f ); glColor3f ( 0.0f , 1.0f , 0.0f ); glVertex2f ( 0.5f , 0.5f ); glColor3f ( 0.0f , 0.0f , 1.0f ); glVertex2f ( 0.5f , ‐ 0.5f ); glColor3f ( 0.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.5f , ‐ 0.5f );

glEnd (); glPopMatrix ();

SwapBuffers (hDC);

theta += 1.0f ; Sleep ( 1 ); } }

/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);

/* destroy the window explicitly */ DestroyWindow (hWnd);

return msg.wParam; }

/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

switch (message) { case WM_CREATE:

return 0 ; case WM_CLOSE:

PostQuitMessage ( 0 );

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

return 0 ;

case WM_DESTROY: return 0 ;

case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:

PostQuitMessage( 0 );

return 0 ; } return 0 ;

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

/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;

/* get the device context (DC) */ *hDC = GetDC (hWnd);

/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);

pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ; pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC );

/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }

Keluaran program di atas akan warna tersebut dimunculkan dengan menganimasikan kotak dengan mengkombinasikan argumen- warna-warni yang menarik dan argumen pada perintah glColor3f, berputar berlawanan arah jarum jam.

cermati dalam listing program. Dalam Gambar kotak yang terjadi seperti program yang sesungguhnya kotak berikut:

tersebut selain berwarna-warni juga berputar berlawanan arah putaran jarum jam (counter clockwise). Perintah apa yang membuat kotak ini berputar ? Kita lihat program di atas:

glRotatef (theta, 0.0f, 0.0f, 1.0f);

sesuai namanya perintah di ataslah yang menyebabkan kotak ini berputar. Format perintah ini secara lengkapnya sebagai berikut :  Argumen pertama theta untuk

mengatur kecepatan putar makin besar angkanya makin cepat putaran yang terjadi

 Argumen kedua jika diisi 1 (1.0) Gambar 11.4. Grafik berwarna warni

maka kotak akan berputar dengan sumbu garis horizontal (mendatar)

Jika diperhatikan atau dipelajari ke arah tertentu. Untuk memutar pasti akan Menarik bukan? Warna-

ke arah yang berlawanan dari 386

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

contoh, argumen diisi angka -1 (- akan zoom in dan zoom out 1.0)

bergantian.

 Argumen ketiga juga mirip dengan  Kombinasi dari argumen-argumen

argumen kedua namun yang ada akan membuat variasi berputarnya terhadap sumbu

pergerakan yang sangat menarik vertical (tegak lurus)

Untuk mengatur laju perputaran  Argumen keempat untuk memutar

animasi yang terjadi bisa dengan

kotak flat dengan sumbu titik nol memodifikasi theta, atau dengan diagram cartesius. Jika diisi angka

perintah sleep(argumen). Laju

1 (1.0) maka akan berputar kecepatan putar tergantung pada berlawanan arah putaran jarum nilai argumen pada sleep, makin jam (counter clockwise),

besar angkanya makin lambat bukan sedangkan untuk berputar searah

makin cepat. Lebih lanjut dengan

dengan arah putaran jarum jam grafik, jika akan membuat segi enam (clockwise) diisi angka -1 (-1.0). maka perubahan yang terjadi seperti Hal yang menarik jika argumen ini

berikut:

diisi angka 0 (0.0) maka kotak

Program 11.5 /* OpenGL animation code goes here */

glClearColor ( 0.0f , 0.0f , 0.0f , 1.0f );

glClear (GL_COLOR_BUFFER_BIT);

glPushMatrix (); glRotatef (theta, 0.0f , 0.0f , ‐ 1.0f ); glBegin (GL_POLYGON);

glColor3f ( 1.0f , 0.0f , 0.0f ); glVertex2f (‐ 0.3f , 0.54f ); glColor3f ( 0.0f , 1.0f , 0.0f ); glVertex2f ( 0.3f , 0.54f ); glColor3f ( 0.0f , 0.0f , 1.0f ); glVertex2f ( 0.61f , 0.0f );

glColor3f ( 0.0f , 1.0f , 1.0f ); glVertex2f ( 0.3f , ‐ 0.54f ); glColor3f ( 1.0f , 1.0f , 0.0f ); glVertex2f (‐ 0.3f , ‐ 0.54f );

glColor3f ( 1.0f , 1.0f , 1.0f ); glVertex2f (‐ 0.61f , 0.0f );

glEnd (); glPopMatrix ();

SwapBuffers (hDC);

theta += 2.0f ; Sleep ( 1 );

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

Tentu saja vertex berubah Selain glRotatef() pengaturan bertambah banyak, banyaknya vertex

animasi dapat juga dengan sesuai dengan jumlah sudut yang glTranslatef(). Dengan perintah ini dibentuk. Jangan lupa argumen pada

kita dapat menggerakkan obyek glBegin diisi dengan GL_POLYGON kekiri, kekanan, ke atas, maupun ke sehingga bisa menciptakan segi bawah. Contoh program sebagai banyak seperti yang dikehendaki. berikut:

Program 11.6 #include <windows.h> #include <gl/gl.h>

/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = ‐ 1.0f ; float alpha = ‐ 1.0f ;

/* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0 ; 388

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GraphGL" ; RegisterClass (&wc);

/* create main window */ hWnd = CreateWindow ( "GraphGL" , "OpenGL Graphics Animation" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0 , 0 , 512 , 512 , NULL, NULL, hInstance, NULL);

/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);

/* program main loop */ while (!bQuit) {

/* check for messages */

if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))

{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }

else

{ TranslateMessage (&msg); DispatchMessage (&msg); } }

else

{ /* OpenGL animation code goes here */

glClearColor ( 1.0f , 1.0f , 1.0f , 1.0f );

glClear (GL_COLOR_BUFFER_BIT);

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

glPushMatrix ();

glTranslatef (theta, alpha, 0.0f );

glColor3f ( 1.0f , 0.0f , 1.0f ); glRectf(‐ 0.2 , 0.2 , 0.2 , ‐ 0.2 );

glPopMatrix ();

SwapBuffers (hDC);

if (theta >= 1.0 ) { theta = ‐ 1.0f ; alpha = ‐ 1.0f ; }

else if (theta <= 1.0 )

{ theta += 0.01f ; alpha += 0.01f ; }

Sleep ( 10 ); } }

/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);

/* destroy the window explicitly */ DestroyWindow (hWnd);

return msg.wParam; }

/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

switch (message) {

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

case WM_CREATE: return 0 ; case WM_CLOSE:

PostQuitMessage ( 0 );

return 0 ;

case WM_DESTROY: return 0 ;

case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:

PostQuitMessage( 0 );

return 0 ; } return 0 ;

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

/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;

/* get the device context (DC) */ *hDC = GetDC (hWnd);

/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);

pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ;

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);

/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC );

/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }

Hasil eksekusi program di atas Argumen dalam glTranslatef () dibuat akan menggerakkan sebuah kotak variabel theta untuk argumen berjalan secara diagonal dari pojok pertama, alpha untuk argumen kiri bawah ke kanan atas secara kedua. Theta untuk mengatur gerak terus menerus. Akan tetapi jika ada horisontal dan alpha untuk mengatur penekanan mouse di taskbar maka gerak vertikal. Dengan mengubah- kotak berhenti, jika penekanan ubah nilai variabel tersebut kita bisa dilepas kotak jalan lagi. Untuk selesai

menggerakkan obyek tersebut secara bisa menggunakan tombol ESCape.

bebas sesuai dengan kehendak. Pada saat obyek bergerak bisa juga

11.5. Dasar-dasar Game

diatur perubahan warna atau

Untuk memahami pembuatan dikombinasi sehingga menjadi warna- game contoh program di atas bisa warni. Untuk lebih jelasnya ikuti dimodifikasi bagian glTranslatef(). program berikut:

Program 11.7 #include <windows.h> #include <gl/gl.h>

/************************** * Function Declarations **************************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message,

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

WPARAM wParam, LPARAM lParam); void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC); void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

/************************** * WinMain **************************/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) { WNDCLASS wc; HWND hWnd; HDC hDC; HGLRC hRC; MSG msg; BOOL bQuit = FALSE; float theta = ‐ 0.8f ; float alpha = ‐ 0.8f ;

int count = 0 ; float r, g, b;

/* register window class */ wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0 ; wc.cbWndExtra = 0 ; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "GraphGL" ; RegisterClass (&wc);

/* create main window */ hWnd = CreateWindow ( "GraphGL" , "OpenGL Graphics" , WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0 , 0 , 512 , 512 , NULL, NULL, hInstance, NULL);

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

/* enable OpenGL for the window */ EnableOpenGL (hWnd, &hDC, &hRC);

/* program main loop */ while (!bQuit) {

/* check for messages */

if (PeekMessage (&msg, NULL, 0 , 0 , PM_REMOVE))

{ /* handle or dispatch messages */ if (msg.message == WM_QUIT) { bQuit = TRUE; }

else

{ TranslateMessage (&msg); DispatchMessage (&msg); } }

else

{ /* OpenGL animation code goes here */

glClearColor ( 1.0f , 1.0f , 1.0f , 1.0f );

glClear (GL_COLOR_BUFFER_BIT);

glPushMatrix ();

glTranslatef (theta, alpha, 0.0f ); glColor3f (r, g, b);

glRectf(‐ 0.2 , 0.2 , 0.2 , ‐ 0.2 );

glPopMatrix ();

SwapBuffers (hDC);

if (count > 160 ) { theta ‐= 0.01f ; alpha ‐= 0.01f ; if (count == 320 ) {

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

count = 0 ; theta = ‐ 0.8f ; alpha = ‐ 0.8f ; }

else

count += 1 ;

r= 0.0f ; g= 1.0f ; b= 0.0f ; } else if (count <= 160 ) { theta += 0.01f ; alpha += 0.01f ;

count += 1 ; r= 1.0f ; g= 0.0f ; b= 1.0f ; }

Sleep ( 10 ); } }

/* shutdown OpenGL */ DisableOpenGL (hWnd, hDC, hRC);

/* destroy the window explicitly */ DestroyWindow (hWnd);

return msg.wParam; }

/******************** * Window Procedure ********************/ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

switch (message) {

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik

case WM_CREATE: return 0 ; case WM_CLOSE:

PostQuitMessage ( 0 );

return 0 ;

case WM_DESTROY: return 0 ;

case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE:

PostQuitMessage( 0 );

return 0 ; } return 0 ;

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

/******************* * Enable OpenGL *******************/ void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC) { PIXELFORMATDESCRIPTOR pfd; int iFormat;

/* get the device context (DC) */ *hDC = GetDC (hWnd);

/* set the pixel format for the DC */ ZeroMemory (&pfd, sizeof (pfd)); pfd.nSize = sizeof (pfd);

pfd.nVersion = 1 ; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24 ; pfd.cDepthBits = 16 ;

Direktorat Pembinaan SMK | 2008

Grafik Bahasa Pemrorgraman

pfd.iLayerType = PFD_MAIN_PLANE; iFormat = ChoosePixelFormat (*hDC, &pfd); SetPixelFormat (*hDC, iFormat, &pfd);

/* create and enable the render context (RC) */ *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC );

/****************** * Disable OpenGL ******************/ void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); }

Jika program dijalankan maka monoton. Penambahan variabel pada kotak akan bergerak secara diagonal

perintah glColor3f() argumen pertama dari pojok kiri bawah ke arah pojok r, kedua g, ketiga b, sehingga kanan atas dengan warna ungu, formatnya menjadi glColor3f(r, g, b). setelah sampai di pojok kanan atas Modifikasi yang lain yaitu menambah maka akan berbalik arah menuju variabel count untuk menghitung pojok kiri bawah lagi dengan warna banyaknya gerak. Hal ini perlu hijau, begitu seterusnya bolak-balik. ditambahkan karena pengaturan Akan tetapi jika kursor menunjuk gerak melalui variabel count ini. taskbar dan tombol mouse ditekan Contoh ini merupakan dasar maka gerak obyek akan berhenti dan

pembuatan game yang harus jika tombol dilepas lagi maka obyek

dipelajari untuk bisa dikembangkan tersebut gergerak lagi.

dikemudian hari. Bagian yang penting Selain argumen-argumen dicermati adalah trik pengaturan glTranslatef() yang dimodifikasi, geraknya, bagian ini merupakan hal argumen glColor3f() juga dibuat tersulit karena harus menemukan variabel sehingga bisa dimainkan algoritma yang tepat dan efisien. warnanya menjadi dinamis tidak

2008 | Direktorat Pembinaan SMK

Bahasa Pemrograman Grafik