OpenGL Animation running too fast

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!
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.
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)
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.
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
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/
Thanks and next time I will use the code tags.
Last edited on
Topic archived. No new replies allowed.