Animasi Grafik OPERASI STRING

2008 | Direktorat Pembinaan SMK 383 wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = ; wc.cbWndExtra = ; 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, , , 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, , , PM_REMOVE { handle or dispatch messages if msg.message == WM_QUIT { bQuit = TRUE; } else { TranslateMessage msg; DispatchMessage msg; } } else { OpenGL animation code goes here 384 Direktorat Pembinaan SMK | 2008 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 ; case WM_CLOSE: PostQuitMessage ; 2008 | Direktorat Pembinaan SMK 385 return ; case WM_DESTROY: return ; case WM_KEYDOWN: switch wParam { case VK_ESCAPE: PostQuitMessage ; return ; } return ; 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; 386 Direktorat Pembinaan SMK | 2008 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 menganimasikan kotak dengan warna-warni yang menarik dan berputar berlawanan arah jarum jam. Gambar kotak yang terjadi seperti berikut: Gambar 11.4. Grafik berwarna warni Jika diperhatikan atau dipelajari pasti akan Menarik bukan? Warna- warna tersebut dimunculkan dengan mengkombinasikan argumen- argumen pada perintah glColor3f, cermati dalam listing program. Dalam program yang sesungguhnya kotak 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 maka kotak akan berputar dengan sumbu garis horizontal mendatar ke arah tertentu. Untuk memutar ke arah yang berlawanan dari 2008 | Direktorat Pembinaan SMK 387 contoh, argumen diisi angka -1 - 1.0  Argumen ketiga juga mirip dengan argumen kedua namun berputarnya terhadap sumbu vertical tegak lurus  Argumen keempat untuk memutar kotak flat dengan sumbu titik nol diagram cartesius. Jika diisi angka 1 1.0 maka akan berputar berlawanan arah putaran jarum jam counter clockwise, sedangkan untuk berputar searah dengan arah putaran jarum jam clockwise diisi angka -1 -1.0. Hal yang menarik jika argumen ini diisi angka 0 0.0 maka kotak akan zoom in dan zoom out bergantian.  Kombinasi dari argumen-argumen yang ada akan membuat variasi pergerakan yang sangat menarik Untuk mengatur laju perputaran animasi yang terjadi bisa dengan memodifikasi theta, atau dengan perintah sleepargumen. Laju kecepatan putar tergantung pada nilai argumen pada sleep, makin besar angkanya makin lambat bukan makin cepat. Lebih lanjut dengan grafik, jika akan membuat segi enam maka perubahan yang terjadi seperti berikut: 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 ; 388 Direktorat Pembinaan SMK | 2008 Tentu saja vertex berubah bertambah banyak, banyaknya vertex sesuai dengan jumlah sudut yang dibentuk. Jangan lupa argumen pada glBegin diisi dengan GL_POLYGON sehingga bisa menciptakan segi banyak seperti yang dikehendaki. Selain glRotatef pengaturan animasi dapat juga dengan glTranslatef. Dengan perintah ini kita dapat menggerakkan obyek kekiri, kekanan, ke atas, maupun ke bawah. Contoh program sebagai berikut: Program 11.6 include windows.h include glgl.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 = ; 2008 | Direktorat Pembinaan SMK 389 wc.cbWndExtra = ; 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, , , 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, , , 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; 390 Direktorat Pembinaan SMK | 2008 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 { 2008 | Direktorat Pembinaan SMK 391 case WM_CREATE: return ; case WM_CLOSE: PostQuitMessage ; return ; case WM_DESTROY: return ; case WM_KEYDOWN: switch wParam { case VK_ESCAPE: PostQuitMessage ; return ; } return ; 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 ; 392 Direktorat Pembinaan SMK | 2008 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 akan menggerakkan sebuah kotak berjalan secara diagonal dari pojok kiri bawah ke kanan atas secara terus menerus. Akan tetapi jika ada penekanan mouse di taskbar maka kotak berhenti, jika penekanan dilepas kotak jalan lagi. Untuk selesai bisa menggunakan tombol ESCape.

11.5. Dasar-dasar Game

Untuk memahami pembuatan game contoh program di atas bisa dimodifikasi bagian glTranslatef. Argumen dalam glTranslatef dibuat variabel theta untuk argumen pertama, alpha untuk argumen kedua. Theta untuk mengatur gerak horisontal dan alpha untuk mengatur gerak vertikal. Dengan mengubah- ubah nilai variabel tersebut kita bisa menggerakkan obyek tersebut secara bebas sesuai dengan kehendak. Pada saat obyek bergerak bisa juga diatur perubahan warna atau dikombinasi sehingga menjadi warna- warni. Untuk lebih jelasnya ikuti program berikut: Program 11.7 include windows.h include glgl.h Function Declarations LRESULT CALLBACK WndProc HWND hWnd, UINT message, 2008 | Direktorat Pembinaan SMK 393 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 = ; float r, g, b; register window class wc.style = CS_OWNDC; wc.lpfnWndProc = WndProc; wc.cbClsExtra = ; wc.cbWndExtra = ; 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, , , 512 , 512 , NULL, NULL, hInstance, NULL;