﻿<?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>C++博客-编程 &amp; 感动 寰子的完美生活 - Coding &amp; feeling HuanZi's perfect life-随笔分类-游戏程序设计</title><link>http://www.cppblog.com/ogsxer/category/7055.html</link><description>Beautiful code knitting my beautiful life</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 12:21:35 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 12:21:35 GMT</pubDate><ttl>60</ttl><item><title>将GUI结合到游戏引擎中</title><link>http://www.cppblog.com/ogsxer/archive/2008/05/13/49743.html</link><dc:creator>寰子</dc:creator><author>寰子</author><pubDate>Tue, 13 May 2008 11:53:00 GMT</pubDate><guid>http://www.cppblog.com/ogsxer/archive/2008/05/13/49743.html</guid><wfw:comment>http://www.cppblog.com/ogsxer/comments/49743.html</wfw:comment><comments>http://www.cppblog.com/ogsxer/archive/2008/05/13/49743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ogsxer/comments/commentRss/49743.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ogsxer/services/trackbacks/49743.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>用了很长时间去写GUI，最近终于完成了一套我比较满意的GUI系统。那么下一步面临的问题就是如何把GUI结合到游戏中去。因为网络游戏客户端通常变数很大，有可能在一次更新</p>
<p>中就有数个界面的修改。那么GUI系统和游戏引擎系统的结合灵活性要求则更高。如果把每一个界面写死，通常会降低一个游戏引擎的生命指数。那么面对这个问题，我想了以下办</p>
<p>法去解决它。</p>
<p>第一步：在GUI系统中增加两个方法</p>
<p>bool SetEventScript(const char* FileName);</p>
<p>const char* GetEventScript();</p>
<p>bool GetEventScriptAlter();</p>
<p>并且增加一个私有数据成员：</p>
<p>m_EventScript;&nbsp;&nbsp;&nbsp;//GUI事件脚本<br>m_EventScriptAlter;&nbsp;&nbsp;//GUI事件脚本是否被重新载入</p>
<p>当调用SetEventScript时，根据文件名打开脚本文件将脚本内容读入m_EventScript，并且将m_EventScriptAlter设置为true；当需要取得脚本内容时，使用GetEventScript取得，</p>
<p>取得后将会把m_EventScriptAlter设置为false。</p>
<p>第二步：建立游戏系统引擎的运行机制</p>
<p><br>我的运行机制是这样的，游戏开始时，使用游戏引擎类Sys_Init(配置文件名称)方法，读入第一个配置文件的内容，配置文件的名字是写在程序里的，如果文件名被修改或者文件</p>
<p>丢失，将无法开始游戏。如果程序检测到文件无法打开，就会终止游戏程序。</p>
<p>当程序打开时，游戏引擎类的Init方法会利用xolConfig从中取出一些必要的数据，比如窗口的宽高，是否全屏游戏，还有最重要的，游戏第一个界面的构造配置文件脚本的名称。</p>
<p>例如，配置文件内容如下：</p>
<p>&lt;GameEngine&gt;<br>&nbsp;ScreenWidth=640;<br>&nbsp;ScreenHeight=480;<br>&nbsp;GUI=Source/GUI/Main.txt;<br>&lt;/GameEngine&gt;</p>
<p>那么，它制定了游戏窗口宽、高以及第一个界面的构造脚本的路径，Sys_Init方法读出这段脚本后，会调用其GUI成员的LoadxConfig方法，将GUI的值传递给LoadxConfig。而</p>
<p>LoadxConfig载入的脚本，就是这第一个界面的配置脚本了，比如以上制定的文件Main.txt的内容是：</p>
<p><br>&lt;#EventScript&gt;<br>&nbsp;Name=#EventScript;<br>&nbsp;Value=Source/GUI/MainScript.txt;<br>&lt;/#EventScript&gt;<br>&lt;Back&gt;<br>&nbsp;Name=Back;<br>&nbsp;Type=5;<br>&nbsp;X=1;<br>&nbsp;Y=1;<br>&nbsp;WID=640;<br>&nbsp;HEI=480;<br>&nbsp;TexturePath=Source/xy0004.bmp;<br>&lt;/Back&gt;</p>
<p>那么说明了，这组界面的事件脚本是：Source/GUI/MainScript.txt;那么GUI管理类会将它的内容调用SetEventScript读入到m_EventScript中供游戏引擎使用。<br>创建一个名为Back的GUI，类型是5（这个类型表示它是一个什么样的GUI，5=图片），它的位置是X1，Y1，宽高分别是640,480，它的图片路径是Source/xy0004.bmp。这样，程序就</p>
<p>会根据它的内容创建出一个UI界面。</p>
<p>游戏引擎中将有一个AngelScript的脚本解释器：m_ScriptEngine;</p>
<p>在游戏引擎的Update时，会调用GUI系统的GetEventScriptAlter方法检测脚本是否被重新载入，如果脚本重新载入，则执行以下代码：<br>r = m_ScriptEngine-&gt;AddScriptSection("GUIScript", "Game", m_GUI.GetEventScript(), strlen(m_GUI.GetEventScript), 0);</p>
<p>当发现GUI的LastEvent有事件时，根据GUI名字调用其事件相对的脚本中的函数。<br>比如，Button发生了MouseClick，就调用Button_Click。</p>
<p>好了，如上一来，游戏引擎和脚本系统就完美的结合到了一起。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/ogsxer/aggbug/49743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ogsxer/" target="_blank">寰子</a> 2008-05-13 19:53 <a href="http://www.cppblog.com/ogsxer/archive/2008/05/13/49743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>