| DaveCas (9) | |
|
Hello! I have a OpenGL animation that runs at normal speed on one of my computers with Windows XP, when I run it on the other computer with Windows 7 it runs crazy fast. I am wondering how to make it run at the same speed on any computer. here is the code #include <windows.h> #include <gl/gl.h> 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); 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; 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); hWnd = CreateWindow ( "GLSample", "Dave's OpenGL Program", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 420, 100, 500, 500, NULL, NULL, hInstance, NULL); EnableOpenGL (hWnd, &hDC, &hRC); while (!bQuit) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { bQuit = TRUE; } else { TranslateMessage (&msg); DispatchMessage (&msg); } } else { glClearColor (0.0f, 0.0f, 0.0f, 0.0f); glClear (GL_COLOR_BUFFER_BIT); glPushMatrix (); glRotatef (theta, 1.0f, 1.0f, 1.0f); glBegin (GL_TRIANGLES); glColor3f (0.0f, 1.0f, 1.0f); glVertex2f (0.2f, 1.0f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (0.87f, -0.5f); glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f); glEnd (); glPopMatrix (); SwapBuffers (hDC); theta += 1.0f; Sleep (1); } } DisableOpenGL (hWnd, hDC, hRC); DestroyWindow (hWnd); return msg.wParam; } LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { 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); } } 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); *hRC = wglCreateContext( *hDC ); wglMakeCurrent( *hDC, *hRC ); } void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC) { wglMakeCurrent (NULL, NULL); wglDeleteContext (hRC); ReleaseDC (hWnd, hDC); } Thanks in Advance! | |
|
|
|
| Hucaru (64) | |
Isn't glBegin() and glEnd() deprecated? Unless you are writing for openGL 2 or lower. From what I have read (and understand) what you need to do is calculate the time elapsed from the previous frame and then base things like animation and movement off of that.
| |
|
|
|
| DaveCas (9) | |
|
The code was from a template from Dev-C++ (which is what I am using to write and compile). I get the concept of what I have to do, but I am new to c++ (which is why I put this in the beginners forum) and I really am not to sure how to do that. If you could show me an example that would be great! (sorry I'm a newbie) | |
|
|
|
| Hucaru (64) | |
| Its ok, I am new too. Found this - http://stackoverflow.com/questions/2303440/limit-speed-of-gameplay-on-different-computers. It talks through the principle. | |
|
|
|
| DaveCas (9) | |
|
Ok I'll have to look at it further but it looks like it should work . It's just hard to get it in the code without any problems. But hey no one said it was easy :) Thanks | |
|
|
|
| Hucaru (64) | |
|
Also two suggestions. When submitting code on the forums could you please use the code tags '['code'][/'code']'. Also if you are using DevC++ please read this first before you carry on: http://cplusplus.com/forum/articles/36896/ | |
|
|
|
| DaveCas (9) | |
Thanks and next time I will use the code tags.
| |
|
Last edited on
|
|