網絡和流協議,文件打包,讀取,等等一工作基本工作總算是完工了,現在人物可以在我的場景中漫游,人物和人物之間通過網絡能相互通訊,都已經實現了,但是回頭再看看我的場景,實在是汗顏啊,場景十分單調,之前我是把場景對象放入到一個大的XML文件中的,完全手工來編輯XML,因為沒有自己的場景編輯器,唉,一直下不了決心去寫啊。
從今天開始,我打算自己自作一個場景編輯器,這可是一個大工程啊,不過應該是很值的,如果能完善,那才真就有引擎的架式了
可能你會問,現在也有很多免費的引擎還自己寫?
是啊,我的無限大地形是核心,里面溶入了我太多的心血,很多實現和別人的自然“不完全兼容”了,如今是時候了……
進行了簡單的設計之后,初步我打算用MDI窗口來制作場景編輯器,工具,參數調節面板在兩旁,中間是D3D窗口
可才開始,就碰到問題了,天哪,MFC的主循環在哪里呢?How about Continuous Updating and Rending in MFC ?
不過功夫不負有心人,總算查到了,不過研究了好一會兒,還好有了結果
那么說到正題,怎么在MFC應用程序里面加入主循環呢,MFC的WinMain可是看不到的哦,消息處理都做了高度封裝
其實也是有解決方法的,請看下文:
//你需要重寫你的應用程序的Run()方法,把原方法里面的代碼統統復制過來下面都是copy的CWinApp::Run()的源碼
int CMapEditorApp::Run()
{
//return CWinApp::Run();
if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
{
// Not launched /Embedding or /Automation, but has no main window!
TRACE(traceAppMsg, 0, "Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
AfxPostQuitMessage(0);
}
ASSERT_VALID(this);
_AFX_THREAD_STATE* pState = AfxGetThreadState();
// for tracking the idle time state
BOOL bIdle = TRUE;
LONG lIdleCount = 0;
// acquire and dispatch messages until a WM_QUIT message is received.
for (;;)
{
//偷看消息隊列,如果沒有消息的話,就執行游戲的主循環框架完成渲染的Update
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while(!::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
{
//這里就可以放游戲的主循環了
//GameLoop();
DBWindowWrite("hello \r\n");
}
//加入上面這段就搞定了,這個方法里面的其他的代碼就不要去動他們的了,否則 ^_^!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// phase1: check to see if we can do idle work,處理線程
while (bIdle &&
!::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
{
// call OnIdle while in bIdle state
if (!OnIdle(lIdleCount++))
bIdle = FALSE; // assume "no idle" state
}
// phase2: pump messages while available
do
{
//windows自己的GetMessage消息處理機制,類似于消息泵,有消息就處理消息
// pump message, but quit on WM_QUIT,
if (!PumpMessage())
return ExitInstance();
// reset "no idle" state after pumping "normal" message
//if (IsIdleMessage(&m_msgCur))
if (IsIdleMessage(&(pState->m_msgCur)))
{
bIdle = TRUE;
lIdleCount = 0;
}
} while (::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE));
}
}
這只是一個初步的開始,MFC可不是一個好東西,這到不算什么,地圖編輯器才是最麻煩的東西。
唉~~~
無論如何,現在開工吧!