www.pudn.com > BucklandSimpleSoccer.rar > main.cpp
#pragma warning (disable:4786) #include#include #include "constants.h" #include "misc/utils.h" #include "Time/PrecisionTimer.h" #include "SoccerPitch.h" #include "misc/Cgdi.h" #include "ParamLoader.h" #include "Resource.h" #include "misc/WindowUtils.h" #include "debug/DebugConsole.h" //--------------------------------- Globals ------------------------------ // //------------------------------------------------------------------------ char* g_szApplicationName = "Simple Soccer"; char* g_szWindowClassName = "MyWindowClass"; SoccerPitch* g_SoccerPitch; //create a timer PrecisionTimer timer(Prm.FrameRate); //used when a user clicks on a menu item to ensure the option is 'checked' //correctly void CheckAllMenuItemsAppropriately(HWND hwnd) { CheckMenuItemAppropriately(hwnd, IDM_SHOW_REGIONS, Prm.bRegions); CheckMenuItemAppropriately(hwnd, IDM_SHOW_STATES, Prm.bStates); CheckMenuItemAppropriately(hwnd, IDM_SHOW_IDS, Prm.bIDs); CheckMenuItemAppropriately(hwnd, IDM_AIDS_SUPPORTSPOTS, Prm.bSupportSpots); CheckMenuItemAppropriately(hwnd, ID_AIDS_SHOWTARGETS, Prm.bViewTargets); CheckMenuItemAppropriately(hwnd, IDM_AIDS_HIGHLITE, Prm.bHighlightIfThreatened); } //---------------------------- WindowProc --------------------------------- // // This is the callback function which handles all the windows messages //------------------------------------------------------------------------- LRESULT CALLBACK WindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { //these hold the dimensions of the client window area static int cxClient, cyClient; //used to create the back buffer static HDC hdcBackBuffer; static HBITMAP hBitmap; static HBITMAP hOldBitmap; switch (msg) { //A WM_CREATE msg is sent when your application window is first //created case WM_CREATE: { //to get get the size of the client window first we need to create //a RECT and then ask Windows to fill in our RECT structure with //the client window size. Then we assign to cxClient and cyClient //accordingly RECT rect; GetClientRect(hwnd, &rect); cxClient = rect.right; cyClient = rect.bottom; //seed random number generator srand((unsigned) time(NULL)); //---------------create a surface to render to(backbuffer) //create a memory device context hdcBackBuffer = CreateCompatibleDC(NULL); //get the DC for the front buffer HDC hdc = GetDC(hwnd); hBitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient); //select the bitmap into the memory device context hOldBitmap = (HBITMAP)SelectObject(hdcBackBuffer, hBitmap); //don't forget to release the DC ReleaseDC(hwnd, hdc); g_SoccerPitch = new SoccerPitch(cxClient, cyClient); CheckAllMenuItemsAppropriately(hwnd); } break; case WM_COMMAND: { switch(wParam) { case ID_AIDS_NOAIDS: Prm.bStates = 0; Prm.bRegions = 0; Prm.bIDs = 0; Prm.bSupportSpots = 0; Prm.bViewTargets = 0; CheckAllMenuItemsAppropriately(hwnd); break; case IDM_SHOW_REGIONS: Prm.bRegions = !Prm.bRegions; CheckAllMenuItemsAppropriately(hwnd); break; case IDM_SHOW_STATES: Prm.bStates = !Prm.bStates; CheckAllMenuItemsAppropriately(hwnd); break; case IDM_SHOW_IDS: Prm.bIDs = !Prm.bIDs; CheckAllMenuItemsAppropriately(hwnd); break; case IDM_AIDS_SUPPORTSPOTS: Prm.bSupportSpots = !Prm.bSupportSpots; CheckAllMenuItemsAppropriately(hwnd); break; case ID_AIDS_SHOWTARGETS: Prm.bViewTargets = !Prm.bViewTargets; CheckAllMenuItemsAppropriately(hwnd); break; case IDM_AIDS_HIGHLITE: Prm.bHighlightIfThreatened = !Prm.bHighlightIfThreatened; CheckAllMenuItemsAppropriately(hwnd); break; }//end switch } break; case WM_KEYUP: { switch(wParam) { case VK_ESCAPE: { SendMessage(hwnd, WM_DESTROY, NULL, NULL); } break; case 'R': { delete g_SoccerPitch; g_SoccerPitch = new SoccerPitch(cxClient, cyClient); } break; case 'P': { g_SoccerPitch->TogglePause(); } break; }//end switch }//end WM_KEYUP break; case WM_PAINT: { PAINTSTRUCT ps; BeginPaint (hwnd, &ps); gdi->StartDrawing(hdcBackBuffer); g_SoccerPitch->Render(); gdi->StopDrawing(hdcBackBuffer); //now blit backbuffer to front BitBlt(ps.hdc, 0, 0, cxClient, cyClient, hdcBackBuffer, 0, 0, SRCCOPY); EndPaint (hwnd, &ps); } break; //has the user resized the client area? case WM_SIZE: { //if so we need to update our variables so that any drawing //we do using cxClient and cyClient is scaled accordingly cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); //now to resize the backbuffer accordingly. First select //the old bitmap back into the DC SelectObject(hdcBackBuffer, hOldBitmap); //don't forget to do this or you will get resource leaks DeleteObject(hBitmap); //get the DC for the application HDC hdc = GetDC(hwnd); //create another bitmap of the same size and mode //as the application hBitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient); ReleaseDC(hwnd, hdc); //select the new bitmap into the DC SelectObject(hdcBackBuffer, hBitmap); } break; case WM_DESTROY: { //clean up our backbuffer objects SelectObject(hdcBackBuffer, hOldBitmap); DeleteDC(hdcBackBuffer); DeleteObject(hBitmap); // kill the application, this sends a WM_QUIT message PostQuitMessage (0); } break; }//end switch //this is where all the messages not specifically handled by our //winproc are sent to be processed return DefWindowProc (hwnd, msg, wParam, lParam); } //-------------------------------- WinMain ------------------------------- // // The entry point of the windows program //------------------------------------------------------------------------ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { //handle to our window HWND hWnd; //our window class structure WNDCLASSEX winclass; // first fill in the window class stucture winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hInstance; winclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = NULL; winclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); winclass.lpszClassName = g_szWindowClassName; winclass.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); //register the window class if (!RegisterClassEx(&winclass)) { MessageBox(NULL, "Registration Failed!", "Error", 0); //exit the application return 0; } //create the window and assign its ID to hwnd hWnd = CreateWindowEx (NULL, // extended style g_szWindowClassName, // window class name g_szApplicationName, // window caption WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU, GetSystemMetrics(SM_CXSCREEN)/2 - WindowWidth/2, GetSystemMetrics(SM_CYSCREEN)/2 - WindowHeight/2, WindowWidth, // initial x size WindowHeight, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters //make sure the window creation has gone OK if(!hWnd) { MessageBox(NULL, "CreateWindowEx Failed!", "Error!", 0); } //start the timer timer.Start(); MSG msg; //enter the message loop bool bDone = false; while(!bDone) { while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { if( msg.message == WM_QUIT ) { // Stop loop if it's a quit message bDone = true; } else { TranslateMessage( &msg ); DispatchMessage( &msg ); } } if (timer.ReadyForNextFrame() && msg.message != WM_QUIT) { //update game states g_SoccerPitch->Update(); //render RedrawWindow(hWnd, true); Sleep(2); } }//end while delete g_SoccerPitch; UnregisterClass( g_szWindowClassName, winclass.hInstance ); return msg.wParam; }