我正在使用SetTimer在我的游戏中放置一个计时器,计时器将每1000毫秒触发一次,我想改变计时器的时间间隔,所以我再次使用相同的timerId调用SetTimer(根据到MSDN,这将用新的超时替换旧计时器),但似乎不起作用,计时器没有被解雇。
这是我的代码,这是一个典型的游戏循环。
INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR szCmdLine, int iCmdShow)
{
WNDCLASSEX winClass ;
winClass.lpszClassName = L"RotationBySetTimer";
winClass.cbSize = sizeof(WNDCLASSEX);
winClass.style = CS_HREDRAW | CS_VREDRAW;
winClass.lpfnWndProc = MsgProc;
winClass.hInstance = hInstance;
winClass.hIcon = NULL ;
winClass.hIconSm = NULL ;
winClass.hCursor = LoadCursor(NULL, IDC_ARROW) ;
winClass.hbrBackground = NULL ;
winClass.lpszMenuName = NULL ;
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
RegisterClassEx (&winClass) ;
HWND hWnd = CreateWindowEx(NULL,
winClass.lpszClassName, // window class name
L"RotationBySetTimer", // window caption
WS_OVERLAPPEDWINDOW, // window style
32, // initial x position
32, // initial y position
600, // initial window width
600, // initial window height
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
**SetTimer(hWnd, 1, 1000, NULL);**
// Initialize Direct3D
if( SUCCEEDED(InitD3D(hWnd)))
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg ;
ZeroMemory( &msg, sizeof(msg) );
PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
// Get last time
static DWORD lastTime = timeGetTime();
while (msg.message != WM_QUIT)
{
if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0)
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
else // Render the game if there is no message to process
{
// Get current time
DWORD currTime = timeGetTime();
// Calculate time elapsed
float timeDelta = (currTime - lastTime) * 0.001f;
// Render
Render(hWnd, timeDelta) ;
// Update last time to current
lastTime = currTime;
}
}
}
UnregisterClass(winClass.lpszClassName, hInstance) ;
return 0;
}
我在Render函数中再次调用SetTimer来更改时间间隔。
void Render(HWND hWnd, float timeDelta)
{
**SetTimer(hWnd, 1, 2000, NULL);**
if (!g_bActive)
{
Sleep(50) ;
}
SetupMatrix() ;
// Clear the back-buffer to a RED color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Draw teapot
g_pTeapotMesh->DrawSubset(0) ;
// End the scene
g_pd3dDevice->EndScene();
}
// Present the back-buffer contents to the display
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
在我在Render函数中再次调用SetTimer之前,代码运行良好,但在添加此行后停止工作,为什么?
答案 0 :(得分:3)
你编码它的方式,你一遍又一遍地高速调用SetTimer()。不断重置计时器,从而永远不会有足够的时间来传递WM_TIMER消息。
显然,您需要找到更好的触发器来更新计时器。当间隔值实际需要改变时,可能只调用SetTimer。目前尚不清楚如何从发布的代码中做到最好,因为它没有明显的触发条件。