FOXBEAR.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:26k
源码类别:
Windows编程
开发平台:
Visual C++
- /*==========================================================================
- *
- * Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
- * Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved.
- *
- * File: winfox.c
- * Content: Windows fox sample game
- *
- ***************************************************************************/
- #include "foxbear.h"
- #include "rcids.h" // for FOX_ICON
- LPDIRECTDRAWSURFACE lpFrontBuffer;
- LPDIRECTDRAWSURFACE lpBackBuffer;
- LPDIRECTDRAWCLIPPER lpClipper;
- LPDIRECTDRAWSURFACE lpStretchBuffer;
- LPDIRECTDRAWSURFACE lpFrameRate;
- LPDIRECTDRAWSURFACE lpInfo;
- LPDIRECTDRAWPALETTE lpPalette;
- LPDIRECTDRAW lpDD;
- LPDIRECTDRAW2 lpDD2;
- SHORT lastInput = 0;
- HWND hWndMain;
- RECT rcWindow;
- BOOL bShowFrameCount=TRUE;
- BOOL bIsActive;
- BOOL bPaused;
- BOOL bStretch;
- BOOL bFullscreen=TRUE;
- BOOL bStress=FALSE; // just keep running if true
- BOOL bHelp=FALSE; // help requested
- RECT GameRect; // game rect
- SIZE GameSize; // game is this size
- SIZE GameMode; // display mode size
- UINT GameBPP; // the bpp we want
- DWORD dwColorKey; // our color key
- DWORD AveFrameRate;
- DWORD AveFrameRateCount;
- BOOL bWantSound = TRUE;
- extern int DevIndex;
- extern int MaxDevIndex;
- #define OUR_APP_NAME "Win Fox Application"
- #define ODS OutputDebugString
- BOOL InitGame(void);
- void ExitGame(void);
- void initNumSurface(void);
- #ifndef DEBUG
- void __cdecl Msg( LPSTR fmt, ... ) { }
- #endif
- /*
- * PauseGame()
- */
- void PauseGame()
- {
- Msg("**** PAUSE");
- bPaused = TRUE;
- InvalidateRect(hWndMain, NULL, TRUE);
- }
- /*
- * UnPauseGame()
- */
- void UnPauseGame()
- {
- if (GetForegroundWindow() == hWndMain)
- {
- Msg("**** UNPAUSE");
- bPaused = FALSE;
- }
- }
- /*
- * RestoreGame()
- */
- BOOL RestoreGame()
- {
- if (lpFrontBuffer == NULL || IDirectDrawSurface_Restore(lpFrontBuffer) != DD_OK)
- {
- Msg("***** cant restore FrontBuffer");
- return FALSE;
- }
- if (!bFullscreen)
- {
- if (lpBackBuffer == NULL || IDirectDrawSurface_Restore(lpBackBuffer) != DD_OK)
- {
- Msg("***** cant restore BackBuffer");
- return FALSE;
- }
- }
- if (lpStretchBuffer && IDirectDrawSurface_Restore(lpStretchBuffer) != DD_OK)
- {
- Msg("***** cant restore StretchBuffer");
- return FALSE;
- }
- if (lpFrameRate == NULL || lpInfo == NULL ||
- IDirectDrawSurface_Restore(lpFrameRate) != DD_OK ||
- IDirectDrawSurface_Restore(lpInfo) != DD_OK)
- {
- Msg("***** cant restore frame rate stuff");
- return FALSE;
- }
- initNumSurface();
- if (!gfxRestoreAll())
- {
- Msg("***** cant restore art");
- return FALSE;
- }
- return TRUE;
- }
- /*
- * ProcessFox
- */
- BOOL ProcessFox(SHORT sInput)
- {
- if ((lpFrontBuffer && IDirectDrawSurface_IsLost(lpFrontBuffer) == DDERR_SURFACELOST) ||
- (lpBackBuffer && IDirectDrawSurface_IsLost(lpBackBuffer) == DDERR_SURFACELOST))
- {
- if (!RestoreGame())
- {
- PauseGame();
- return FALSE;
- }
- }
- ProcessInput(sInput);
- NewGameFrame();
- return TRUE;
- } /* ProcessFox */
- static HFONT hFont;
- DWORD dwFrameCount;
- DWORD dwFrameTime;
- DWORD dwFrames;
- DWORD dwFramesLast;
- SIZE sizeFPS;
- SIZE sizeINFO;
- int FrameRateX;
- char szFPS[] = "FPS %02d";
- char szINFO[] = "%dx%dx%d%s F6=mode F8=x2 ALT+ENTER=Window";
- char szINFOW[] = "%dx%dx%d%s F6=mode F8=x2 ALT+ENTER=Fullscreen";
- char szFrameRate[128];
- char szInfo[128];
- COLORREF InfoColor = RGB(0,152,245);
- COLORREF FrameRateColor = RGB(255,255,0);
- COLORREF BackColor = RGB(255,255,255);
- /*
- * initNumSurface
- */
- void initNumSurface( void )
- {
- HDC hdc;
- RECT rc;
- int len;
- dwFramesLast = 0;
- len = wsprintf(szFrameRate, szFPS, 0, 0);
- if( lpFrameRate && IDirectDrawSurface_GetDC(lpFrameRate, &hdc ) == DD_OK )
- {
- SelectObject(hdc, hFont);
- SetTextColor(hdc, FrameRateColor);
- SetBkColor(hdc, BackColor);
- SetBkMode(hdc, OPAQUE);
- SetRect(&rc, 0, 0, 10000, 10000);
- ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, szFrameRate, len, NULL);
- GetTextExtentPoint(hdc, szFrameRate, 4, &sizeFPS);
- FrameRateX = sizeFPS.cx;
- GetTextExtentPoint(hdc, szFrameRate, len, &sizeFPS);
- IDirectDrawSurface_ReleaseDC(lpFrameRate, hdc);
- }
- if (bFullscreen)
- len = wsprintf(szInfo, szINFO,
- GameSize.cx, GameSize.cy, GameBPP,bStretch ? " x2" : "");
- else
- len = wsprintf(szInfo, szINFOW,
- GameSize.cx, GameSize.cy, GameBPP,bStretch ? " x2" : "");
- if( lpInfo && IDirectDrawSurface_GetDC(lpInfo, &hdc ) == DD_OK )
- {
- SelectObject(hdc, hFont);
- SetTextColor(hdc, InfoColor);
- SetBkColor(hdc, BackColor);
- SetBkMode(hdc, OPAQUE);
- SetRect(&rc, 0, 0, 10000, 10000);
- ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &rc, szInfo, len, NULL);
- GetTextExtentPoint(hdc, szInfo, len, &sizeINFO);
- IDirectDrawSurface_ReleaseDC(lpInfo, hdc);
- }
- } /* initNumSurface */
- /*
- * makeFontStuff
- */
- static BOOL makeFontStuff( void )
- {
- DDCOLORKEY ddck;
- HDC hdc;
- if (hFont != NULL)
- {
- DeleteObject(hFont);
- }
- hFont = CreateFont(
- GameSize.cx <= 512 ? 12 : 24,
- 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
- ANSI_CHARSET,
- OUT_DEFAULT_PRECIS,
- CLIP_DEFAULT_PRECIS,
- NONANTIALIASED_QUALITY, // DEFAULT_QUALITY,
- VARIABLE_PITCH,
- "Arial" );
- /*
- * make a sample string so we can measure it with the current font.
- */
- if( hFont != NULL)
- {
- initNumSurface();
- hdc = GetDC(NULL);
- SelectObject(hdc, hFont);
- GetTextExtentPoint(hdc, szFrameRate, lstrlen(szFrameRate), &sizeFPS);
- GetTextExtentPoint(hdc, szInfo, lstrlen(szInfo), &sizeINFO);
- ReleaseDC(NULL, hdc);
- }
- /*
- * Create a surface to copy our bits to.
- */
- lpFrameRate = DDCreateSurface(sizeFPS.cx, sizeFPS.cy, FALSE,TRUE);
- lpInfo = DDCreateSurface(sizeINFO.cx, sizeINFO.cy, FALSE,TRUE);
- if( lpFrameRate == NULL || lpInfo == NULL )
- {
- return FALSE;
- }
- /*
- * now set the color key, we use a totaly different color than
- * the rest of the app, just to be different so drivers dont always
- * get white or black as the color key...
- *
- * dont forget when running on a dest colorkey device, we need
- * to use the same color key as the rest of the app.
- */
- if( bTransDest )
- BackColor = RGB(255,255,255);
- else
- BackColor = RGB(128,64,255);
- ddck.dwColorSpaceLowValue = DDColorMatch(lpInfo, BackColor);
- ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue;
- IDirectDrawSurface_SetColorKey( lpInfo, DDCKEY_SRCBLT, &ddck);
- IDirectDrawSurface_SetColorKey( lpFrameRate, DDCKEY_SRCBLT, &ddck);
- /*
- * now draw the text for real
- */
- initNumSurface();
- return TRUE;
- }
- /*
- * DisplayFrameRate
- */
- void DisplayFrameRate( void )
- {
- DWORD time2;
- char buff[256];
- HDC hdc;
- HRESULT ddrval;
- RECT rc;
- DWORD dw;
- if( !bShowFrameCount )
- {
- return;
- }
- dwFrameCount++;
- time2 = timeGetTime() - dwFrameTime;
- if( time2 > 1000 )
- {
- dwFrames = (dwFrameCount*1000)/time2;
- dwFrameTime = timeGetTime();
- dwFrameCount = 0;
- AveFrameRate += dwFrames;
- AveFrameRateCount++;
- }
- if( dwFrames == 0 )
- {
- return;
- }
- if( dwFrames != dwFramesLast )
- {
- dwFramesLast = dwFrames;
- if( IDirectDrawSurface_GetDC(lpFrameRate, &hdc ) == DD_OK )
- {
- buff[0] = (char)((dwFrames / 10) + '0');
- buff[1] = (char)((dwFrames % 10) + '0');
- if(hFont != NULL)
- {
- SelectObject(hdc, hFont);
- SetTextColor(hdc, FrameRateColor);
- SetBkColor(hdc, BackColor);
- TextOut(hdc, FrameRateX, 0, buff, 2);
- }
- IDirectDrawSurface_ReleaseDC(lpFrameRate, hdc);
- }
- }
- /*
- * put the text on the back buffer.
- */
- if (bTransDest)
- dw = DDBLTFAST_DESTCOLORKEY | DDBLTFAST_WAIT;
- else
- dw = DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT;
- SetRect(&rc, 0, 0, sizeFPS.cx, sizeFPS.cy);
- ddrval = IDirectDrawSurface_BltFast(lpBackBuffer,
- GameRect.left + (GameSize.cx - sizeFPS.cx)/2, GameRect.top + 20,
- lpFrameRate, &rc, dw);
- SetRect(&rc, 0, 0, sizeINFO.cx, sizeINFO.cy);
- ddrval = IDirectDrawSurface_BltFast(lpBackBuffer,
- GameRect.left + 10, GameRect.bottom - sizeINFO.cy - 10,
- lpInfo, &rc, dw);
- } /* DisplayFrameRate */
- /*
- * MainWndProc
- *
- * Callback for all Windows messages
- */
- long FAR PASCAL MainWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
- {
- PAINTSTRUCT ps;
- HDC hdc;
- switch( message )
- {
- case WM_SIZE:
- case WM_MOVE:
- if (IsIconic(hWnd))
- {
- Msg("FoxBear is minimized, pausing");
- PauseGame();
- }
- if (bFullscreen)
- {
- SetRect(&rcWindow, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
- }
- else
- {
- GetClientRect(hWnd, &rcWindow);
- ClientToScreen(hWnd, (LPPOINT)&rcWindow);
- ClientToScreen(hWnd, (LPPOINT)&rcWindow+1);
- }
- Msg("WINDOW RECT: [%d,%d,%d,%d]", rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom);
- break;
- case WM_ACTIVATEAPP:
- bIsActive = (BOOL)wParam && GetForegroundWindow() == hWnd;
- if (bIsActive)
- Msg("FoxBear is active");
- else
- Msg("FoxBear is not active");
- //
- // while we were not-active something bad happened that caused us
- // to pause, like a surface restore failing or we got a palette
- // changed, now that we are active try to fix things
- //
- if (bPaused && bIsActive)
- {
- if (RestoreGame())
- {
- UnPauseGame();
- }
- else
- {
- if (GetForegroundWindow() == hWnd)
- {
- //
- // we are unable to restore, this can happen when
- // the screen resolution or bitdepth has changed
- // we just reload all the art again and re-create
- // the front and back buffers. this is a little
- // overkill we could handle a screen res change by
- // just recreating the front and back buffers we dont
- // need to redo the art, but this is way easier.
- //
- if (InitGame())
- {
- UnPauseGame();
- }
- }
- }
- }
- break;
- case WM_QUERYNEWPALETTE:
- //
- // we are getting the palette focus, select our palette
- //
- if (!bFullscreen && lpPalette && lpFrontBuffer)
- {
- HRESULT ddrval;
- ddrval = IDirectDrawSurface_SetPalette(lpFrontBuffer,lpPalette);
- if( ddrval == DDERR_SURFACELOST )
- {
- IDirectDrawSurface_Restore( lpFrontBuffer );
- ddrval= IDirectDrawSurface_SetPalette(lpFrontBuffer,lpPalette);
- if( ddrval == DDERR_SURFACELOST )
- {
- Msg(" Failed to restore palette after second try");
- }
- }
- //
- // Restore normal title if palette is ours
- //
- if( ddrval == DD_OK )
- {
- SetWindowText( hWnd, OUR_APP_NAME );
- }
- }
- break;
- case WM_PALETTECHANGED:
- //
- // if another app changed the palette we dont have full control
- // of the palette. NOTE this only applies for FoxBear in a window
- // when we are fullscreen we get all the palette all of the time.
- //
- if ((HWND)wParam != hWnd)
- {
- if( !bFullscreen )
- {
- if( !bStress )
- {
- Msg("***** PALETTE CHANGED, PAUSING GAME");
- PauseGame();
- }
- else
- {
- Msg("Lost palette but continuing");
- SetWindowText( hWnd, OUR_APP_NAME
- " - palette changed COLORS PROBABLY WRONG" );
- }
- }
- }
- break;
- case WM_DISPLAYCHANGE:
- break;
- case WM_CREATE:
- break;
- case WM_SETCURSOR:
- if (bFullscreen && bIsActive)
- {
- SetCursor(NULL);
- return TRUE;
- }
- break;
- case WM_SYSKEYUP:
- switch( wParam )
- {
- // handle ALT+ENTER (fullscreen)
- case VK_RETURN:
- bFullscreen = !bFullscreen;
- ExitGame();
- DDDisable(TRUE); // destroy DirectDraw object
- GameMode.cx = 320;
- GameMode.cy = 200;
- InitGame();
- break;
- }
- break;
- case WM_KEYDOWN:
- switch( wParam )
- {
- case VK_NUMPAD5:
- lastInput=KEY_STOP;
- break;
- case VK_DOWN:
- case VK_NUMPAD2:
- lastInput=KEY_DOWN;
- break;
- case VK_LEFT:
- case VK_NUMPAD4:
- lastInput=KEY_LEFT;
- break;
- case VK_RIGHT:
- case VK_NUMPAD6:
- lastInput=KEY_RIGHT;
- break;
- case VK_UP:
- case VK_NUMPAD8:
- lastInput=KEY_UP;
- break;
- case VK_HOME:
- case VK_NUMPAD7:
- lastInput=KEY_JUMP;
- break;
- case VK_NUMPAD3:
- lastInput=KEY_THROW;
- break;
- case VK_F5:
- bShowFrameCount = !bShowFrameCount;
- if( bShowFrameCount )
- {
- dwFrameCount = 0;
- dwFrameTime = timeGetTime();
- }
- break;
- case VK_F6:
- {
- static i;
- //
- // find our current mode in the mode list
- //
- if(bFullscreen)
- {
- for (i=0; i<NumModes; i++)
- {
- if (ModeList[i].bpp == (int)GameBPP &&
- ModeList[i].w == GameSize.cx &&
- ModeList[i].h == GameSize.cy)
- {
- break;
- }
- }
- }else
- {
- for (i=0; i<NumModes; i++)
- {
- if (ModeList[i].w == GameSize.cx &&
- ModeList[i].h == GameSize.cy)
- {
- break;
- }
- }
- }
- //
- // now step to the next mode, wrapping to the first one.
- //
- if (++i >= NumModes)
- {
- i = 0;
- }
- Msg("ModeList %d %d",i,NumModes);
- GameMode.cx = ModeList[i].w;
- GameMode.cy = ModeList[i].h;
- GameBPP = ModeList[i].bpp;
- bStretch = FALSE;
- InitGame();
- }
- break;
- case VK_F7:
- GameBPP = GameBPP == 8 ? 16 : 8;
- InitGame();
- break;
- case VK_F8:
- if (bFullscreen)
- {
- bStretch = !bStretch;
- InitGame();
- }
- else
- {
- RECT rc;
- GetClientRect(hWnd, &rc);
- bStretch = (rc.right != GameSize.cx) ||
- (rc.bottom != GameSize.cy);
- if (bStretch = !bStretch)
- SetRect(&rc, 0, 0, GameMode.cx*2, GameMode.cy*2);
- else
- SetRect(&rc, 0, 0, GameMode.cx, GameMode.cy);
- AdjustWindowRectEx(&rc,
- GetWindowStyle(hWnd),
- GetMenu(hWnd) != NULL,
- GetWindowExStyle(hWnd));
- SetWindowPos(hWnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top,
- SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
- }
- break;
- case VK_F9:
- DevIndex ++;
- bUseEmulation = FALSE;
- if (DevIndex >= MaxDevIndex)
- DevIndex = 0;
- ExitGame();
- DDDisable(TRUE); // destroy DirectDraw object
- InitGame();
- break;
- case VK_F4:
- // treat F4 like ALT+ENTER (fullscreen)
- PostMessage(hWnd, WM_SYSKEYUP, VK_RETURN, 0);
- break;
- case VK_F3:
- bPaused = !bPaused;
- break;
- case VK_ESCAPE:
- case VK_F12:
- PostMessage(hWnd, WM_CLOSE, 0, 0);
- return 0;
- }
- break;
- case WM_PAINT:
- hdc = BeginPaint( hWnd, &ps );
- if (bPaused)
- {
- char *sz = "Game is paused, this is not a bug.";
- TextOut(ps.hdc, 0, 0, sz, lstrlen(sz));
- }
- EndPaint( hWnd, &ps );
- return 1;
- case WM_DESTROY:
- hWndMain = NULL;
- lastInput=0;
- DestroyGame(); // end of game
- DDDisable(TRUE); // destroy DirectDraw object
- PostQuitMessage( 0 );
- break;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- } /* MainWndProc */
- /*
- * initApplication
- *
- * Do that Windows initialization stuff...
- */
- static BOOL initApplication( HINSTANCE hInstance, int nCmdShow )
- {
- WNDCLASS wc;
- BOOL rc;
- wc.style = CS_DBLCLKS;
- wc.lpfnWndProc = MainWndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = hInstance;
- wc.hIcon = LoadIcon( hInstance, MAKEINTATOM(FOX_ICON));
- wc.hCursor = LoadCursor( NULL, IDC_ARROW );
- wc.hbrBackground = GetStockObject(BLACK_BRUSH);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = "WinFoxClass";
- rc = RegisterClass( &wc );
- if( !rc )
- {
- return FALSE;
- }
- hWndMain = CreateWindowEx(
- WS_EX_APPWINDOW,
- "WinFoxClass",
- OUR_APP_NAME,
- WS_VISIBLE | // so we dont have to call ShowWindow
- WS_SYSMENU | // so we get a icon in in our tray button
- WS_POPUP,
- 0,
- 0,
- GetSystemMetrics(SM_CXSCREEN),
- GetSystemMetrics(SM_CYSCREEN),
- NULL,
- NULL,
- hInstance,
- NULL );
- if( !hWndMain )
- {
- return FALSE;
- }
- UpdateWindow( hWndMain );
- SetFocus( hWndMain );
- return TRUE;
- } /* initApplication */
- /*
- * ExitGame
- *
- * Exiting current game, clean up
- */
- void ExitGame( void )
- {
- if( lpFrameRate )
- {
- IDirectDrawSurface_Release(lpFrameRate);
- lpFrameRate = NULL;
- }
- if( lpInfo )
- {
- IDirectDrawSurface_Release(lpInfo);
- lpInfo = NULL;
- }
- if( lpPalette )
- {
- IDirectDrawSurface_Release(lpPalette);
- lpPalette = NULL;
- }
- DestroyGame();
- } /* ExitGame */
- /*
- * InitGame
- *
- * Initializing current game
- */
- BOOL InitGame( void )
- {
- ExitGame();
- GameSize = GameMode;
- /*
- * initialize sound
- */
- InitSound( hWndMain );
- /*
- * init DirectDraw, set mode, ...
- * NOTE GameMode might be set to 640x480 if we cant get the asked for mode.
- */
- if( !PreInitializeGame() )
- {
- return FALSE;
- }
- if (bStretch && bFullscreen)
- {
- GameSize.cx = GameMode.cx / 2;
- GameSize.cy = GameMode.cy / 2;
- GameRect.left = GameMode.cx - GameSize.cx;
- GameRect.top = GameMode.cy - GameSize.cy;
- GameRect.right = GameMode.cx;
- GameRect.bottom = GameMode.cy;
- if (lpStretchBuffer)
- Msg("Stretching using a system-memory stretch buffer");
- else
- Msg("Stretching using a VRAM->VRAM blt");
- }
- else
- {
- GameRect.left = (GameMode.cx - GameSize.cx) / 2;
- GameRect.top = (GameMode.cy - GameSize.cy) / 2;
- GameRect.right = GameRect.left + GameSize.cx;
- GameRect.bottom = GameRect.top + GameSize.cy;
- }
- /*
- * setup our palette
- */
- if( GameBPP == 8 )
- {
- lpPalette = ReadPalFile( NULL ); // create a 332 palette
- if( lpPalette == NULL )
- {
- Msg( "Palette create failed" );
- return FALSE;
- }
- IDirectDrawSurface_SetPalette( lpFrontBuffer, lpPalette );
- }
- /*
- * load all the art and things.
- */
- if( !InitializeGame() )
- {
- return FALSE;
- }
- /*
- * init our code to draw the FPS
- */
- makeFontStuff();
- /*
- * spew some stats
- */
- {
- DDCAPS ddcaps;
- ddcaps.dwSize = sizeof( ddcaps );
- IDirectDraw_GetCaps( lpDD, &ddcaps, NULL );
- Msg( "Total=%ld, Free VRAM=%ld", ddcaps.dwVidMemTotal, ddcaps.dwVidMemFree );
- Msg( "Used = %ld", ddcaps.dwVidMemTotal- ddcaps.dwVidMemFree );
- }
- return TRUE;
- } /* InitGame */
- #define IS_NUM(c) ((c) >= '0' && (c) <= '9')
- #define IS_SPACE(c) ((c) == ' ' || (c) == 'r' || (c) == 'n' || (c) == 't' || (c) == 'x')
- int getint(char**p, int def)
- {
- int i=0;
- while (IS_SPACE(**p))
- (*p)++;
- if (!IS_NUM(**p))
- return def;
- while (IS_NUM(**p))
- i = i*10 + *(*p)++ - '0';
- while (IS_SPACE(**p))
- (*p)++;
- return i;
- }
- /*
- * WinMain
- */
- int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
- int nCmdShow )
- {
- MSG msg;
- DDInit();
- while( lpCmdLine[0] == '-' || lpCmdLine[0] == '/')
- {
- lpCmdLine++;
- switch (*lpCmdLine++)
- {
- case 'e':
- bUseEmulation = TRUE;
- break;
- case 'w':
- bFullscreen = FALSE;
- break;
- case 'f':
- bFullscreen = TRUE;
- break;
- case '1':
- CmdLineBufferCount = 1;
- break;
- case '2':
- case 'd':
- CmdLineBufferCount = 2;
- break;
- case '3':
- CmdLineBufferCount = 3;
- break;
- case 's':
- bStretch = TRUE;
- break;
- case 'S':
- bWantSound = FALSE;
- break;
- case 'x':
- bStress= TRUE;
- break;
- case '?':
- bHelp= TRUE;
- bFullscreen= FALSE; // give help in windowed mode
- break;
- }
- while( IS_SPACE(*lpCmdLine) )
- {
- lpCmdLine++;
- }
- }
- GameMode.cx = getint(&lpCmdLine, 640);
- GameMode.cy = getint(&lpCmdLine, 480);
- GameBPP = getint(&lpCmdLine, 8);
- /*
- * create window and other windows things
- */
- if( !initApplication(hInstance, nCmdShow) )
- {
- return FALSE;
- }
- /*
- * Give user help if asked for
- *
- * This is ugly for now because the whole screen is black
- * except for the popup box. This could be fixed with some
- * work to get the window size right when it was created instead
- * of delaying that work. see ddraw.c
- *
- */
- if( bHelp )
- {
- MessageBox(hWndMain,
- "F12 - Quitn"
- "NUMPAD 2 - crouchn"
- "NUMPAD 3 - applen"
- "NUMPAD 4 - rightn"
- "NUMPAD 5 - stopn"
- "NUMPAD 6 - leftn"
- "NUMPAD 7 - jumpn"
- "n"
- "Command line parametersn"
- "n"
- "-e Use emulatorn"
- "-S No Soundn"
- "-1 No backbuffern"
- "-2 One backbuffern"
- "-4 Three backbuffersn"
- "-s Use stretchn"
- "-x Demo or stress moden",
- OUR_APP_NAME, MB_OK );
- }
- /*
- * initialize for game play
- */
- if( !InitGame() )
- {
- return FALSE;
- }
- dwFrameTime = timeGetTime();
- while( 1 )
- {
- if (PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))
- {
- if (!GetMessage( &msg, NULL, 0, 0))
- {
- break;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else if (!bPaused && (bIsActive || !bFullscreen))
- {
- ProcessFox(lastInput);
- lastInput=0;
- }
- else
- {
- WaitMessage();
- }
- }
- if (AveFrameRateCount)
- {
- AveFrameRate = AveFrameRate / AveFrameRateCount;
- Msg("Average frame rate: %d", AveFrameRate);
- }
- return msg.wParam;
- } /* WinMain */
- #ifdef DEBUG
- /*
- * Msg
- */
- void __cdecl Msg( LPSTR fmt, ... )
- {
- char buff[256];
- va_list va;
- va_start(va, fmt);
- //
- // format message with header
- //
- lstrcpy( buff, "FOXBEAR:" );
- wvsprintf( &buff[lstrlen(buff)], fmt, va );
- lstrcat( buff, "rn" );
- //
- // To the debugger unless we need to be quiet
- //
- if( !bStress )
- {
- OutputDebugString( buff );
- }
- } /* Msg */
- #endif