魔兽世界插件开发入门教程——2

自己开始写教程才知道有多麻烦
此刻再也不敢乱评价说某些书某些教程有多糟糕
干这个事情连排个版都像体力活
何况最近心里惦记着新加坡公司的面试
不是太有心思搞这个
可能会有挖个大坑出来
但是至少应该会讲完QuestRepeat最初级的版本功能实现。

本节目标

上次我们讲完了开发插件需要的3种文件中的必不可少的toc文件
这次,我们来看下开发操作界面用的XML文件
首先先看下QuestRepeat的界面
看到这个烦人的交布换声望任务了吧

    • 我们要用XML实现任务对话框最底下的那几个按钮

比如“全部完成”,“完成一次”,“取消”还有完成任务的次数的文本输入框等
至于右边的那两个窗口,我是用lua代码动态创建的,我只是尝试了用两种不同的方法来开发界面
在这里,我们只说XML,剩下的,日后再教

    • 这时候有人会问了,WoW原本的任务对话框的不是有个“完成任务”的按钮呢,那个哪里去了?

答案是我们把它隐藏了
因为我们要开发个插件,可以让我们点击一次“全部完成”,之后只需要一直右击NPC,插件就会自动不停的帮我们一直上缴物品完成任务,所以我们不需要那个游戏自带的完成按钮。

    • 可能有人又要问了,那日后如果是跟非重复任务的NPC对话时候怎么办,难道也显示这个重复任务的插件按钮?

所以,我们需要对NPC给的任务是不是重复任务进行判断
是的话,就隐藏默认按钮,然后显示我们的插件
不是重复任务的话,就把我们的插件隐藏,一切照旧

这里是一个只实现界面,不实现任何功能的插件代码,以供你参考温习这2节的内容。
[—-请猛击这里—-]

请解压到你的魔兽世界的Interface/AddOns下面
然后随便找个可以完成任务的NPC对话,看下那几个按钮是否有出现
忽视附加的那两个lua文件,我也几乎清空了所有代码,没有什么功能,这只是个框架
关键是学习第一节的Toc文件的编写,以及怎么用XML文件编写出一个界面出来

学习完, 请把这个测试学习的插件删掉,否则你永远都交不了任务……那就是活生生的杯具啊~

因为我们没有在那些lua文件中实现操作处理
系统不知道怎么响应按钮被按下等动作
你怎么点“全部完成”之类的按钮,也都是无法完成任务的

从零开始

自己编写,请新建一个XML文件,名字随意,只要记得在上一章你写的toc文件中加入即可
XML里的代码内容请参照给的范例

要至少写出以下这些结构了再放进WoW运行查看结果
没写完是看不到什么玩意的

下面我们来讲解下其中的各个标签的用途。

XML文件结构

QuestRepeat.xml代码如下:

<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/\FrameXML\UI.xsd">
	<Script file="localisation.lua"/>
	<Frame name="QuestRepeat" parent="QuestFrameRewardPanel" hidden="false">
		<Scripts>
			<OnLoad>
				QuestRepeat_OnLoad();
			</OnLoad>
			<OnEvent>
				QuestRepeat_OnEvent();
			</OnEvent>
		</Scripts>
		<Frames>
			<Button name="QuestRepeatOnceButton" inherits="UIPanelButtonTemplate" text="COMPLETE_ONCE">
				<Size>
					<AbsDimension x="90" y="22"/><!--x是按钮的宽度,y是高度-->
				</Size>
				<Anchors><!--该框体的对齐设置-->
					<Anchor point="RIGHT" relativeTo="QuestFrameCancelButton" relativePoint="LEFT">
						<Offset>
							<AbsDimension x="0" y="0"/>
						</Offset>
					</Anchor>
				</Anchors>
				<Scripts>
					<OnClick>
						QuestRepeatOnceButton_OnClick();
					</OnClick>
				</Scripts>
			</Button>

			<!--这里还有一堆别的按钮的实现代码,只讲解一个,其他就依葫芦画瓢,自己试着写看看-->

		</Frames>
	</Frame>
</Ui>
<Ui>标签

<ui>是最上级的标签

如果要用XML文件描述界面,这个标签一定要有,其中xmlns是命名空间,后面的xsi那些是用xsd文件来检查XML文档的结构,这几样东西是XML技术中的术语,不是太熟悉的童鞋可以去google温习下

需要指出的是,这个标签你可以直接这么复制粘帖到任意一次插件编写当中,你可以将这一行当约定好的规则使用

我对schema这个讨厌的东西不是太了解,还望有高手能指点下

<Script>标签

<script file=”localization.lua”/>

这个标签在我的插件源代码中是没有的,这里只是为了说明一些主要标签特地这么写而已,它的作用只是表示在此处加载一些lua文件而已

如果记性好的童鞋应该记得toc文件的最后也有文件加载列表,是的,我就是在那里加载的,所以这就意味着你可以不写这个标签,把加载文件的描述放在toc文件那里

<Frame>标签

<Frame>标签就是我们最重要的用来描述你插件界面的东西

    • name属性 —— 是我们插件要创建的图形界面那个窗体的名称
    • parent属性 —— 表示我们的插件要依附关系

这里表示依附在QuestFrameRewardPanel也就是任务说明窗口下,这样任务说明窗口显示跟隐藏的时候,我们的插件也会跟着一起显示跟隐藏

那我们怎么才能知道要继承什么窗体,或者游戏中的那个窗体叫什么名字?
呃……请下载个WinMPQ以及一个BLP图片格式的查看器,自己去搜索如何查看WoW的MPQ文件下的资源以及安装文件夹下的几个MPQ文件的作用,之后按照英文名,意识流般的第六感查找吧……

不要怀疑,我真就是这么干的
哪位大神知道人性化一点的方法,务必务必告知在下……

    • hidden属性 —— 表示我们的插件是默认要显示还是隐藏

true是隐藏,false是显示,日后可以根据不同情况更改状态,并不是一定就是一直显示或隐藏。

<Frame>底下的<Scripts>标签

包含的是插件的界面窗体在游戏系统触发的一些事件下的处理函数声明

    • <OnLoad> —— 描述的是框体只在被WoW成功创建之后触发的事件的处理函数

我们在它下面写下QuestRepeat_OnLoad(),意思是我们日后要用这个函数来响应该事件并进行一些处理。

    • <OnEvent> —— 描述该框体用来处理那些我们注册过要监控的事件的函数

跟上面的OnLoad事件不一样的是,这个是对我们注册过的所有想要监控的事件一起进行分类处理,OnLoad是一个窗体创建的时候一定会触发的一个事件,但是我们往往想要监控更多的东西,比如自己是否脱离战斗,是否可以完成某个任务,所以,一般需要独立写一个函数对这些进行分类处理,小插件的大体结构实现一般是靠这个函数来主导的。

上面说的有点绕,其实翻译的时候handler之类的名词就直接叫handler算了,不知道我这样翻译解释的更多,是否又对新手造成更多的困扰,所以给一个相同的文章给你们一起当参考:CWDG Wiki

我知道看到这里有些没基础的童鞋会不明白什么是事件,为什么要注册,为什么要使用这种机制来控制插件运作

容我在此废话多说几句小解释一下,更多的东西请自己另外google

其实现在的软件,包括操作系统,很多都在使用这种消息响应机制来设计。整个WoW的运作也是如此,比如一个插件加载会出现一个插件加载成功事件,你 跟一个NPC对话,游戏会抛出一个叫GOSSIP_SHOW的对话触发事件。

可是游戏触发了这个事件对我们有什么意义呢,比如我想监控自己的战斗记录,不停的记录我曾经出现的最高伤害数值,首先就要向WoW注册要捕获事件 CHAT_MSG_COMBAT_FACTION_CHANGE,这是战斗记录变化时会触发的事件,然后在去对应写个处理这个事件的函数,这样每次打出新 的伤害的时候,插件就会不停的比较、更新数值记录,这个日后我们写Lua文件的时候会慢慢再教怎么做。

此刻你只需要明白,事件及其响应机制就像你告诉WoW你要监控什么情况,WoW在那些情况发生的时候,会第一时间告诉你:“事情见鬼的来啦,赶紧干活啊!”, 这样你就可以在准确的时间开始干对应的活了

若想知道所有的事件处理函数的名称及其对应的框体,请猛击:WowProgramming-Script Listing

<Frame>底下的<Frames>标签

不要把两者搞混了哦,使用<Frames>可以使我们能在<Frame>下内嵌更多的框架,也就是各种界面资源。

我在<Frames>的下面可以开始写各种我们要建立的界面的东西,上述代码只贴了一个“完成一次”的按钮的实现部分,由于不好单独剥离解释,我直接在源代码中打了注释,直接看注释跟一些属性的英文名基本就知道它的用途。

我就不一行一行的解释代码,很多时候,这种看源代码自学的能力是要培养的。

问题1:我们怎么知道可以创建多少种框体?

请看下表

要创建某种框体,在<Frames>下添加对应的<框体名称>的封闭标签
不知道什么是封闭标签?请回去了解XML基础知识

Button —— 按钮
EditBox —— 可编辑文本框
GameTooltip —— 鼠标提示信息框
ColorSelect —— 颜色选择器
MessageFrame —— 信息框架
Minimap —— 迷你地图,小地图、战场地图等
Model —— 模型,用于显示3D动画,人物模型,冷却都是Model
MovieFrame —— 从来就没见过哪个插件用着这玩意,我不懂
ScrollFrame —— 带滚动条的框架
ScrollingMessageFrame —— 滚动信息框架,例如聊天窗口、战斗信息窗口
SimpleHTML —— 简单超文本标记语言,没用过,不懂
Slider —— 滑块,像系统设置中的UI缩放那个滑快
StatusBar —— 各种进度条

问题2:我们怎么知道框体有多少种可以设置的属性,比如长宽、或者是否可以有显示的文字?

请狠狠的抽这里:WowWiki-XML elements

这个WowWiki整理的非常详细,我第一次觉得它比WowProgramming好用,主要当初我在学校的时候,WowWiki经常被墙……很讨厌在这里找资料。

发现现在它不怎么被墙了,不过,翻墙工具还是要准备个的,例如Tor什么的,翻墙去看看youtube……

如果你觉得这么干做界面太辛苦了,可以给你介绍一个软件,能图形化的设计一个插件的界面
不过我并不爱用,因为我曾经试过,这个开发环境容易崩溃。现在过了这么久,说不定已经改善了
想当白老鼠的,请猛击这里:WoW UI Designer

总结一下

这一节我们讲解了如果使用XML文件来编写自己的插件界面
请和上一节的toc文件放在一起
自己验证看看效果

当你第一次编写完整,在魔兽世界里面看到你的插件界面的时候,你可以切换到桌面,一边修改XML文件,保存它,然后回到WoW,用我们上节曾经提到的

/console reloadui

刷新一下,再跟npc对话就可以查看新的结果。没错,我就是这么修改一次,刷新一次的……我这5年前的老爷机,重新载入一次那是何其漫长而销魂的等待……
就先说这些,那下次见吧~

Tagged , ,

2 thoughts on “魔兽世界插件开发入门教程——2

  1. xawsol说道:

    一口气看完了2篇,很不错的教程。对初学编写wow 插件的朋友来说,可能最头疼的是找不到好的学习资料。确切的说是中文资料实在太稀少了。这两篇教程对一些细节问题描述的令人满意。希望有时间可以继续写下去。

  2. Tyreal说道:

    最近做毕设当中,暂时还没时间写教程。下一篇写的可能会是嵌入式开发的东西。
    有问题或者好想法留言或者来信交流下吧

发表评论

电子邮件地址不会被公开。