|
|
范例程序,可以在
http://bbs.gameres.com/showthread.asp?threadid=108343
找到下载。
用脚本来实现与游戏界面的对话可能有这样的好处
游戏界面格局以及样式可以随意定制,无需重新编译程序。用户也可以据次编写自己全新且与众不同的游戏界面样式。时下很多游戏均可以自定制游戏界面。
不单单是为了用户方便,将繁杂多变放在程序里面,工作量也是非常庞大的。
将界面的控制功能从主程序代码中剥离出来,轻松自己,方便大家。
1、设计好的用户界面类以及管理方式。
DX8.0后我没有在使用过,DX9.0自带了UI,这就节约了95%的工作。将那些UI类继承过来,然后进入第2步。
所有的UI都可以称之为游戏窗口,按钮也好,输入框也罢都是游戏窗口,其消息相应,控制方法的都是一样的。唯一不同的就是这些窗口需要自己编码来画。
Class guiObject;
Class guiWindow:public guiObject
Class guiButton:public guiWindow
Class guiCheckButton:public guiButton
Class guiRadioButton:public guiButton
......
介绍下 guiWindow的轮廓
class guiObject
{
protected:
uint32 m_dwType;
uint32 m_dwSubType;
uint32 m_dwId;
};
Class guiWindow:public guiObject
{
protected:
guiWindow* m_pParentWnd;//父窗口
map<uint32, guiObject*>m_ChildMap;//子框口
int x,y,width,height;//窗口位置
......
.....和window类差不多了,看着差不多会用到的直接抄就可以了
virtual int32 InitDeviceObjects(){ return 0L; }//初始化3d设备
virtual int32 DeleteDeviceObjects(){ return 0L; }
virtual void FrameMove(float fTime);
virtual void Render2D(){}
virtual void Render3D(){}//带有3D背景的窗口
virtual void OnMouseEvent(script*){};//从脚本代入的所有鼠标消息
virtual void OnCharEvent(script*){};//从脚本代入的所有键盘消息
virtual void OnSocketEvent(script*){};//从脚本代入的所有网络消息
virtula void RegestToScript(){};//向脚本注册游戏中想为脚本提供调用的类或者函数或者数据。可以根据需要注册所有,或者注册该脚本需要使用的,或者什么都不注册。
static bool OnLoad(xmlFileName);//从配置文件中读取所有相关该窗口的定义,例如窗口类型,位置,大小尺寸,贴图使用等等,以及注册该窗口可以接收哪些控制消息。
}
其它类也都差不多,只是窗口画法,对消息相应的方式不同而已,亦或者多了一些数据类型。
2、用配置文件建立游戏界面
Interface配置文件可以用ini或者txt来定制,或者干脆读取VC的*.rc文件(需要稍微添加几个新的定义)。差不多就是如下的内容,只是做好配置文件的解析不同罢了
<?xml version="1.0" encoding="UTF-8"?>
<Ui>
<!-- 窗口的位置,表现方式 -->
<winframe id="TEST" title="hello" x="0" y="0" w="240" h="260" point="center">
<!-- 窗口使用边界框,贴图以及颜色 -->
<Border texture="border.dds" r="1.0" g="1.0" b="0.35" a="1.0" w="232" h="252" />
</winframe>
<!-- 该窗口的脚本文件名 -->
<script file="interface/menu/menu.lua"/>
<!-- 该窗口有个按钮-->
<button id="bt_test" x="16" y="36" width="208" height="24">
<!-- 该按钮的文字颜色,大小,文字位置 -->
<Text bg="true" r="1.0" g="0.78" b="0.0" a="1.0" point="center" x="104" y="12" fontType="0" fontSize="1" fontweight="1"/>
<!--这个按钮使用了边界框 -->
<Border texture="border.dds" r="0.75" g="0.75" b="0.75" a="1.0"/>
<!-- 按钮各种状态下使用的贴图 -->
<UpTexture file="up.dds"/>
<DownTexture file="down.dds"/>
<DisTexture file="disabled.dds"/>
<LightTexture file="highlight.dds"/>
</button>
<!--还有其他按钮-->
</button ...../>
</button ...../>
<!--有个输入框-->
</editbox ...../>
<!--有个列表框-->
</listbox ...../>
<event>
<Registe event="OnChar();"/>//该窗口接收键盘输入
<Registe event="OnMouse();"/>//该窗口接收鼠标消息
</event>
</Ui>
3、用脚本控制游戏界面
设计思路很简单
1、主程序将键盘,鼠标,网络消息传递给脚本。当然这些消息必须是向主程序注册过的,否则主程序不会向这个窗口脚本传递信息
2、此处脚本可以对消息进行处理
--->通过脚本,可以去获取想要获取的主程序数据,前提是该窗口脚本注册过的那些数据
--->通过脚本,可以调用主程序的函数,前提是该窗口脚本注册过的那些函数
3、脚本将鼠标消息传递给gui窗口,gui窗口将消息传递给脚本
4、此处脚本可以对消息进行处理
--->通过脚本,可以去获取想要获取的主程序数据,前提是该窗口脚本注册过的那些数据
--->通过脚本,可以调用主程序的函数,前提是该窗口脚本注册过的那些函数
5、脚本返回给程序
欢迎讨论学习,共同进步。
|
|