﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-图形，诗意之栖居-随笔分类-引擎实战</title><link>http://www.cnitblog.com/longhulz/category/8800.html</link><description>充满劳绩，然而人诗意地栖居在大地上。
——[德]荷尔德林</description><language>zh-cn</language><lastBuildDate>Tue, 04 Oct 2011 23:18:38 GMT</lastBuildDate><pubDate>Tue, 04 Oct 2011 23:18:38 GMT</pubDate><ttl>60</ttl><item><title>mst引擎微核：Console/Windows支持</title><link>http://www.cnitblog.com/longhulz/archive/2010/09/30/69342.html</link><dc:creator>龙湖</dc:creator><author>龙湖</author><pubDate>Thu, 30 Sep 2010 06:23:00 GMT</pubDate><guid>http://www.cnitblog.com/longhulz/archive/2010/09/30/69342.html</guid><wfw:comment>http://www.cnitblog.com/longhulz/comments/69342.html</wfw:comment><comments>http://www.cnitblog.com/longhulz/archive/2010/09/30/69342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/longhulz/comments/commentRss/69342.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/longhulz/services/trackbacks/69342.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;引擎从何处开始，到何处结束。引擎当然从入口点开始，对c/c++程序员而言，控制台程序始于main()，win32程序始于WinMain()。一个显而易见的事实，它从朴素的程序框架开始，而不是各种夺目的功能和特效。<br>&nbsp;&nbsp;&nbsp;假如我们同时需要控制台和win32窗口呢？需要它的可能理由：<br>&nbsp;&nbsp;&nbsp;①一个方便调试的控制台，在发布时，随时可以把它屏蔽。<br>&nbsp;&nbsp;&nbsp;②从命令行执行不同的模式<br>&nbsp;&nbsp;&nbsp;③尽可能简单的程序入口点<br><br>&nbsp;&nbsp; 一种解决办法比较笨拙，使用预定义，如OGRE：<br>#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32<br>INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )<br>#else<br>int main(int argc, char **argv)<br>#endif<br><br>&nbsp;&nbsp; 另一种解决办法是在main()和WinMain()中调用同一个函数run()，且通过GetModuleHandle(NULL)获取CreateWindowEx前registerWindowClass需要的HInstance。<br>&nbsp;&nbsp; windowClass.hInstance&nbsp;&nbsp; = winState.appInstance;<br>&nbsp;&nbsp;&nbsp;用全局的winState.appWindow保存创建的窗口句柄。大致代码如下(来源于Torque引擎)，不再赘述。<br><br>struct Win32PlatState<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hinstOpenGL;<br>&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hinstGLU;<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND appWindow;<br>&nbsp;&nbsp;&nbsp;&nbsp; HDC appDC;<br>&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE appInstance;<br>&nbsp;&nbsp;&nbsp;&nbsp; HGLRC hGLRC;<br>};&nbsp; </p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>Win32PlatState winState;</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>//--------------------------------------<br>static int run(int argc, const char **argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 伪码<br>&nbsp;&nbsp;&nbsp;&nbsp; int ret = mst-&gt;main(argc, argv);<br>&nbsp;&nbsp;&nbsp;&nbsp; Platform::createWindow();<br>&nbsp;&nbsp;&nbsp;&nbsp; Platform::process();</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br>}</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>//--------------------------------------<br>int main(int argc, const char **argv)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; winState.appInstance = GetModuleHandle(NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp; return run(argc, argv);<br>}</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>//--------------------------------------<br>int PASCAL WinMain(HINSTANCE hInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSTR&nbsp;&nbsp;&nbsp; lpCmdLine,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nCmdShow)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; std::vector&lt;char *&gt; argv;<br>&nbsp;&nbsp;&nbsp;&nbsp; char moduleName[256];<br>&nbsp;&nbsp;&nbsp;&nbsp; GetModuleFileNameA(NULL, moduleName, sizeof(moduleName));<br>&nbsp;&nbsp;&nbsp;&nbsp; argv.push_back(moduleName);</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp; for (const char* word,*ptr = lpCmdLine; *ptr; )<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Eat white space<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (; isspace(*ptr) &amp;&amp; *ptr; ptr++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Pick out the next word<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (word = ptr; !isspace(*ptr) &amp;&amp; *ptr; ptr++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Add the word to the argument list.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (*word) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len = ptr - word;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *arg = (char *) malloc(len + 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strncpy(arg, word, len);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arg[len] = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argv.push_back(arg);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp; winState.appInstance = hInstance; <br>&nbsp;&nbsp;&nbsp;&nbsp; int retVal = run(argv.size(), (const char **) argv.front());<br>&nbsp;&nbsp;&nbsp;&nbsp; for(unsigned int j = 1; j &lt; argv.size(); j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(argv[j]);</p>
<p style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp; return retVal;<br>}<br><br>参考链接：<br>&nbsp;&nbsp;&nbsp;Getting the HWND and HINSTANCE of the Console Window<br>&nbsp;&nbsp;&nbsp;<a href="http://bobobobo.wordpress.com/2008/02/03/getting-the-hwnd-and-hinstance-of-the-console-window">http://bobobobo.wordpress.com/2008/02/03/getting-the-hwnd-and-hinstance-of-the-console-window</a></p>
<img src ="http://www.cnitblog.com/longhulz/aggbug/69342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/longhulz/" target="_blank">龙湖</a> 2010-09-30 14:23 <a href="http://www.cnitblog.com/longhulz/archive/2010/09/30/69342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mst引擎微核(序)</title><link>http://www.cnitblog.com/longhulz/archive/2010/09/30/69341.html</link><dc:creator>龙湖</dc:creator><author>龙湖</author><pubDate>Thu, 30 Sep 2010 05:54:00 GMT</pubDate><guid>http://www.cnitblog.com/longhulz/archive/2010/09/30/69341.html</guid><wfw:comment>http://www.cnitblog.com/longhulz/comments/69341.html</wfw:comment><comments>http://www.cnitblog.com/longhulz/archive/2010/09/30/69341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/longhulz/comments/commentRss/69341.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/longhulz/services/trackbacks/69341.html</trackback:ping><description><![CDATA[<p><span style="FONT-FAMILY: Lucida Console; COLOR: #000000; FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;从根源开始，渐及枝叶，发掘微末却核心的引擎技巧，但有所见，心下自喜，故名&#8220;微核&#8221;。至于mst来历，天知地知，先且藏拙。<br>&nbsp;&nbsp;&nbsp;在下面的blog中，本人将从实践中总结点滴的技巧，与引擎原创爱好者交流，不吝见笑于大方。是为序。</span></p>
<img src ="http://www.cnitblog.com/longhulz/aggbug/69341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/longhulz/" target="_blank">龙湖</a> 2010-09-30 13:54 <a href="http://www.cnitblog.com/longhulz/archive/2010/09/30/69341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>