游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7872|回复: 13

无题,我自己都不知道再说什么。

[复制链接]

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2005-1-24 18:47:00 | 显示全部楼层 |阅读模式
游戏界面有很多中制作方法,xml+lua是暴雪《魔兽世界》的选择游戏UI的做法,随着《魔兽世界》被越来越多的人注意,感觉lua一下子流行起来。由于喜欢跟屁个性,所以我决定模仿一个这个东西出来。不过最后还是觉得这个做法不如《魔兽争霸3》的UI设计方案。最近QQ群里的朋友,询问这个东西的做法或者设计思路之类的,于是谈谈自己的一点点心得。

第一步,要有一个差不多的xml解析类,其实vc里面就有一个msxml接口,也不复杂,推荐使用。

第二步,安装lua库,lua是脚本语言,很容易掌握,也许是我运气好,我学习的时候,正好Hack兄弟也在学习,每天跟着Hack在论坛发的<lua学习日记>,大概10天吧,感觉需要用到东西,基本掌握了。

第三步,下载安装<wow>客户端,用mpqworkshop之类的mpq工具,解开interface.mpq包,里面有一堆堆的xml和lua文件,一般都是两两对应的,先大概通览一遍吧,留个印象先。

第五步,我决定从AccountLogin.xml和AccountLogin.lua开始入手,这个是登陆界面。界面元素内容不多,也就是按钮和输入框。
开始可以胡乱猜一下xml文件每个元素差不多大概说不定是什么意思吧。
<Script file="AccountLogin.lua"/>
大概是说这个文件需要和AccountLogin.lua配对使用
<Model name="AccountLogin" setAllPoints="true" file="Interface\Glues\Models\UI_MainMenu\UI_MainMenu.mdx" hidden="false" parent="GlueParent" enableKeyboard="true" fogNear="0" fogFar="1200">
就是你看到的背景3D模型,我想大概的意思就是先渲染这个,然后叠加其它的窗口组件,例如按钮什么的。
enableKeyboard的意思大概是,这个窗口接收键盘输入,例如这个界面的某些按钮支持快捷键盘,这个应该是true。
fogNear="0" fogFar="1200"是说渲染这个模型时候,雾的设置参数。其他地方你还可以看到灯光颜色和位置的设置,这里可能采用的是默认的,所以没有。
Frames = CWnd[主窗口]
Layer = 根据参数设置渲染时候的顺序
Frame = 也是窗口,接下来有其他元素,说明这个窗口的类型
例如FontString=CStatic,EditBox=CEdit,Button=CBitmapButton,这些参数都可能会有这个元素的ID,名称[这个是唯一的,至少在某个Frame内,如果需要这个而且是需要和Lua等同的],位置,大小,贴图等信息。

第六步,开始编写代码了咯
CWnd是个窗口基类,CStatic,CEdit,CBitmapButton继承它,这些都是废话了。参见MFC大概的概念就好,我是根据自己的对MFC的一知半解,胡乱拼凑了类似的类,好比UiWnd,UiStatic,UiEditBox,UiButton,UiCheckButton,UiListBox等,所有这些都是带bitmap属性的。
我觉得最复杂的部分是内里面以下三个函数
Create()
{
从xml中读取该元素控件的信息,设置读取贴图,大小位置,组织初始化顶点数据.
注意注册这个类到lua中去
}


FrameMove()
{
有些元素控件是动画
}


Draw()
{
渲染控件的那些顶点
}


lua和这些类的结合处理
long XmlUiWnd::MsgProc(HWND hWnd , UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch(msg)
        {
        case WM_MOUSEMOVE:
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
        //检查是否需要将该信息交给lua处理,如果要,就塞给lua处理
        //假设这是个按钮,并且读取配置文件的时候有<Scripts>且<OnEnterPressed>为"AccountLogin_Login()"
        //至于AccountLogin_Login()做什么,这里就不用管了。也许按钮按下后lua就是播放一个按钮音效
        //如果没有一般都不处理。否则就不用lua了呵呵。
                break;
        case WM_KEYDOWN:
        case WM_CHAR:
        // 如果是输入框,接收输入的内容
        // Tab键切换控件焦点的话,也丢给lua处理好了
        // 注意只有主窗口接收快捷键消息,但是如果该界面中有输入框并且处于焦点状态,那就需要自己处理一下了。
                break;
        }
}


写到这里,回头看看,Faint.跟没有说一样,自己都不知道说什么。
其实ui在游戏中还是非常重要的,以前我以为还是很容易的东东,第一次写这个东东后,发现还是很复杂的,而且很多也不知道,早知道先看看写hoho的那个游戏ui,应该会有更多概念,写起来也会更加好些。顺便说一下hoho好像是和python结合的,python也是一个不可去了解一下得脚本语言。


在网吧里面玩wow,一定很有意思。每台电脑都有自己不同的界面操作。小小的恶作剧,也许无论按那个按钮都相应logout指令。哈哈哈。稍微大点的恶作剧是什么呢?我说不上来了。

37

主题

727

帖子

740

积分

高级会员

Rank: 4

积分
740
发表于 2005-1-24 18:54:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

大哥发文章
做弟弟的当然要顶一下
呵呵

13

主题

153

帖子

153

积分

注册会员

Rank: 2

积分
153
QQ
发表于 2005-1-25 19:41:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

每次看 kingmark 兄地文章都有收获。

21

主题

100

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2005-1-25 20:15:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

谢谢分享!

36

主题

76

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2005-1-26 12:35:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

多谢kingmark 兄 !

2

主题

17

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2005-1-26 15:26:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

我没理由不出来支持一下

6

主题

41

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2005-1-26 21:00:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

1 LayoutFrame是所有物件的base class, 开interface/framexml/UI.xsd.可以看到xml中所有ui元素的机构。 除了texture和font string 所有的物件都由frame继承而来。
frame texture fontstring 由layoutframe继承而来。


基本物件再程序内部实现程度不明,有可能引擎提供button作为单独物件,也有可能在其他的地方使用lua和xml组合定义。 就像scrollbar 使用solider和button制作摸板完成一样。
       他所拥有的重要属性:name, inherits(继承于),virtual(是否是模板)。
同时提供size,anchor等多种替代编辑器(或者他们就是使用编辑器?不过xml都做成这种了,稍微专业点的lua和xml编辑人员就可以做出复杂的面板了)的机制。xml熟悉人员可以同它挂点和区域做到精确的定位。可以是实际需要的组件。 也可以是需要被继承不被创建的物件。(virtual属性)。在定义xml的时候,参照ui.xsd,可以使用xmlspy软件对shedum进行观察。

2 frame 继承layoutframe, 作为ui元素的类,是实在的看得到的物件。除了每个layoutframe都必须有的属性外, frame还拥有scripts, frames ,layers。
        scripts 从OnLoad直到OnClick,填写这些时间被内GUI或者其他模块激发后需要执行的脚本命令。 blizzard在这儿描述了数十种消息。 在外部直接操作鼠标键盘,内部GUI发送的Onclick或者scrollbarchange消息。以及在OnLoad世纪注册的游戏事件消息。ui的更新估计属于被动更新。 当其他的模块,比如果说更换技能, 发出了"skill change"消息,之后。 GUI负责将消息床给那些注册过这个消息的面板。 面板OnEvent(Event),此时需要根据sill重新设定面板。则调用 XXXXframe_OnUpdate()根据得到既能模块的数据组合面板。
        Layers 纹理和文字的结合层。        
        Frames 改面板具有的面板集合。 上面可以有任何东西,可以是frame,button.etc.然后以此类推。又比较好的parent child关系。 来处理面板之间的创建,以及运行期的消息(输入)机制。
        还有其它的。

3 通过自定义的this实现模板。 因为提供inherits的机制,包括copy 基本数据和scripts.只要在调用脚本的是后,脚本知道调用者就可以实现templet。不知道bliz怎么做的this,我的方法反正可以做到这种。

4 所有物件包括纹理和文字都可以通过lua的唯一量访问。 ClassTrainerListScrollFrameScrollBar,还有。
ClassTrainerListScrollFrameScrollBarScrollUpButtonHighlightTexture,如果你需要这张纹理的话.....可能有点夸张,不知道是不是所有的他有可能感兴趣的物件都在lua空间有关联,否则他怎么去分不想操作的物件了? 在函数内部,因为有固定的命名规则,getglobal(framename..xxname..number..1texture)这种方式来查找具体的物件。 然后调用开放的接口完成功能。 我的一个面板拥有16个元素,全局命名个数如果加上纹理和文字就激增到64个了。或许对于背景或者是按钮的texture我们不需要关注?

5 所有的游戏功能的面板,都是通过组合基本物件,书写游戏相关的脚本来实现的。也就是他它为什么可以让玩家自定义面板的原因。

6

主题

41

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2005-1-26 21:07:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

希望有研究过的朋友可以谈谈。上面是我看后的结果。lua空间如何存储面板元素的pointer. 程序内部创建,然后传出来。通过lua loadstring();真的是所有元素都关联到lua中吗?

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
 楼主| 发表于 2005-1-27 00:47:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

7楼的发言很有启发,你对wow的研究比我深入多了。
我只是看看包装,里面的运作机制,完全不对路,典型的假冒产品。只能够抄袭wow的ui方面的操作以及表现效果。

我认为最好所有的元素都关联到lua中去(我是这样做的),当然也许比较浪费,相对于目前就算比较低档的设备来说,也不算什么。这样做的话,lua对界面的控制权利就要大很多了,ui可能某些时候可以做得比较花哨。

“lua空间如何存储面板元素的pointer. 程序内部创建,然后传出来。”这一句没有听懂。

6

主题

41

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2005-1-27 11:45:00 | 显示全部楼层

Re:无题,我自己都不知道再说什么。

  有许多疑惑,希望有所涉及的朋友的想法。深入什么的呵呵,时下我正好再做相关的东

西。 前面所说的实际上还是很混乱的。 前半句的意思是,lua关联所有的gui元素的时

候,有什么好的方法来管理这些关联的内容吗? 因为如果用表,则必然一定会有访问的

开销。 但是wow是可以用表或者直接访问两种方式。 它看起来效果不错。所有的

父面板都直接访问。此外的元素通过table访问。 不过,意义不大是吧?后半句的意思

是lua得到ui element pointer的方法。 这个不重要了。对于它的背景描绘的方法backdrop和tileregion我也没注意过。 因为现在不需要。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-24 07:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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