home *** CD-ROM | disk | FTP | other *** search
/ Media Share 13 / mediashare_13.zip / mediashare_13 / ZIPPED / PROGRAM / WTJ9403.ZIP / BARNHART / GM.CPP < prev    next >
C/C++ Source or Header  |  1993-11-21  |  5KB  |  208 lines

  1.  
  2. // gm.cpp - Main program for C++ graphics animation example
  3.  
  4. // Andy Barnhart
  5. // This program is provided as a sample to accompany an article on graphics
  6. //    animation using C++
  7. // This seems to work for me and I hope it works for you. No other warranty
  8. //    is expressed or implied.
  9.  
  10. #include <so_all.hpp>
  11.  
  12. #define WM_STARTGAME WM_USER+1
  13.  
  14. long FAR PASCAL _export WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam );
  15.  
  16. static int keystate = 0;
  17. extern int WinSX, WinSY;
  18. static HDC hDC;          
  19. static ScreenObj *so;                           
  20.                                      
  21. class Main
  22. {
  23. public:
  24.     static HANDLE hInstance;
  25.     static HANDLE hPrevInstance;
  26.     static int nCmdShow;
  27.     static int MessageLoop( void );
  28. };
  29.  
  30.  
  31. Player *player = NULL;
  32.  
  33.  
  34. HANDLE Main::hInstance = 0;
  35. HANDLE Main::hPrevInstance = 0;
  36. int Main::nCmdShow = 0;
  37.  
  38. int Main::MessageLoop( void )
  39. {
  40.     MSG msg;
  41.  
  42.     while( GetMessage( &msg, NULL, 0, 0 ) )
  43.         {
  44.         TranslateMessage( &msg );
  45.         DispatchMessage( &msg );
  46.         }
  47.     return msg.wParam;
  48. }
  49.  
  50. long FAR PASCAL _export WndProc( HWND hWnd, UINT iMessage, WPARAM wParam,
  51.                                  LPARAM lParam )
  52. {
  53. switch (iMessage)
  54.     {
  55.     case WM_CREATE:                                     
  56.         PostMessage( hWnd, WM_STARTGAME, 0, 0);
  57.         SetTimer(hWnd, 100, 100, NULL);
  58.         hDC = GetDC( hWnd);
  59.         InitScreen( hWnd, hDC, Main::hInstance);
  60.         so = new ScreenBack(GMX, GMY);
  61.         break;
  62.  
  63.     case WM_STARTGAME:
  64.         InitScene( 1);
  65.         break;
  66.     case WM_SIZE:
  67.         SizeScreen( LOWORD( lParam), HIWORD( lParam));
  68.         return DefWindowProc( hWnd, iMessage, wParam, lParam );
  69.     case WM_DESTROY:
  70.             DeleteScene();
  71.             TermScreen();
  72.             ReleaseDC( hWnd, hDC);
  73.             PostQuitMessage( 0 );
  74.             break;
  75.     case WM_ERASEBKGND:
  76.         return( 0L);
  77.     case WM_PAINT:
  78.         {
  79.         PAINTSTRUCT ps;
  80.         ScreenObj *nso;
  81.  
  82.         BeginPaint( hWnd, &ps);
  83.         ps.rcPaint.top += WinSY;
  84.         ps.rcPaint.bottom += WinSY;
  85.         ps.rcPaint.left += WinSX;
  86.         ps.rcPaint.right += WinSX;
  87.  
  88.         for( nso = ScreenObj::Background; nso != NULL; nso = nso->Next())
  89.             nso->Paint( &ps.rcPaint, hDC);
  90.         EndPaint( hWnd, &ps);
  91.         break;
  92.         }
  93.     case WM_KEYDOWN:
  94.         switch( wParam)
  95.             {
  96.             case VK_RIGHT:
  97.                 keystate |= KEY_RIGHT;
  98.                 keystate &= ~KEY_LEFT;
  99.                 break;
  100.             case VK_LEFT:
  101.                 keystate |= KEY_LEFT;
  102.                 keystate &= ~KEY_RIGHT;
  103.                 break;
  104.             case VK_UP:
  105.                 keystate |= KEY_UP;
  106.                 keystate &= ~KEY_DOWN;
  107.                 break;
  108.             case VK_DOWN:
  109.                 keystate |= KEY_DOWN;
  110.                 keystate &=~KEY_UP;
  111.                 break;
  112.             case VK_SPACE:
  113.                 player->Fire();
  114.                 break;
  115.             default:
  116.                 return DefWindowProc( hWnd, iMessage, wParam, lParam );
  117.             }
  118.         break;
  119.     case WM_KEYUP:
  120.         switch( wParam)
  121.             {
  122.             case VK_RIGHT:
  123.                 keystate &= ~KEY_RIGHT;
  124.                 if( GetKeyState(VK_LEFT) & 0x8000) keystate |= KEY_LEFT;
  125.                 break;
  126.             case VK_LEFT:
  127.                 keystate &= ~KEY_LEFT;
  128.                 if( GetKeyState(VK_RIGHT) & 0x8000) keystate |= KEY_RIGHT;
  129.                 break;
  130.             case VK_UP:
  131.                 keystate &= ~KEY_UP;
  132.                 if( GetKeyState(VK_DOWN) & 0x8000) keystate |= KEY_DOWN;
  133.                 break;
  134.             case VK_DOWN:
  135.                 keystate &= ~KEY_DOWN;
  136.                 if( GetKeyState(VK_UP) & 0x8000) keystate |= KEY_UP;
  137.                 break;
  138.             default:
  139.                 return DefWindowProc( hWnd, iMessage, wParam, lParam );
  140.             }
  141.         player->Update( keystate);
  142.         break;
  143.     case WM_TIMER:
  144.         {
  145.         ScreenObj *nso;
  146.  
  147.         for( nso = ScreenObj::Background; nso != NULL; nso = nso->Next())
  148.             if( nso == player)
  149.                 player->Update( keystate);
  150.             else
  151.                 nso->Update();
  152.         }
  153.         break;
  154.     default:
  155.         return DefWindowProc( hWnd, iMessage, wParam, lParam );
  156.         }
  157. return 0;
  158. }
  159.  
  160.  
  161. int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine,
  162.                                         int nCmdShow )
  163. {    
  164.     HWND hWnd;
  165.     Main::hInstance = hInstance;
  166.     Main::hPrevInstance = hPrevInstance;
  167.     Main::nCmdShow = nCmdShow;
  168.     
  169.     if ( ! Main::hPrevInstance ) 
  170.         {
  171.         WNDCLASS wndclass;   // Structure used to register Windows class.
  172.  
  173.         wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_SAVEBITS;
  174.         wndclass.lpfnWndProc   = ::WndProc;
  175.         wndclass.cbClsExtra    = 0;
  176.         wndclass.cbWndExtra    = 0;
  177.         wndclass.hInstance     = Main::hInstance;
  178.         wndclass.hIcon         = LoadIcon( Main::hInstance, "gameicon" );
  179.         wndclass.hCursor       = LoadCursor( NULL, IDC_ARROW );
  180.         wndclass.hbrBackground = GetStockObject( WHITE_BRUSH );
  181.         wndclass.lpszMenuName  = NULL;
  182.         wndclass.lpszClassName = "GAME_WINx";
  183.  
  184.         if ( ! RegisterClass( &wndclass ) )
  185.             exit( FALSE );
  186.         }
  187.     hWnd = CreateWindow( "GAME_WINx","Romero, son of...",
  188.             WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
  189.             CW_USEDEFAULT,
  190.             0,
  191.             CW_USEDEFAULT,
  192.             0,
  193.             NULL,
  194.             NULL,
  195.             Main::hInstance,
  196.             NULL );
  197.     if ( ! hWnd )
  198.         exit( FALSE );
  199.  
  200.     ShowWindow( hWnd, SW_SHOWMAXIMIZED);
  201.     UpdateWindow( hWnd );
  202.  
  203.     return Main::MessageLoop();
  204. }
  205.  
  206.  
  207.  
  208.