網(wǎng)絡(luò)和流協(xié)議,文件打包,讀取,等等一工作基本工作總算是完工了,現(xiàn)在人物可以在我的場(chǎng)景中漫游,人物和人物之間通過(guò)網(wǎng)絡(luò)能相互通訊,都已經(jīng)實(shí)現(xiàn)了,但是回頭再看看我的場(chǎng)景,實(shí)在是汗顏啊,場(chǎng)景十分單調(diào),之前我是把場(chǎng)景對(duì)象放入到一個(gè)大的XML文件中的,完全手工來(lái)編輯XML,因?yàn)闆](méi)有自己的場(chǎng)景編輯器,唉,一直下不了決心去寫(xiě)啊。
從今天開(kāi)始,我打算自己自作一個(gè)場(chǎng)景編輯器,這可是一個(gè)大工程啊,不過(guò)應(yīng)該是很值的,如果能完善,那才真就有引擎的架式了
可能你會(huì)問(wèn),現(xiàn)在也有很多免費(fèi)的引擎還自己寫(xiě)?
是啊,我的無(wú)限大地形是核心,里面溶入了我太多的心血,很多實(shí)現(xiàn)和別人的自然“不完全兼容”了,如今是時(shí)候了……
進(jìn)行了簡(jiǎn)單的設(shè)計(jì)之后,初步我打算用MDI窗口來(lái)制作場(chǎng)景編輯器,工具,參數(shù)調(diào)節(jié)面板在兩旁,中間是D3D窗口
可才開(kāi)始,就碰到問(wèn)題了,天哪,MFC的主循環(huán)在哪里呢?How about Continuous Updating and Rending in MFC ?
不過(guò)功夫不負(fù)有心人,總算查到了,不過(guò)研究了好一會(huì)兒,還好有了結(jié)果
那么說(shuō)到正題,怎么在MFC應(yīng)用程序里面加入主循環(huán)呢,MFC的WinMain可是看不到的哦,消息處理都做了高度封裝
其實(shí)也是有解決方法的,請(qǐng)看下文:
//你需要重寫(xiě)你的應(yīng)用程序的Run()方法,把原方法里面的代碼統(tǒng)統(tǒng)復(fù)制過(guò)來(lái)下面都是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 (;;)
{
//偷看消息隊(duì)列,如果沒(méi)有消息的話,就執(zhí)行游戲的主循環(huán)框架完成渲染的Update
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while(!::PeekMessage(&(pState->m_msgCur), NULL, NULL, NULL, PM_NOREMOVE))
{
//這里就可以放游戲的主循環(huán)了
//GameLoop();
DBWindowWrite("hello \r\n");
}
//加入上面這段就搞定了,這個(gè)方法里面的其他的代碼就不要去動(dòng)他們的了,否則 ^_^!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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消息處理機(jī)制,類似于消息泵,有消息就處理消息
// 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));
}
}
這只是一個(gè)初步的開(kāi)始,MFC可不是一個(gè)好東西,這到不算什么,地圖編輯器才是最麻煩的東西。
唉~~~
無(wú)論如何,現(xiàn)在開(kāi)工吧!