游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1295|回复: 0

用脚本来实现与游戏界面的对话

[复制链接]

10

主题

173

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2008-4-4 12:58:00 | 显示全部楼层 |阅读模式
范例程序,可以在
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、脚本返回给程序


欢迎讨论学习,共同进步。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 15:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表