<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>计算机－＞游戏</title><link>http://blog.vckbase.com/bastet/category/576.html</link><description>计算机－＞游戏</description><managingEditor>Diviner</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>Diviner</dc:creator><title>SDL-IM: IM(输入法) 支援 in SDL（同下，转自http://sdl-im.csie.net/cn/index.html，应该是位台湾朋友)</title><link>http://blog.vckbase.com/bastet/archive/2005/09/16/12153.html</link><pubDate>Fri, 16 Sep 2005 00:47:00 GMT</pubDate><guid>http://blog.vckbase.com/bastet/archive/2005/09/16/12153.html</guid><wfw:comment>http://blog.vckbase.com/bastet/comments/12153.html</wfw:comment><comments>http://blog.vckbase.com/bastet/archive/2005/09/16/12153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/bastet/comments/commentRss/12153.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/bastet/services/trackbacks/12153.html</trackback:ping><description>&lt;P style="MARGIN-BOTTOM: 0cm" align=center&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=6&gt;&lt;SPAN lang=en-US&gt;SDL-IM: IM(输入法) 支援 in SDL&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm" align=center&gt;&lt;FONT color=#000000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=en-US&gt;(本页不保证最新，新讯息以英文网页为主 &lt;A href="http://sdl-im.csie.net/index.html"&gt;English main page&lt;/A&gt; )&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;哪里我可取得需要的档案？&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;您可取得 SDL-1.2.8 从: &lt;A href="http://www.libsdl.org/"&gt;http://www.libsdl.org&lt;/A&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;您可取得 SDL_im for SDL-1.2.8 从:&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SMALL&gt;&lt;A href="http://sdl-im.csie.net/download/SDL_im-1.2.8-20050828.diff.gz"&gt;&lt;SMALL&gt;SDL_im-1.2.8-20050828.diff.gz&lt;/SMALL&gt;&lt;/A&gt;&lt;/SMALL&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;A href="file:///home/courage/sdl-im/website/download/SDL_im-1.2.8-20050211.diff.gz"&gt;&lt;SMALL&gt;&lt;SPAN style="FONT-FAMILY: Nimbus Roman No9 L,serif"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/SMALL&gt;&lt;/A&gt;&lt;/P&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;还有其它的吗？&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;是的！这里有一些使用了该修补的范例或程式库：&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;A href="http://sdl-im.csie.net/SDL_imm/index.html"&gt;SDL_imm&lt;/A&gt; -- 一个提供更多 IM 支援的 Option Pack.&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;1.&lt;A href="http://humming.dip.jp/wiki/wiki.pl?GuiChan%2FSDL-IM"&gt;GuiChan/SDL-IM&lt;/A&gt; by &lt;A href="http://humming.dip.jp/%7Eharpy/"&gt;harpy&lt;/A&gt; (感谢 harpy!)&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;2. &lt;A href="http://sdl-im.csie.net/paragui.html"&gt;patch&lt;/A&gt; for paraGUI-1.1.8&lt;BR&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;3. &lt;A href="http://sdl-im.csie.net/aedgui.html"&gt;patch&lt;/A&gt; for aedGUI-0.1.8a&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;4. &lt;A href="http://sdl-im.csie.net/ustring.html"&gt;用标准 C/C++ 实现 i18n 支援，以及一个简单易用的 ustring 程式库，这是 std::basic_string 的包覆模板。&lt;/A&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;5. &lt;A href="http://sdl-im.csie.net/OGRE_i18n.html"&gt;patch&lt;/A&gt; for OGRE(&amp;gt; 1.0.3)，使其支援 i18n (可显示及输入中文、日文、韩文及多种语言)。&lt;BR&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;一些快照：&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;1. showfont.c(included in &lt;A href="http://sdl-im.csie.net/download/test.tar.gz"&gt;test.tar.gz&lt;/A&gt;) example for &lt;A href="http://www.libsdl.org/projects/SDL_ttf"&gt;SDL_ttf&lt;/A&gt;. &lt;A href="http://sdl-im.csie.net/image/sdl_ttf_sample.png"&gt;screenshot&lt;/A&gt;.&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;2. &lt;A href="http://sdl-im.csie.net/download/test.tar.gz"&gt;test.tar.gz&lt;/A&gt;: simple tests for SDL-IM. (update: 2005/08/28)&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;以SDL_im修补过的二进位元套件(&lt;FONT color=#414141&gt;&lt;STRONG&gt; 开发程式库 &lt;/STRONG&gt;&lt;/FONT&gt;):&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;SDL-devel-1.2.8-VC6.zip (Visual C++ 5,6,7)&lt;BR&gt;SDL-devel-1.2.8-mingw32.tar.gz (Mingw32)&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;BR&gt;&lt;A href="file:///home/courage/sdl-im/website/download/SDL_im-1.2.8-20050211.diff.gz"&gt;&lt;SMALL&gt;&lt;SPAN style="FONT-FAMILY: Nimbus Roman No9 L,serif"&gt;&lt;/SPAN&gt;&lt;/SMALL&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;如何使用这份修补呢？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;1. 下载 SDL-1.2.8 并解压缩它(ex. $tar zxvf SDL-1.2.8.tar.gz).&lt;BR&gt;2. 下载修补，放到 SDL-1.2.8 方才解压的目录里，并解压缩它(ex. $gzip -d SDL_im-1.2.8-20050828.diff.gz).&lt;BR&gt;3. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;在 SDL-1.2.8 目录里 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;patch 这份 diff file(ex. $patch -p1 &amp;lt; SDL_im-1.2.8-20050211.diff).&lt;BR&gt;4. 确定预先处理的巨集符号已定义(ENABLE_IM_EVENT).&lt;BR&gt;5. 接下来，建造 SDL 并好好享用吧！ :-)&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;注意: 如果你在 Win32 环境下使用 Visual C++ ，加上 ENABLE_IM_EVENT 定义到你的 Makefile 或 Project file. 如果你在 Linux 环境下使用 automake ，当你下 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&amp;#8220;./configure&amp;#8221; 指命时，&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;只要检查 &amp;#8220;--enable-im-event&amp;#8221; 符号是否开启(default=yes).&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;There are the project files for VC6 and VC7.1: &lt;A href="http://sdl-im.csie.net/download/VisualC.zip"&gt;VisualC.zip&lt;/A&gt;, &lt;A href="http://sdl-im.csie.net/download/VisualC7.zip"&gt;VisualC7.zip&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;There is the DirectX devel source for MinGW to build SDL: &lt;A href="http://www.libsdl.org/extras/win32/common/"&gt;http://www.libsdl.org/extras/win32/common/&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;支援哪些平台？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=en-US&gt;这份修补支援 Win32 上的 IME(Input Method Editor)和 Linux(X11) 上的 XIM(X Input Method). 它也支援在 &lt;SPAN style="COLOR: rgb(255,0,0)"&gt;全萤幕&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;&lt;/SPAN&gt; 下显示 IME/XIM 视窗。&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;如何使用这些新的函式？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;首先，确定您的输入法至少支援三种模式中的其中一种: Root, OverTheSpot, OnTheSpot.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;然后，阅读以下的手册:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;A href="http://sdl-im.csie.net/sdlimvalue.html"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;SDL_imvalue&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;A href="http://sdl-im.csie.net/sdlsetimvalues.html"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;SDL_SetIMValues&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;A href="http://sdl-im.csie.net/sdlgetimvalues.html"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;SDL_GetIMValues&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;A href="http://sdl-im.csie.net/sdlsetimposition.html"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;SDL_SetIMPosition&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;A href="http://sdl-im.csie.net/sdlflushimstring.html"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;SDL_FlushIMString&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;A href="http://sdl-im.csie.net/sdlgetiminfo.html"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;SDL_GetIMInfo&lt;/FONT&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;如果您有任何建议，问题或麻烦，请写信给小弟(请用英语或正体中文，谢谢). &amp;lt; &lt;A href="mailto:fc7654321@hotmail.com"&gt;&lt;SPAN style="COLOR: rgb(51,51,255)"&gt;&lt;/SPAN&gt;&lt;/A&gt;&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face=新细明体&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;我为何要使用这份 patch 呢？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT color=#000000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=en-US&gt;小弟有两个理由来做这件事:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT color=#000000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=en-US&gt;1. 如果您想开发一款线上游戏并且想要发布至全世界，特别是亚洲地区，那么 IM(输入法) 的支援是必要的。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT color=#000000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=3&gt;&lt;SPAN lang=en-US&gt;2. 目前已有需多根植於 SDL 的优良 GUI 程式库。假若 SDL 支援 IM(输入法) ，那便表示我们不仅只可选择&amp;nbsp; MFC、 Qt 或 GTK+ 来写您的应用程式，而且还有许多其它的 GUI 程式库可用。没有什么比「能够自由自在地选择自己想要且需要的东西」还要更棒的了！&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face=新细明体&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;我自己有能力来 patch 吗？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;当然罗！修补并不难。因为 SDL 的结构非常明析而且物件导向。您所需要知道的技术，只要知道如何在您的平台上，建立一个视窗并且让这个主视窗能够接收系统事件(event)。您若有兴趣来使得 SDL 得以支援 IM(输入法)，小弟会非常高兴。 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;除此之外，小弟希望有人愿意帮忙小弟来维护这专案，直到这份 patch 整合进 SDL 的官方释出版本。&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;你需要帮忙吗？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;是的！我需要您的帮忙:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;1. 在&amp;nbsp; Win32 DirectDraw 环境下，虽然小弟已成功地在全萤幕下显示 IME 视窗，但状态视窗仍然无法翻转出来。小弟不知道如何解决这个问题，如果您知道，请告诉小弟。(&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;此问题已解决&lt;/SPAN&gt;)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;2. 这份修补还没有经过许多的测试。如果您可以用日文、韩文或任何其它使用多位元字组的语言来帮忙测试，小弟会很感激您的帮助。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en-US&gt;3. 假若您有一些麦金塔、FreeBSD或其它平台的视窗程式设计经验，请加入小弟一同来实做IM(输入法)的支援！ :-)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en-US&gt;修补的重点在哪？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;SPAN style="FONT-FAMILY: Nimbus Roman No9 L,serif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; (略)&lt;BR&gt;&lt;/SPAN&gt;
&lt;P style="MARGIN-BOTTOM: 0cm"&gt;&lt;FONT color=#008000&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;FONT size=5&gt;&lt;SPAN lang=en&gt;本页的修改纪录:&amp;nbsp; &lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;SPAN style="FONT-FAMILY: Nimbus Roman No9 L,serif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 2005/03/12: 新增本页。&lt;BR&gt;&lt;/SPAN&gt;
&lt;DIV style="MARGIN-LEFT: 40px"&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;FONT face="Nimbus Roman No9 L, serif"&gt;&lt;SPAN lang=en&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P style="MARGIN-BOTTOM: 0cm; MARGIN-LEFT: 2cm"&gt;&lt;SPAN style="FONT-WEIGHT: bold"&gt;&lt;SMALL&gt;Copyright 2004-2005 L.Y.C., Taiwan(Formosa).&lt;/SMALL&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/bastet/aggbug/12153.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Diviner</dc:creator><title>ogre的中文及其他</title><link>http://blog.vckbase.com/bastet/archive/2005/09/16/12152.html</link><pubDate>Fri, 16 Sep 2005 00:44:00 GMT</pubDate><guid>http://blog.vckbase.com/bastet/archive/2005/09/16/12152.html</guid><wfw:comment>http://blog.vckbase.com/bastet/comments/12152.html</wfw:comment><comments>http://blog.vckbase.com/bastet/archive/2005/09/16/12152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/bastet/comments/commentRss/12152.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/bastet/services/trackbacks/12152.html</trackback:ping><description>&lt;DIV style="TEXT-ALIGN: left"&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;Some stuffs of the OGRE patch&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;&lt;/DIV&gt;I have to admit that if I had tried the &lt;A href="http://www.cegui.org.uk/"&gt;CEGUI&lt;/A&gt; first, I would not make this patch. Since I have finished it, and this patch has something different with CEGUI, I decide to put it on the site at last.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;What features the OGRE patch provides?&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;This patch provides these features:&lt;BR&gt;1. A static and a dynamic code convertor class and convertor manager class.&lt;BR&gt;2. A flexible UNICODE and multibyte code support natively.&lt;BR&gt;3. An l10n Input Method support with SDL(&lt;A href="http://sdl-im.csie.net/index.html"&gt;SDL_im&lt;/A&gt;).&lt;BR&gt;&lt;BR&gt;First, let us see the two pictures:&lt;BR&gt;&lt;IMG style="WIDTH: 800px; HEIGHT: 600px" alt="OGRE InputMethod support" src="http://sdl-im.csie.net/image/ogre_im.png"&gt;&lt;BR&gt;(picture 1 -- OGRE InputMethod support)&lt;BR&gt;&lt;BR&gt;[About picture 1]&lt;BR&gt;This is the InputMethod support with buffered or unbuffered input example.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG style="WIDTH: 650px; HEIGHT: 507px" alt="OGRE multicode support" src="http://sdl-im.csie.net/image/ogre_multicode.png"&gt;&lt;BR&gt;(picture 2 -- OGRE multicode support)&lt;BR&gt;&lt;BR&gt;[About picture 2]&lt;BR&gt;The first line is Japanese with SHIFT_JIS code.&lt;BR&gt;The second line is Korean with EUCKR code.&lt;BR&gt;The third line is Arabic with WINDOWS-1256 code.&lt;BR&gt;The fourth line is Thai with ISO-8859-11 code.&lt;BR&gt;The fifth line is vietnamese with &lt;SPAN style="COLOR: rgb(0,153,0)"&gt;UTF8&lt;/SPAN&gt; code.&lt;BR&gt;The sixth line is Hebrew with WINDOWS-1255 code.&lt;BR&gt;The seventh line is Chinese with BIG5 code.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;Where can I get this patch and how to apply it?&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;You can get OGRE patch from &lt;A href="http://sdl-im.csie.net/download/ogre_patch-20050717cvs-20050902.diff.gz"&gt;here&lt;/A&gt;, and the version(&amp;gt; 1.0.3) of OGRE I modify &lt;A href="http://sdl-im.csie.net/download/ogrenew-20050717cvs.tar.gz"&gt;here&lt;/A&gt; , or you can get the OGRE source from OGRE official web site: &lt;A href="http://www.ogre3d.org/"&gt;http://www.ogre3d.org/&lt;/A&gt;&amp;nbsp;.&lt;BR&gt;&lt;BR&gt;To apply this patch and compile:&lt;BR&gt;1.$tar zxvf&amp;nbsp;ogrenew-20050717cvs-20050730.tar.gz&lt;BR&gt;2.$gzip -d ogre_patch-20050717cvs-20050730.diff.gz&lt;BR&gt;3.$mv ogre_patch-20050717cvs-20050730.diff ogrenew/&lt;BR&gt;4.$cd ogrenew/&lt;BR&gt;5.$patch -p1 &amp;lt; ogre_patch-20050717cvs-20050730.diff&lt;BR&gt;6.$./bootstrap&lt;BR&gt;7.$./configure --with-platform=SDL&lt;BR&gt;8.$make&lt;BR&gt;&lt;BR&gt;Here is the sample of the new features: &lt;BR&gt;&lt;A href="http://sdl-im.csie.net/download/ogretest-20050730.tar.gz"&gt;ogretest&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&lt;A href="http://sdl-im.csie.net/download/ogretest_full-20050730.tar.gz"&gt;ogretest_full&lt;/A&gt; (with full Media pack)&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;The concepts of OGRE i18n patch&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;The implement of original Ogre::font is to make a texture which contains fonts' images all you may need, and to save the font's uv coordinate for this font texture in an array. When we need a character, just send the character code to get the coordinate of the font image texture.This is good enough for Latin system language, but not suitable for others' language, especially not for ideogram.&lt;BR&gt;&lt;BR&gt;In the ideogram(ex. Chinese) system,&amp;nbsp;there is no "alphabet" to be combined to a word. It's usually a character as a word. To see the character code range of CJK(Chinese, Japanese, Korean) language from &lt;A href="http://www.unicode.org/"&gt;http://www.unicode.org/&lt;/A&gt; , the range is from&amp;nbsp;0x4E00 to 0x9FBF . It means that in order to create a CJK font texture by Ogre::font, we have to create 20927 fonts images. It's&amp;nbsp;really a big texture! &lt;BR&gt;So we have to create a part what we need of the CJK code set &amp;nbsp;flexibly.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;The improvement of Ogre::font&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;1. Add &amp;nbsp;setExtCodeName() and getExtCodeName() members.&lt;BR&gt;2. Add setCodeRange() and getCodeRange() members.&lt;BR&gt;3. Re-define&amp;nbsp;OGRE_GLYPH_INDEX(). If the character can not be found in Ogre::font,&amp;nbsp;OGRE_GLYPH_INDEX()&amp;nbsp;will return zero. It means that if the character can not be found, you will always receive the coordinate of the first font image.(Important!)&lt;BR&gt;4. Add getUncreatedCode() to get a set which stores the code of the uncreated fonts you require.&lt;BR&gt;&lt;BR&gt;After applying this patch, we have to check if the macro OGRE_UNICODE_STRINGS in ogrenew/OgreMain/include/OgreConfig.h is enabled as 1, then when we compile and install OGRE completely, we have to set the new identity &amp;nbsp;"code" and "coderange" in the fontdef file in the Media pack.&lt;BR&gt;&lt;BR&gt;For example:&lt;BR&gt;&lt;BR&gt;TW&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type&amp;nbsp;&amp;nbsp;&amp;nbsp; truetype&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; source &amp;nbsp;&amp;nbsp;&amp;nbsp; fireflysung.ttf &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; code&amp;nbsp;&amp;nbsp;&amp;nbsp; BIG5&lt;BR&gt;&amp;nbsp; &amp;nbsp; coderange 0xA141,0xA141.0xA143,0xA143.0xA4DF,0xA4DF.0xA7D3,0xA7D3.0xABE4,0xABE4.0xB4BC,0xB4BC.0xBC7B,0xBC7B.0xBCDD,0xBCDD.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size 14&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; resolution 96&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; antialias_colour false&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;The string after the identity "code" is the code name which is the external&amp;nbsp;code we want Ogre::font to receive, and OGRE will convert the external code to wchar_t UNICODE. The external code has to be the char type encoding code, like UTF8, BIG5, SHIFT_JIS....etc, and not&amp;nbsp;the wide char type(wchar_t, unsigned short) encoding code, likes UCS, UTF16, UTF32...et.&lt;BR&gt;&lt;BR&gt;The string after the&amp;nbsp;identity "coderange", the code range of the "code", is the range which we want Ogre::font to create fonts image. The string is a line without space, and it uses comma(,) and decimal(.) &amp;nbsp;to separate and to end the first code and the last code.&lt;BR&gt;&lt;BR&gt;For example, it means to specify a BIG5 code 0xA141 to create:&lt;BR&gt;&lt;BR&gt;code &amp;nbsp; BIG5&lt;BR&gt;coderange 0xA141,0xA141.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;For example, it means to specify three BIG5 codes 0xA141, 0xA142, 0xA143 to create:&lt;BR&gt;&lt;BR&gt;code &amp;nbsp; BIG5&lt;BR&gt;coderange &amp;nbsp; 0xA141,0xA143.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Additionally, we can specify multi coderange like this:&lt;BR&gt;&lt;BR&gt;code &amp;nbsp; BIG5&lt;BR&gt;coderange &amp;nbsp; 0xA141,0xA143.0xA240,0xA2DD.0xA4AF,0xA4DF.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;Note: If you do not specify code and coderange in the fontdef file, or not use the TrueType font, the behavior of the patched Ogre::font will be the same as the original one.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;The little tools to make code range &lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;There are two little tools to help us to make code range and export external code to octal string easily: &lt;A href="http://sdl-im.csie.net/download/mkcorg-20050725.tar.gz"&gt;mkcorg and mklit&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;The improvement of Ogre::TextAreaOverlayElement&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;In order to show UNICODE words, I modify the Ogre::TextAreaOverlayElement to convert external string to UNICODE automatically. Its interface is not changed.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;The improvement of Ogre::Input&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;1. Add a new KeyCode define "KC_IM_FLUSH". "KC_IM_FLUSH" represents that the OGRE Application has received a string from IM(InputMethod). We could use "isKeyDown()" member function to check if the IM string is flushed.&lt;BR&gt;&lt;BR&gt;2. Add a new member "getIMString()" to get the local code string from IM.&lt;BR&gt;&lt;BR&gt;3. Add a new member "setIMPosition()" to set the absolute pixel position to IM widget.&lt;BR&gt;&lt;BR&gt;You could see the sample 01_buffered_input and 02_unbuffered_input in &lt;A href="http://sdl-im.csie.net/download/ogretest-20050730.tar.gz"&gt;ogretest&lt;/A&gt; to get the further information.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;The Code Convertor system&lt;/BIG&gt;&lt;BR&gt;&lt;BR&gt;Ogre::CodeConv(ogrenew/OgreMain/include/OgreCodeConv.h)&amp;nbsp;provides an interface and a template wrapper for helping users to create code convertor that OGRE needs.&lt;BR&gt;&lt;BR&gt;The sample 04_manual_conv demonstrates how to inherit the interface, use the template wrapper to create code convertors, and set convertors to Ogre::CodeConvManager manually.&lt;BR&gt;&lt;BR&gt;Moreover, like the demonstration which the sample 03_multilang shows, we&amp;nbsp; can usually let OGRE create code convertors automatically, not manually.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BIG style="FONT-WEIGHT: bold; COLOR: rgb(0,153,0)"&gt;Changes log:&lt;/BIG&gt;&lt;BR&gt;2005/07/25: commit this page.&lt;BR&gt;2005/07/30: split ogretest and update patch.&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: bold"&gt;&lt;SMALL&gt;Copyright 2004-2005 L.Y.C., Taiwan(Formosa).&lt;/SMALL&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/bastet/aggbug/12152.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Diviner</dc:creator><title>ogre的游戏状态插件（转自OGRE的WIKI）</title><link>http://blog.vckbase.com/bastet/archive/2005/09/16/12150.html</link><pubDate>Fri, 16 Sep 2005 00:33:00 GMT</pubDate><guid>http://blog.vckbase.com/bastet/archive/2005/09/16/12150.html</guid><wfw:comment>http://blog.vckbase.com/bastet/comments/12150.html</wfw:comment><comments>http://blog.vckbase.com/bastet/archive/2005/09/16/12150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/bastet/comments/commentRss/12150.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/bastet/services/trackbacks/12150.html</trackback:ping><description>&lt;H1 class=firstHeading&gt;Managing Game States with OGRE&lt;/H1&gt;
&lt;DIV id=bodyContent&gt;
&lt;H3 id=siteSub&gt;From Ogre Wiki&lt;/H3&gt;
&lt;DIV id=contentSub&gt;&lt;/DIV&gt;&lt;!-- start content --&gt;
&lt;P&gt;This article will describe a simple technique which will help you to manage game states in OGRE, using the default rendering loop based on frame listeners. This technique is heavily inspired by the one described in the article &lt;A class=external title=http://tonyandpaige.com/tutorials/game1.html href="http://tonyandpaige.com/tutorials/game1.html"&gt;Managing Game States in C++&lt;/A&gt;&lt;SPAN class=urlexpansion&gt; (&lt;I&gt;http://tonyandpaige.com/tutorials/game1.html&lt;/I&gt;)&lt;/SPAN&gt;. As I won't give many explanations about the mechanics of this technique, I invite you to read this article if you want a more thoroughful analysis of the system. &lt;/P&gt;
&lt;TABLE id=toc border=0&gt;
&lt;TBODY&gt;
&lt;TR id=toctitle&gt;
&lt;TD align=middle&gt;&lt;B&gt;Table of contents&lt;/B&gt;
&lt;SCRIPT type=text/javascript&gt;showTocToggle("show","hide")&lt;/SCRIPT&gt;
 &lt;SPAN class=toctoggle&gt;[&lt;A class=internal href="javascript:toggleToc()"&gt;&lt;SPAN id=showlink style="DISPLAY: none"&gt;show&lt;/SPAN&gt;&lt;SPAN id=hidelink&gt;hide&lt;/SPAN&gt;&lt;/A&gt;]&lt;/SPAN&gt; &lt;/TD&gt;&lt;/TR&gt;
&lt;TR id=tocinside&gt;
&lt;TD&gt;
&lt;DIV class=tocline&gt;&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE#The_GameState_class"&gt;1 The GameState class&lt;/A&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=tocline&gt;&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE#The_InputManager_class"&gt;2 The InputManager class&lt;/A&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=tocline&gt;&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE#The_GameManager_class"&gt;3 The GameManager class&lt;/A&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=tocline&gt;&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE#Game_states"&gt;4 Game states&lt;/A&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=tocline&gt;&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE#Gluing_it_all_together"&gt;5 Gluing it all together&lt;/A&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV class=tocline&gt;&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE#Conclusion"&gt;6 Conclusion&lt;/A&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;
&lt;DIV class=editsection style="FLOAT: right; MARGIN-LEFT: 5px"&gt;[&lt;A title="Managing Game States with OGRE" href="http://www.ogre3d.org/wiki/index.php?title=Managing_Game_States_with_OGRE&amp;amp;action=edit&amp;amp;section=1"&gt;edit&lt;/A&gt;]&lt;/DIV&gt;&lt;A name=The_GameState_class&gt;&lt;/A&gt;
&lt;H2&gt;The GameState class &lt;/H2&gt;
&lt;P&gt;First, you'll need to create the file &lt;B&gt;GameState.h&lt;/B&gt; and put it in your include or src directory, depending on how your source tree is structured. Here are the contents of this file&amp;nbsp;: &lt;/P&gt;&lt;PRE&gt;#ifndef GameState_H
#define GameState_H

#include &amp;lt;OGRE/Ogre.h&amp;gt;
 
#include "GameManager.h"

class GameState
{
public:
	virtual void enter() = 0;
	virtual void exit() = 0;

	virtual void pause() = 0;
	virtual void resume() = 0;

	virtual void keyClicked(Ogre::KeyEvent* e) = 0;
	virtual void keyPressed(Ogre::KeyEvent* e) = 0;
	virtual void keyReleased(Ogre::KeyEvent* e) = 0;
	virtual bool frameStarted(const Ogre::FrameEvent&amp;amp; evt) = 0;
	virtual bool frameEnded(const Ogre::FrameEvent&amp;amp; evt) = 0;

	void changeState(GameState* state) { GameManager::getSingletonPtr()-&amp;gt;changeState(state); }
	void pushState(GameState* state) { GameManager::getSingletonPtr()-&amp;gt;pushState(state); }
	void popState() { GameManager::getSingletonPtr()-&amp;gt;popState(); }
protected:
	GameState() { }
};

#endif&lt;/PRE&gt;
&lt;P&gt;This is a basic game state class, which you'll need to inherit from for all the game states you want to handle in your game. I'll give an example of such game states later. &lt;/P&gt;
&lt;DIV class=editsection style="FLOAT: right; MARGIN-LEFT: 5px"&gt;[&lt;A title="Managing Game States with OGRE" href="http://www.ogre3d.org/wiki/index.php?title=Managing_Game_States_with_OGRE&amp;amp;action=edit&amp;amp;section=2"&gt;edit&lt;/A&gt;]&lt;/DIV&gt;&lt;A name=The_InputManager_class&gt;&lt;/A&gt;
&lt;H2&gt;The InputManager class &lt;/H2&gt;
&lt;P&gt;The InputManager class, which is a &lt;A title=Singleton href="http://www.ogre3d.org/wiki/index.php/Singleton"&gt;singleton&lt;/A&gt;, will be the central point for input handling. Its role is to create an EventProcessor and expose an InputReader to the game states, which can be used for both buffered and unbuffered input. Unbuffered input will be used in the game itself and the buffered one will be use for states which should be treated as menus. More on that later when we come to the actual implementation of game states. &lt;/P&gt;
&lt;P&gt;Definition of the class in &lt;B&gt;InputManager.h&lt;/B&gt;&amp;nbsp;: &lt;/P&gt;&lt;PRE&gt;#ifndef InputManager_H
#define InputManager_H

#include &amp;lt;OGRE/OgreSingleton.h&amp;gt;
#include &amp;lt;OGRE/OgreInput.h&amp;gt;

class InputManager : public Ogre::Singleton&amp;lt;InputManager&amp;gt;
{
public:
	InputManager(Ogre::RenderWindow* rwindow);
	virtual ~InputManager();
	inline Ogre::InputReader* getInputDevice() const { return mInputDevice; }
	inline Ogre::EventProcessor* getEventProcessor() const { return mEventProcessor; }
	static InputManager&amp;amp; getSingleton(void);
	static InputManager* getSingletonPtr(void);
private:
	Ogre::EventProcessor* mEventProcessor;
	Ogre::InputReader* mInputDevice;
};

#endif&lt;/PRE&gt;
&lt;P&gt;Implementation of the class in &lt;B&gt;InputManager.cpp&lt;/B&gt;&amp;nbsp;: &lt;/P&gt;&lt;PRE&gt;#include &amp;lt;OGRE/OgreEventProcessor.h&amp;gt;

#include "InputManager.h"

template&amp;lt;&amp;gt; InputManager* Ogre::Singleton&amp;lt;InputManager&amp;gt;::ms_Singleton = 0;

InputManager::InputManager(Ogre::RenderWindow* window)
{
	mEventProcessor = new Ogre::EventProcessor();
	mEventProcessor-&amp;gt;initialise(window);
	mEventProcessor-&amp;gt;startProcessingEvents();
	mInputDevice = mEventProcessor-&amp;gt;getInputReader();
}

InputManager::~InputManager()
{
	if (mEventProcessor)
		delete mEventProcessor;
}

InputManager* InputManager::getSingletonPtr(void)
{
	return ms_Singleton;
}

InputManager&amp;amp; InputManager::getSingleton(void)
{
	assert(ms_Singleton);
	return *ms_Singleton;
}&lt;/PRE&gt;
&lt;DIV class=editsection style="FLOAT: right; MARGIN-LEFT: 5px"&gt;[&lt;A title="Managing Game States with OGRE" href="http://www.ogre3d.org/wiki/index.php?title=Managing_Game_States_with_OGRE&amp;amp;action=edit&amp;amp;section=3"&gt;edit&lt;/A&gt;]&lt;/DIV&gt;&lt;A name=The_GameManager_class&gt;&lt;/A&gt;
&lt;H2&gt;The GameManager class &lt;/H2&gt;
&lt;P&gt;You'll need a game state manager to handle the game states and switch from one state to the other. This class, which is also a &lt;A title=Singleton href="http://www.ogre3d.org/wiki/index.php/Singleton"&gt;singleton&lt;/A&gt;, creates an InputManager and registers its EventProcessor to handle both buffered and unbuffered input. Here is the source code for the header file, named &lt;B&gt;GameManager.h&lt;/B&gt;&amp;nbsp;: &lt;/P&gt;&lt;PRE&gt;#ifndef GameManager_H
#define GameManager_H

#include &amp;lt;vector&amp;gt;
#include &amp;lt;OGRE/Ogre.h&amp;gt;
#include &amp;lt;OGRE/OgreEventListeners.h&amp;gt;
#include &amp;lt;OGRE/OgreSingleton.h&amp;gt;

#include "InputManager.h"

class GameState;

class GameManager : public Ogre::FrameListener, public Ogre::KeyListener,
	public Ogre::Singleton&amp;lt;GameManager&amp;gt;
{
public:
	GameManager();
	~GameManager();
	void start(GameState* state);
	void changeState(GameState* state);
	void pushState(GameState* state);
	void popState();
	static GameManager&amp;amp; getSingleton(void);
	static GameManager* getSingletonPtr(void);
protected:
	Ogre::Root* mRoot;
	Ogre::RenderWindow* mRenderWindow;
	InputManager* mInputManager;

	void setupResources(void);
	bool configure(void);

	void keyClicked(Ogre::KeyEvent* e);
	void keyPressed(Ogre::KeyEvent* e);
	void keyReleased(Ogre::KeyEvent* e);
	bool frameStarted(const Ogre::FrameEvent&amp;amp; evt);
	bool frameEnded(const Ogre::FrameEvent&amp;amp; evt);
private:
	std::vector&amp;lt;GameState*&amp;gt; mStates;
};

#endif&lt;/PRE&gt;
&lt;P&gt;And here is the source code for the main source file, named &lt;B&gt;GameManager.cpp&lt;/B&gt;&amp;nbsp;: &lt;/P&gt;&lt;PRE&gt;#include &amp;lt;OGRE/Ogre.h&amp;gt;

#include "GameManager.h"
#include "InputManager.h"
#include "GameState.h"

using namespace Ogre;

template&amp;lt;&amp;gt; GameManager* Singleton&amp;lt;GameManager&amp;gt;::ms_Singleton = 0;

GameManager::GameManager()
{
	mRoot = 0;
	mInputManager = 0;
}

GameManager::~GameManager()
{
	// clean up all the states
	while (!mStates.empty()) {
		mStates.back()-&amp;gt;exit();
		mStates.pop_back();
	}

	if (mInputManager)
		delete mInputManager;

	if (mRoot)
		delete mRoot;
}

void GameManager::start(GameState* state)
{
	mRoot = new Root();

	setupResources();

	if (!configure()) return;

	mRoot-&amp;gt;addFrameListener(this);

	mInputManager = new InputManager(mRoot-&amp;gt;getAutoCreatedWindow());
	mInputManager-&amp;gt;getEventProcessor()-&amp;gt;addKeyListener(this);

	changeState(state);

	mRoot-&amp;gt;startRendering();
}

void GameManager::changeState(GameState* state)
{
	// cleanup the current state
	if ( !mStates.empty() ) {
		mStates.back()-&amp;gt;exit();
		mStates.pop_back();
	}

	// store and init the new state
	mStates.push_back(state);
	mStates.back()-&amp;gt;enter();
}

void GameManager::pushState(GameState* state)
{
	// pause current state
	if ( !mStates.empty() ) {
		mStates.back()-&amp;gt;pause();
	}

	// store and init the new state
	mStates.push_back(state);
	mStates.back()-&amp;gt;enter();
}

void GameManager::popState()
{
	// cleanup the current state
	if ( !mStates.empty() ) {
		mStates.back()-&amp;gt;exit();
		mStates.pop_back();
	}

	// resume previous state
	if ( !mStates.empty() ) {
		mStates.back()-&amp;gt;resume();
	}
}

void GameManager::setupResources(void)
{
	// load resource paths from config file
	ConfigFile cf;
	cf.load("resources.cfg");

	// go through all settings in the file
	ConfigFile::SectionIterator seci = cf.getSectionIterator();

	String secName, typeName, archName;
	while (seci.hasMoreElements())
	{
		secName = seci.peekNextKey();
		ConfigFile::SettingsMultiMap *settings = seci.getNext();
		ConfigFile::SettingsMultiMap::iterator i;
		for (i = settings-&amp;gt;begin() ; i != settings-&amp;gt;end() ; ++i)
		{
			typeName = i-&amp;gt;first;
			archName = i-&amp;gt;second;
			ResourceGroupManager::getSingleton().addResourceLocation(
				archName, typeName, secName);
		}
	}
}

bool GameManager::configure(void)
{
	// load config settings from ogre.cfg
	if (!mRoot-&amp;gt;restoreConfig())
	{
		// if there is no config file, show the configuration dialog
		if (!mRoot-&amp;gt;showConfigDialog())
		{
			return false;
		}
	}

	// initialise and create a default rendering window
	mRenderWindow = mRoot-&amp;gt;initialise(true);

	ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

	return true;
}

void GameManager::keyClicked(KeyEvent* e)
{
	// call keyClicked of current state
	mStates.back()-&amp;gt;keyClicked(e);
}

void GameManager::keyPressed(KeyEvent* e)
{
	// call keyPressed of current state
	mStates.back()-&amp;gt;keyPressed(e);
}

void GameManager::keyReleased(KeyEvent* e)
{
	// call keyReleased of current state
	mStates.back()-&amp;gt;keyReleased(e);
}

bool GameManager::frameStarted(const FrameEvent&amp;amp; evt)
{
	// call frameStarted of current state
	return mStates.back()-&amp;gt;frameStarted(evt);
}

bool GameManager::frameEnded(const FrameEvent&amp;amp; evt)
{
	// call frameEnded of current state
	return mStates.back()-&amp;gt;frameEnded(evt);
}

GameManager* GameManager::getSingletonPtr(void)
{
	return ms_Singleton;
}

GameManager&amp;amp; GameManager::getSingleton(void)
{  
	assert(ms_Singleton);
	return *ms_Singleton;
}&lt;/PRE&gt;
&lt;P&gt;Note that you normally won't need to modify the &lt;B&gt;GameState.h&lt;/B&gt;, &lt;B&gt;GameManager.h&lt;/B&gt;, &lt;B&gt;GameManager.cpp&lt;/B&gt;, &lt;B&gt;InputManager.h&lt;/B&gt; and &lt;B&gt;InputManager.cpp&lt;/B&gt; files as all your code will usually reside in the classes derived from GameState. &lt;/P&gt;
&lt;DIV class=editsection style="FLOAT: right; MARGIN-LEFT: 5px"&gt;[&lt;A title="Managing Game States with OGRE" href="http://www.ogre3d.org/wiki/index.php?title=Managing_Game_States_with_OGRE&amp;amp;action=edit&amp;amp;section=4"&gt;edit&lt;/A&gt;]&lt;/DIV&gt;&lt;A name=Game_states&gt;&lt;/A&gt;
&lt;H2&gt;Game states &lt;/H2&gt;
&lt;P&gt;I'll define three game states (&lt;B&gt;Intro&lt;/B&gt;, &lt;B&gt;Play&lt;/B&gt; and &lt;B&gt;Pause&lt;/B&gt;) to show how this technique can be used, just like in the original source code for the article. Here is how these states are related to each other&amp;nbsp;: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;in the &lt;B&gt;Intro&lt;/B&gt; state, &amp;lt;SPACE&amp;gt; will lead to the &lt;B&gt;Play&lt;/B&gt; state, &amp;lt;ESC&amp;gt; will terminate the application&amp;nbsp;; 
&lt;LI&gt;in the &lt;B&gt;Play&lt;/B&gt; state, &amp;lt;ESC&amp;gt; will go back to the &lt;B&gt;Intro&lt;/B&gt; state and &amp;lt;P&amp;gt; will go into the &lt;B&gt;Pause&lt;/B&gt; state&amp;nbsp;; 
&lt;LI&gt;in the &lt;B&gt;Pause&lt;/B&gt; state, another key press on &amp;lt;P&amp;gt; will return to the &lt;B&gt;Play&lt;/B&gt; state. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;There won't be a lot of things happening in each state, I'll only change the background color so you know in which state you are (red for &lt;B&gt;Intro&lt;/B&gt;, blue for &lt;B&gt;Play&lt;/B&gt; and green for &lt;B&gt;Pause&lt;/B&gt;). You can easily extend the code from this base, adding support for scene nodes, entities, overlays, etc. The code should be quite self-explanatory, if in doubt, read the article for which I gave a link in the introduction to clear things up. &lt;/P&gt;
&lt;P&gt;Here is the source code for the &lt;B&gt;Intro&lt;/B&gt; state&amp;nbsp;: &lt;/P&gt;
&lt;P&gt;&lt;B&gt;IntroState.h&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#ifndef IntroState_H
#define IntroState_H

#include &amp;lt;OGRE/Ogre.h&amp;gt;

#include "GameState.h"

class IntroState : public GameState
{
public:
	void enter();
	void exit();

	void pause();
	void resume();

	void keyClicked(Ogre::KeyEvent* e);
	void keyPressed(Ogre::KeyEvent* e);
	void keyReleased(Ogre::KeyEvent* e);
	bool frameStarted(const Ogre::FrameEvent&amp;amp; evt);
	bool frameEnded(const Ogre::FrameEvent&amp;amp; evt);

	static IntroState* getInstance() { return &amp;amp;mIntroState; }
protected:
	IntroState() { }

	Ogre::Root *mRoot;
	Ogre::SceneManager* mSceneMgr;
	Ogre::Viewport* mViewport;
	Ogre::InputReader* mInputDevice;
	Ogre::Camera* mCamera;
	bool mExitGame;
private:
	static IntroState mIntroState;
};

#endif&lt;/PRE&gt;
&lt;P&gt;&lt;B&gt;IntroState.cpp&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#include &amp;lt;OGRE/Ogre.h&amp;gt;
#include &amp;lt;OGRE/OgreKeyEvent.h&amp;gt;

#include "IntroState.h"
#include "PlayState.h"

using namespace Ogre;

IntroState IntroState::mIntroState;

void IntroState::enter()
{
	mInputDevice = InputManager::getSingletonPtr()-&amp;gt;getInputDevice();
	mRoot = Root::getSingletonPtr();

	mSceneMgr = mRoot-&amp;gt;getSceneManager(ST_GENERIC);
	mCamera = mSceneMgr-&amp;gt;createCamera("IntroCamera");
	mViewport = mRoot-&amp;gt;getAutoCreatedWindow()-&amp;gt;addViewport(mCamera);
	mViewport-&amp;gt;setBackgroundColour(ColourValue(1.0, 0.0, 0.0));

	mExitGame = false;
}

void IntroState::exit()
{
	mSceneMgr-&amp;gt;clearScene();
	mSceneMgr-&amp;gt;removeAllCameras();
	mRoot-&amp;gt;getAutoCreatedWindow()-&amp;gt;removeAllViewports();
}

void IntroState::pause()
{
}

void IntroState::resume()
{
}

void IntroState::keyClicked(KeyEvent* e)
{
}

void IntroState::keyPressed(KeyEvent* e)
{
	if (e-&amp;gt;getKey() == KC_SPACE)
	{
		changeState(PlayState::getInstance());
	}

	if (e-&amp;gt;getKey() == KC_ESCAPE)
	{
		mExitGame = true;
	}
}

void IntroState::keyReleased(KeyEvent* e)
{
}

bool IntroState::frameStarted(const FrameEvent&amp;amp; evt)
{
	return true;
}

bool IntroState::frameEnded(const FrameEvent&amp;amp; evt)
{
	if (mExitGame)
		return false;

	return true;
}&lt;/PRE&gt;
&lt;P&gt;Here is the source code for the &lt;B&gt;Play&lt;/B&gt; state&amp;nbsp;: &lt;/P&gt;
&lt;P&gt;&lt;B&gt;PlayState.h&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#ifndef PlayState_H
#define PlayState_H

#include &amp;lt;OGRE/Ogre.h&amp;gt;

#include "GameState.h"

class PlayState : public GameState
{
public:
	void enter();
	void exit();

	void pause();
	void resume();

	void keyClicked(Ogre::KeyEvent* e);
	void keyPressed(Ogre::KeyEvent* e);
	void keyReleased(Ogre::KeyEvent* e);
	bool frameStarted(const Ogre::FrameEvent&amp;amp; evt);
	bool frameEnded(const Ogre::FrameEvent&amp;amp; evt);

	static PlayState* getInstance() { return &amp;amp;mPlayState; }
protected:
	PlayState() { }

	Ogre::Root *mRoot;
	Ogre::SceneManager* mSceneMgr;
	Ogre::Viewport* mViewport;
	Ogre::InputReader* mInputDevice;
	Ogre::Camera* mCamera;
private:
	static PlayState mPlayState;
};

#endif&lt;/PRE&gt;
&lt;P&gt;&lt;B&gt;PlayState.cpp&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#include &amp;lt;OGRE/Ogre.h&amp;gt;
#include &amp;lt;OGRE/OgreKeyEvent.h&amp;gt;

#include "PlayState.h"
#include "IntroState.h"
#include "PauseState.h"

using namespace Ogre;

PlayState PlayState::mPlayState;

void PlayState::enter()
{
	mInputDevice = InputManager::getSingletonPtr()-&amp;gt;getInputDevice();
	mRoot = Root::getSingletonPtr();

	mSceneMgr = mRoot-&amp;gt;getSceneManager(ST_GENERIC);
	mCamera = mSceneMgr-&amp;gt;createCamera("IntroCamera");
	mViewport = mRoot-&amp;gt;getAutoCreatedWindow()-&amp;gt;addViewport(mCamera);
	mViewport-&amp;gt;setBackgroundColour(ColourValue(0.0, 0.0, 1.0));
}

void PlayState::exit()
{
	mSceneMgr-&amp;gt;clearScene();
	mSceneMgr-&amp;gt;removeAllCameras();
	mRoot-&amp;gt;getAutoCreatedWindow()-&amp;gt;removeAllViewports();
}

void PlayState::pause()
{
}

void PlayState::resume()
{
	mViewport-&amp;gt;setBackgroundColour(ColourValue(0.0, 0.0, 1.0));
}

void PlayState::keyClicked(KeyEvent* e)
{
}

void PlayState::keyPressed(KeyEvent* e)
{
	if (e-&amp;gt;getKey() == KC_P)
	{
		pushState(PauseState::getInstance());
	}

	if (e-&amp;gt;getKey() == KC_ESCAPE)
	{
		changeState(IntroState::getInstance());
	}
}

void PlayState::keyReleased(KeyEvent* e)
{
}

bool PlayState::frameStarted(const FrameEvent&amp;amp; evt)
{
	return true;
}

bool PlayState::frameEnded(const FrameEvent&amp;amp; evt)
{
	return true;
}&lt;/PRE&gt;
&lt;P&gt;Here is the source code for the &lt;B&gt;Pause&lt;/B&gt; state&amp;nbsp;: &lt;/P&gt;
&lt;P&gt;&lt;B&gt;PauseState.h&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#ifndef PauseState_H
#define PauseState_H

#include &amp;lt;OGRE/Ogre.h&amp;gt;

#include "GameState.h"

class PauseState : public GameState
{
public:
	void enter();
	void exit();

	void pause();
	void resume();

	void keyClicked(Ogre::KeyEvent* e);
	void keyPressed(Ogre::KeyEvent* e);
	void keyReleased(Ogre::KeyEvent* e);
	bool frameStarted(const Ogre::FrameEvent&amp;amp; evt);
	bool frameEnded(const Ogre::FrameEvent&amp;amp; evt);

	static PauseState* getInstance() { return &amp;amp;mPauseState; }
protected:
	PauseState() { }

	Ogre::Root *mRoot;
	Ogre::SceneManager* mSceneMgr;
	Ogre::Viewport* mViewport;
	Ogre::InputReader* mInputDevice;
	Ogre::Camera* mCamera;
private:
	static PauseState mPauseState;
};

#endif&lt;/PRE&gt;
&lt;P&gt;&lt;B&gt;PauseState.cpp&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#include &amp;lt;OGRE/Ogre.h&amp;gt;
#include &amp;lt;OGRE/OgreKeyEvent.h&amp;gt;

#include "PauseState.h"
#include "PlayState.h"

using namespace Ogre;

PauseState PauseState::mPauseState;

void PauseState::enter()
{
	mInputDevice = InputManager::getSingletonPtr()-&amp;gt;getInputDevice();
	mRoot = Root::getSingletonPtr();

	mViewport = mRoot-&amp;gt;getAutoCreatedWindow()-&amp;gt;getViewport(0);
	mViewport-&amp;gt;setBackgroundColour(ColourValue(0.0, 1.0, 0.0));
}

void PauseState::exit()
{
}

void PauseState::pause()
{
}

void PauseState::resume()
{
}

void PauseState::keyClicked(KeyEvent* e)
{
}

void PauseState::keyPressed(KeyEvent* e)
{
	if (e-&amp;gt;getKey() == KC_P)
	{
		popState();
	}
}

void PauseState::keyReleased(KeyEvent* e)
{
}

bool PauseState::frameStarted(const FrameEvent&amp;amp; evt)
{
	return true;
}

bool PauseState::frameEnded(const FrameEvent&amp;amp; evt)
{
	return true;
}&lt;/PRE&gt;
&lt;P&gt;Note that all the input code related to buffered input should be in the &lt;B&gt;keyClicked&lt;/B&gt;, &lt;B&gt;keyPressed&lt;/B&gt; and &lt;B&gt;keyReleased&lt;/B&gt; functions, using the &lt;B&gt;e-&amp;gt;getKey()&lt;/B&gt; call as shown in the sources. This is needed for everything related to menus or GUI. &lt;/P&gt;
&lt;P&gt;Input management for the game itself (unbuffered input) should be handled in the &lt;B&gt;frameStarted&lt;/B&gt; and &lt;B&gt;frameEnded&lt;/B&gt; functions, using the &lt;B&gt;mInputDevice-&amp;gt;isKeyDown()&lt;/B&gt; call like this&amp;nbsp;: &lt;/P&gt;&lt;PRE&gt;if (mInputDevice-&amp;gt;isKeyDown(KC_RIGHT)) x++;
if (mInputDevice-&amp;gt;isKeyDown(KC_LEFT)) x--;
if (mInputDevice-&amp;gt;isKeyDown(KC_UP)) y++;
if (mInputDevice-&amp;gt;isKeyDown(KC_DOWN)) y--;&lt;/PRE&gt;
&lt;P&gt;This is what you will use to control a character on the screen or to shoot a bullet for example. &lt;/P&gt;
&lt;DIV class=editsection style="FLOAT: right; MARGIN-LEFT: 5px"&gt;[&lt;A title="Managing Game States with OGRE" href="http://www.ogre3d.org/wiki/index.php?title=Managing_Game_States_with_OGRE&amp;amp;action=edit&amp;amp;section=5"&gt;edit&lt;/A&gt;]&lt;/DIV&gt;&lt;A name=Gluing_it_all_together&gt;&lt;/A&gt;
&lt;H2&gt;Gluing it all together &lt;/H2&gt;
&lt;P&gt;With all this files, we need a starting point for the application, it will be the &lt;B&gt;Main.cpp&lt;/B&gt; file. It is very similar to the ones found in the OGRE samples. In this file, you'll only need to instantiate the game manager and start it in the first state. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Main.cpp&lt;/B&gt; &lt;/P&gt;&lt;PRE&gt;#include &amp;lt;OGRE/Ogre.h&amp;gt;

#include "GameManager.h"
#include "IntroState.h"

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#define WIN32_LEAN_AND_MEAN
#include "windows.h"

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
#else
int main(int argc, char **argv)
#endif
{
	GameManager* game = new GameManager();

	try
	{
		// initialize the game and switch to the first state
		game-&amp;gt;start(IntroState::getInstance());
	}
	catch (Ogre::Exception&amp;amp; e)
	{
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
		MessageBox(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
#else
		std::cerr &amp;lt;&amp;lt; "An exception has occured: " &amp;lt;&amp;lt; e.getFullDescription();
#endif
	}

	delete game;

	return 0;
}&lt;/PRE&gt;
&lt;DIV class=editsection style="FLOAT: right; MARGIN-LEFT: 5px"&gt;[&lt;A title="Managing Game States with OGRE" href="http://www.ogre3d.org/wiki/index.php?title=Managing_Game_States_with_OGRE&amp;amp;action=edit&amp;amp;section=6"&gt;edit&lt;/A&gt;]&lt;/DIV&gt;&lt;A name=Conclusion&gt;&lt;/A&gt;
&lt;H2&gt;Conclusion &lt;/H2&gt;
&lt;P&gt;This ends this short tutorial which described a way to handle game states within an OGRE application. I hope it has been clear and that it will be useful for someone. For now it does only handle keyboard as an input device, I'll maybe add mouse and joystick support later if it fits well in this architecture. I am aware that this may not be the best way to handle game states within an application, and I'm open to any critics or suggestions about the way it was implemented. &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class=external title=http://frederic.lopez.free.fr/ogre/stateman-0.0.5.tar.gz href="http://frederic.lopez.free.fr/ogre/stateman-0.0.5.tar.gz"&gt;stateman-0.0.5.tar.gz&lt;/A&gt;&lt;SPAN class=urlexpansion&gt; (&lt;I&gt;http://frederic.lopez.free.fr/ogre/stateman-0.0.5.tar.gz&lt;/I&gt;)&lt;/SPAN&gt; - Source and autoconf/automake files for Linux (compatible with OGRE 1.0.4) 
&lt;LI&gt;&lt;A class=external title=http://frederic.lopez.free.fr/ogre/statemanVC7.zip href="http://frederic.lopez.free.fr/ogre/statemanVC7.zip"&gt;statemanVC7.zip&lt;/A&gt;&lt;SPAN class=urlexpansion&gt; (&lt;I&gt;http://frederic.lopez.free.fr/ogre/statemanVC7.zip&lt;/I&gt;)&lt;/SPAN&gt; - Source and project file for Visual C++ 7 (old version, deprecated) &lt;/LI&gt;&lt;/UL&gt;&lt;!-- Saved in parser cache with key ogre:pcache:idhash:1011-1!1!0!1!0!1!0!!en and timestamp 20050915055751 --&gt;
&lt;DIV class=printfooter&gt;Retrieved from "&lt;A href="http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE"&gt;http://www.ogre3d.org/wiki/index.php/Managing_Game_States_with_OGRE&lt;/A&gt;"&lt;/DIV&gt;&lt;!-- end content --&gt;&lt;/DIV&gt;&lt;img src ="http://blog.vckbase.com/bastet/aggbug/12150.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Diviner</dc:creator><title>脚本语言一览(ZT)</title><link>http://blog.vckbase.com/bastet/archive/2005/04/28/5034.html</link><pubDate>Wed, 27 Apr 2005 23:45:00 GMT</pubDate><guid>http://blog.vckbase.com/bastet/archive/2005/04/28/5034.html</guid><wfw:comment>http://blog.vckbase.com/bastet/comments/5034.html</wfw:comment><comments>http://blog.vckbase.com/bastet/archive/2005/04/28/5034.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/bastet/comments/commentRss/5034.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/bastet/services/trackbacks/5034.html</trackback:ping><description>&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;Ruby&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Yukihiro Matsumoto&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: Ruby License&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
Ruby is an interpreted scripting language for quick and easy object-oriented programming. It has many features to process text files and to do system management tasks (as in Perl). It is simple, straight-forward, extensible, and portable.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://www.ruby-lang.org/en/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://www.ruby-lang.org/en/&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=65079"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;Python&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Multiple&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: Python&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
Python is an interpreted, interactive, object-oriented programming language. It is often compared to Tcl, Perl, Scheme or Java.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://python.org/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://python.org/&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64893"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;Squirrel Language&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Alberto Demichelis&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: zlib&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
Squirrel is a high level imperative/OO programming language, designed to be a powerful scripting tool that fits in the size, memory bandwidth, and real-time requirements of applications like games.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://squirrel.sourceforge.net/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://squirrel.sourceforge.net/&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64846"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;GYS Project&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Govoruschenko Yuri Y.&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: LGPL&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
A library for developing interpreters of scripting languages.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://gys.sourceforge.net/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://gys.sourceforge.net&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64818"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;AngelScript&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Andreas J鰊sson&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: zlib&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
The AngelCode Scripting Library, or AngelScript as it is also known, is an extremely flexible cross-platform scripting library designed to allow applications to extend their functionality through external scripts. It has been designed from the beginning to be an easy to use component, both for the application programmer and the script writer.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://www.angelcode.com/angelscript/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://www.angelcode.com/angelscript/&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64800"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;The Small Language&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: CompuPhase&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: zlib&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
Small is a simple, typeless, 32-bit extension language with a C-like syntax. A Small "source" program is compiled to a binary file for optimal execution speed. The Small compiler outputs P-code (or bytecode) that subsequently runs on an abstract machine. Execution speed, stability, simplicity and a small footprint were essential design criteria for both the language and the abstract machine.&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://www.compuphase.com/small.htm"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://www.compuphase.com/small.htm&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64798"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;Lua&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Lua Team at Tecgraf&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: zlib/MIT&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
Lua is a powerful light-weight programming language designed for extending applications. Lua is also frequently used as a general-purpose, stand-alone language. Lua is free software. Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics. &lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://www.lua.org/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://www.lua.org&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64767"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;BR&gt;&lt;BR&gt;
&lt;CENTER&gt;
&lt;TABLE cellSpacing=0 cellPadding=13 width="100%" bgColor=#161a25 border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=2&gt;&lt;B&gt;Simkin Language&lt;/B&gt;&lt;/FONT&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;Author: Simon Whiteside&lt;/B&gt;&lt;/FONT&gt;, &lt;FONT face=Verdana,Helvetica size=1&gt;&lt;B&gt;License: Open Source&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;
&lt;HR&gt;
Simkin is a high-level lightweight embeddable scripting language which works with Java or C++ and XML. Simkin enables you to hand over control of part or all of your application to your users. &lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 width="100%" border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;&lt;B&gt;Detailed information:&lt;/B&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;A class=menulink href="http://www.simkin.co.uk/"&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt;http://www.simkin.co.uk&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;
&lt;TD align=right&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" face=Verdana,Helvetica color=#000000 size=2&gt;&lt;B&gt;&lt;A class=menulink href="http://www.flipcode.com/cgi-bin/fcarticles.cgi?show=64766"&gt;0 Comments&lt;/A&gt;&lt;/B&gt;&lt;/FONT&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#000000&gt; &lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff"&gt;//这个语言我没仔细看过，不过好像还支持symbian的手机&lt;/FONT&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/CENTER&gt;&lt;img src ="http://blog.vckbase.com/bastet/aggbug/5034.html" width = "1" height = "1" /&gt;</description></item></channel></rss>