网络和流协议,文件打包,读取,等等一工作基本工作总算是完工了,现在人物可以在我的场景中漫游,人物和人物之间通过网络能相互通讯,都已经实现了,但是回头再看看我的场景,实在是汗颜啊,场景十分单调,之前我是把场景对象放入到一个大的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可不是一个好东西,这到不算什么,地图编辑器才是最麻烦的东西。
唉~~~
无论如何,现在开工吧!