联系客服:400-805-1963

cocos2d-x从零入门03---依然是贺岁篇
更新:HHH   时间:2023-1-7


  依然是贺岁篇!!亲,不要不耐烦哈!在上节中和大家糊里糊涂地分析下了HelloWorld运行的逻辑,细心的朋友肯定会发现,我提到过显示窗口、消息循环,发现问题所在了吧,就是为啥没有注册窗口类,创建窗口和窗口处理函数??

 我想你肯定再说我一点也不专业,实不相瞒,确实是很不专业,来来,继续分析,我们回到  CCApplication::run():

  1. int CCApplication::run() 
  2. { 
  3.     PVRFrameEnableControlWindow(false); 
  4.  
  5.     // Main message loop: 
  6.     MSG msg; 
  7.     LARGE_INTEGER nFreq; 
  8.     LARGE_INTEGER nLast; 
  9.     LARGE_INTEGER nNow; 
  10.  
  11.     QueryPerformanceFrequency(&nFreq); 
  12.     QueryPerformanceCounter(&nLast); 
  13.  
  14.     // Initialize instance and cocos2d. 
  15.     //看到了吧,这里初始化实例,再找到其定义 
  16.     if (!applicationDidFinishLaunching()) 
  17.     { 
  18.         return 0; 
  19.     } 
  20.      
  21.     //关键在这里啊,亲,进来看看呗 
  22.     CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView(); 
  23.     pMainWnd->centerWindow(); 
  24.  
  25.     //显示窗口 
  26.     ShowWindow(pMainWnd->getHWnd(), SW_SHOW); 
  27.  
  28.     //windows程序的消息循环,哈哈,找到你了 
  29.     while (1) 
  30.     { 
  31.         if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
  32.         { 
  33.             // Get current time tick. 
  34.             QueryPerformanceCounter(&nNow); 
  35.  
  36.             // If it's the time to draw next frame, draw it, else sleep a while. 
  37.             if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart) 
  38.             { 
  39.                 nLast.QuadPart = nNow.QuadPart; 
  40.                 CCDirector::sharedDirector()->mainLoop(); 
  41.             } 
  42.             else 
  43.             { 
  44.                 Sleep(0); 
  45.             } 
  46.             continue; 
  47.         } 
  48.  
  49.         if (WM_QUIT == msg.message) 
  50.         { 
  51.             // Quit message loop. 
  52.             break; 
  53.         } 
  54.  
  55.         // Deal with windows message. 
  56.         if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg)) 
  57.         { 
  58.             TranslateMessage(&msg); 
  59.             DispatchMessage(&msg); 
  60.         } 
  61.     } 
  62.  
  63.     return (int) msg.wParam; 
  64. } 
     

请看22行代码,老规矩,进去看看,不进虎穴,焉得虎子?

跳转到sharedOpenGLView的定义:

  1. CCEGLView* CCEGLView::sharedOpenGLView() 
  2. { 
  3.     //如果空就new一个 
  4.     static CCEGLView* s_pEglView = NULL; 
  5.     if (s_pEglView == NULL) 
  6.     { 
  7.         //新建 
  8.         s_pEglView = new CCEGLView(); 
  9.     } 
  10.     return s_pEglView; 
  11. } 

仔细看看此时的文件,你会发现你想要的都在这里,我截取部分吧:

  1. //注册窗口类并创建窗口 
  2. bool CCEGLView::Create(LPCTSTR pTitle, int w, int h) 
  3. { 
  4.     bool bRet = false; 
  5.     do  
  6.     { 
  7.         CC_BREAK_IF(m_hWnd); 
  8.  
  9.         HINSTANCE hInstance = GetModuleHandle( NULL ); 
  10.         WNDCLASS  wc;        // Windows Class Structure 
  11.  
  12.         // Redraw On Size, And Own DC For Window. 
  13.         wc.style          = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;   
  14.         wc.lpfnWndProc    = _WindowProc;                    // WndProc Handles Messages 
  15.         wc.cbClsExtra     = 0;                              // No Extra Window Data 
  16.         wc.cbWndExtra     = 0;                                // No Extra Window Data 
  17.         wc.hInstance      = hInstance;                        // Set The Instance 
  18.         wc.hIcon          = LoadIcon( NULL, IDI_WINLOGO );    // Load The Default Icon 
  19.         wc.hCursor        = LoadCursor( NULL, IDC_ARROW );    // Load The Arrow Pointer 
  20.         wc.hbrBackground  = NULL;                           // No Background Required For GL 
  21.         wc.lpszMenuName   = m_menu;                         //  
  22.         wc.lpszClassName  = kWindowClassName;               // Set The Class Name 
  23.  
  24.         CC_BREAK_IF(! RegisterClass(&wc) && 1410 != GetLastError());         
  25.  
  26.         // center window position 
  27.         RECT rcDesktop; 
  28.         GetWindowRect(GetDesktopWindow(), &rcDesktop); 
  29.  
  30.         WCHAR wszBuf[50] = {0}; 
  31.         MultiByteToWideChar(CP_UTF8, 0, m_szViewName, -1, wszBuf, sizeof(wszBuf)); 
  32.  
  33.         // create window 
  34.         m_hWnd = CreateWindowEx( 
  35.             WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,    // Extended Style For The Window 
  36.             kWindowClassName,                                    // Class Name 
  37.             wszBuf,                                                // Window Title 
  38.             WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,        // Defined Window Style 
  39.             0, 0,                                                // Window Position 
  40.             0,                                                  // Window Width 
  41.             0,                                                  // Window Height 
  42.             NULL,                                                // No Parent Window 
  43.             NULL,                                                // No Menu 
  44.             hInstance,                                            // Instance 
  45.             NULL ); 
  46.  
  47.         CC_BREAK_IF(! m_hWnd); 
  48.  
  49.         resize(w, h); 
  50.  
  51.         bRet = initGL(); 
  52.         CC_BREAK_IF(!bRet); 
  53.          
  54.         s_pMainWindow = this; 
  55.         bRet = true; 
  56.     } while (0); 
  57.  
  58.     return bRet; 
  59. } 

  1. //窗口处理函数 
  2. LRESULT CCEGLView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  3. { 
  4.     BOOL bProcessed = FALSE; 
  5.  
  6.     switch (message) 
  7.     { 
  8.     case WM_LBUTTONDOWN: 
  9.         if (m_pDelegate && MK_LBUTTON == wParam) 
  10.         { 
  11.             POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)}; 
  12.             CCPoint pt(point.x/CC_CONTENT_SCALE_FACTOR(), point.y/CC_CONTENT_SCALE_FACTOR()); 
  13.             CCPoint tmp = ccp(pt.x, m_obScreenSize.height - pt.y); 
  14.             if (m_obViewPortRect.equals(CCRectZero) || m_obViewPortRect.containsPoint(tmp)) 
  15.             { 
  16.                 m_bCaptured = true; 
  17.                 SetCapture(m_hWnd); 
  18.                 int id = 0; 
  19.                 pt.x *= m_windowTouchScaleX; 
  20.                 pt.y *= m_windowTouchScaleY; 
  21.                 handleTouchesBegin(1, &id, &pt.x, &pt.y); 
  22.             } 
  23.         } 
  24.         break; 
  25.  
  26.     case WM_MOUSEMOVE: 
  27.         if (MK_LBUTTON == wParam && m_bCaptured) 
  28.         { 
  29.             POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)}; 
  30.             CCPoint pt(point.x/CC_CONTENT_SCALE_FACTOR(), point.y/CC_CONTENT_SCALE_FACTOR()); 
  31.             int id = 0; 
  32.             pt.x *= m_windowTouchScaleX; 
  33.             pt.y *= m_windowTouchScaleY; 
  34.             handleTouchesMove(1, &id, &pt.x, &pt.y); 
  35.         } 
  36.         break; 
  37.  
  38.     case WM_LBUTTONUP: 
  39.         if (m_bCaptured) 
  40.         { 
  41.             POINT point = {(short)LOWORD(lParam), (short)HIWORD(lParam)}; 
  42.             CCPoint pt(point.x/CC_CONTENT_SCALE_FACTOR(), point.y/CC_CONTENT_SCALE_FACTOR()); 
  43.             int id = 0; 
  44.             pt.x *= m_windowTouchScaleX; 
  45.             pt.y *= m_windowTouchScaleY; 
  46.             handleTouchesEnd(1, &id, &pt.x, &pt.y); 
  47.  
  48.             ReleaseCapture(); 
  49.             m_bCaptured = false; 
  50.         } 
  51.         break; 
  52.     case WM_SIZE: 
  53.         switch (wParam) 
  54.         { 
  55.         case SIZE_RESTORED: 
  56.             CCApplication::sharedApplication()->applicationWillEnterForeground(); 
  57.             break; 
  58.         case SIZE_MINIMIZED: 
  59.             CCApplication::sharedApplication()->applicationDidEnterBackground(); 
  60.             break; 
  61.         } 
  62.         break; 
  63.     case WM_KEYDOWN: 
  64.         if (wParam == VK_F1 || wParam == VK_F2) 
  65.         { 
  66.             CCDirector* pDirector = CCDirector::sharedDirector(); 
  67.             if (GetKeyState(VK_LSHIFT) < 0 ||  GetKeyState(VK_RSHIFT) < 0 || GetKeyState(VK_SHIFT) < 0) 
  68.                 pDirector->getKeypadDispatcher()->dispatchKeypadMSG(wParam == VK_F1 ? kTypeBackClicked : kTypeMenuClicked); 
  69.         } 
  70.         if ( m_lpfnAccelerometerKeyHook!=NULL ) 
  71.         { 
  72.             (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); 
  73.         } 
  74.         break; 
  75.     case WM_KEYUP: 
  76.         if ( m_lpfnAccelerometerKeyHook!=NULL ) 
  77.         { 
  78.             (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); 
  79.         } 
  80.         break; 
  81.     case WM_CHAR: 
  82.         { 
  83.             if (wParam < 0x20) 
  84.             { 
  85.                 if (VK_BACK == wParam) 
  86.                 { 
  87.                     CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward(); 
  88.                 } 
  89.                 else if (VK_RETURN == wParam) 
  90.                 { 
  91.                     CCIMEDispatcher::sharedDispatcher()->dispatchInsertText("\n", 1); 
  92.                 } 
  93.                 else if (VK_TAB == wParam) 
  94.                 { 
  95.                     // tab input 
  96.                 } 
  97.                 else if (VK_ESCAPE == wParam) 
  98.                 { 
  99.                     // ESC input 
  100.                     //CCDirector::sharedDirector()->end(); 
  101.                 } 
  102.             } 
  103.             else if (wParam < 128) 
  104.             { 
  105.                 // ascii char 
  106.                 CCIMEDispatcher::sharedDispatcher()->dispatchInsertText((const char *)&wParam, 1); 
  107.             } 
  108.             else 
  109.             { 
  110.                 char szUtf8[8] = {0}; 
  111.                 int nLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&wParam, 1, szUtf8, sizeof(szUtf8), NULL, NULL); 
  112.                 CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(szUtf8, nLen); 
  113.             } 
  114.             if ( m_lpfnAccelerometerKeyHook!=NULL ) 
  115.             { 
  116.                 (*m_lpfnAccelerometerKeyHook)( message,wParam,lParam ); 
  117.             } 
  118.         } 
  119.         break; 
  120.     case WM_PAINT: 
  121.         PAINTSTRUCT ps; 
  122.         BeginPaint(m_hWnd, &ps); 
  123.         EndPaint(m_hWnd, &ps); 
  124.         break; 
  125.  
  126.     case WM_CLOSE: 
  127.         CCDirector::sharedDirector()->end(); 
  128.         break; 
  129.  
  130.     case WM_DESTROY: 
  131.         destroyGL(); 
  132.         PostQuitMessage(0); 
  133.         break; 
  134.  
  135.     default: 
  136.         if (m_wndproc) 
  137.         { 
  138.              
  139.             m_wndproc(message, wParam, lParam, &bProcessed); 
  140.             if (bProcessed) break; 
  141.         } 
  142.         return DefWindowProc(m_hWnd, message, wParam, lParam); 
  143.     } 
  144.  
  145.     if (m_wndproc && !bProcessed) 
  146.     { 
  147.         m_wndproc(message, wParam, lParam, &bProcessed); 
  148.     } 
  149.     return 0; 
  150. } 

到目前为此,windows程序的那三把斧头都找到了。。。。也不早了,想睡觉觉去了。

第一次写学习博文,不足之处请原谅,由于水平有限,此博文仅是为了抛砖引玉,如有错误之处,忘勘正,勘正热线QQ947491240,谢谢!!我们下节见!!

返回游戏开发教程...