int main() { SetupAll(); SetupBalls(); DoTimers(); LoadBitmaps(); DoBlock(); while (!key[KEY_ESC] && GoGame == 1) { CheckDead(); CheckBlock(); MoveBall(); if (BallsToDrop > 0) DropBalls(); if (Lives <= 0) GoGame = 0; DrawBack(); CheckExplode(); DrawBalls(); MoveMouse(); MoveStoneBlock(); WaitTimer(); flip(); } EndOfGame(); allegro_exit(); //Clean up allegro return 0; }
// // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: // 程序启动后 SetTimer(hWnd,1,timeStep,NULL); // 开始设置一个ID为1的定时器,每timeStep毫秒触发一个定时器消息 break; case WM_TIMER: // 定时器响应消息 if (wParam == 1) // 如果是感兴趣的定时器(ID为1),则进行游戏更新 { UpdateBalls(nBalls, radius, ballsX, ballsY, ballsVX, ballsVY, timeStep/10); InvalidateRect(hWnd, NULL, TRUE); // 让窗口变为无效,从而触发重绘消息 } break; case WM_SIZE: // 获取窗口的尺寸 wndWidth = LOWORD(lParam); wndHeight = HIWORD(lParam); break; case WM_KEYDOWN: if (wParam == ' ') // 按下空格 { GenerateBall(&nBalls); // 生成一个小球 InvalidateRect(hWnd, NULL, TRUE); // 让窗口变为无效,从而触发重绘消息 } break; case WM_ERASEBKGND: // 截获擦除背景消息,不擦除背景,避免闪烁 break; case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... // 以下的步骤是为了避免产生屏幕闪烁,将画面首先绘制到内存中,然后一次性拷贝到屏幕上 // 创建内存HDC HDC memHDC = CreateCompatibleDC(hdc); //获取客户区大小 RECT rectClient; GetClientRect(hWnd, &rectClient); //创建位图 HBITMAP bmpBuff = CreateCompatibleBitmap(hdc,wndWidth,wndHeight); HBITMAP pOldBMP = (HBITMAP)SelectObject(memHDC, bmpBuff); PatBlt(memHDC,0,0,wndWidth,wndHeight,WHITENESS); // 设置背景为白色 // 进行真正的绘制 DrawBalls(memHDC, nBalls, radius, ballsX, ballsY, ballsC); //拷贝内存HDC内容到实际HDC BOOL tt = BitBlt(hdc, rectClient.left, rectClient.top, wndWidth, wndHeight, memHDC, rectClient.left, rectClient.top, SRCCOPY); //内存回收 SelectObject(memHDC, pOldBMP); DeleteObject(bmpBuff); DeleteDC(memHDC); EndPaint(hWnd, &ps); break; } case WM_DESTROY: KillTimer(hWnd,1); // 程序退出时,将定时器删除 PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }