很多人都不習慣cocos2tdio編輯器,都想自己寫一個,但是無從下手。不知道怎麼把cocos的東西放到MFC裏面。
我先講下原理吧。
在Windos下面,窗口是可以,設置父類窗口的,也就是,把窗口綁定到摸個窗口下。
那我們就是把 cocos2dx的窗口放置到我們MFC的視圖裏面。就可以了。
原來cocos2dx有走消息循環。
我們需要把這個提取到MFC裏面去,讓MFC來控制這個循環。
-
創建一個MFC 文檔工程,或者多文檔也可以。
-
在MainFrame.cpp 添加定義
AppDelegate cocoApp; -
在 OnCreate 函數的末尾添加
SetTimer(0, 1, NULL); // 定時器,用來調用cocos消息循環的
// 下面我們不用 cocos應用的 run函數,因為我們循環剝離出來了
AppDelegate &app = cocoApp;
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setFrameSize(960, 640);
CCApplication::sharedApplication()->applicationDidFinishLaunching();
在 OnTimer(UINT_PTR nIDEvent) 函數裏面添加,cocos的主循環
CCDirector::sharedDirector()->mainLoop();
到這裡我們可以看到我們的cocos窗口了。
5. 接下來我們需要把他嵌入到我們的 視圖裏面去
如果是單文檔的我們只需要在 OnTimer裏面添加窗口綁定就可以了
其實就是把 cocos的窗口樣式修改成沒標題的,然後再把他的父窗口設置成視圖的就可以了。
if(m_bIsAttack == false)
{
m_bIsAttack = true;
CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();
LONG dwStyle = ::GetWindowLong(pMainWnd->getHWnd(), GWL_STYLE);
dwStyle &= (/*(~WS_CAPTION) & */(~WS_MINIMIZEBOX));
//LONG dwStyle = WS_CHILD | WS_BORDER | WS_VISIBLE;
::SetWindowLong(pMainWnd->getHWnd(), GWL_STYLE, dwStyle);
::ShowWindow(pMainWnd->getHWnd(), SW_SHOW);
HWND hNewParent = GetActiveView()->GetSafeHwnd();
::SetParent(pMainWnd->getHWnd(), hNewParent);
::SetWindowPos(pMainWnd->getHWnd(), 0, 0, -28, 0, 0, SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOZORDER);
CCDirector *pDirector = CCDirector::sharedDirector();
m_pScene = new CCScene();
pDirector->runWithScene(m_pScene);
}
6. 我們還需要設置一下在視圖的位置。
在View的類裏面OnSize裏面修復cocos窗口的位置
CView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CCEGLView* pMainWnd = CCEGLView::sharedOpenGLView();
::SetWindowPos(pMainWnd->getHWnd(), 0, 0, -28, 0, 0, SWP_NOCOPYBITS | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOZORDER);
大功告成,就成功嵌入進去了。
7. 這邊 cocos裏面有個bug需要修復一下
Win32下面的 CCEGLView.cpp 的消息響應函數
WindowProc
裏面的 判斷鼠標是否按下,應該改使用 MK_LBUTTON & wParam 這個才對。
到這裡基本就可以成功嵌入了。
後續我會在放開,對應的,屬性表多文檔,還有控件,插件的編寫。
有任何的遊戲技術問題都可以資訊我,不局限與cocos2dx==、
友情鏈接哈:裏面有成功的UI編輯器效果圖==、
http://www.cocoachina.com/bbs/read.php?tid-219173.html
