wow中如何用Lua如何实现 选定wow目标血量百分比

您当前的位置:&&&&&正文
LUA学习笔记:魔兽世界自定义界面插件
LUA学习笔记中魔兽世界自定义界面插件 是本文要介绍的内容,主要是来了解操作系统的库文件没有包含在魔兽世界UI的PATH路径之中,本文是对魔兽世界自定义界面插件的介绍,内容主要是如何进行自定义的UI插件(Custom UI)进行定义:用户界面(UI - User Interface)向导近来有许多玩家蜂拥而入了WOW团体,他们中有许多,就像我一样,有着一些编程经验并且希望试着创建UI插件。由于有着众多编程语言和接口,不少人可能会走些弯路,我希望以下内容能够减少以上这些情况(至少减少为寻找那些函数的资料而头痛的烦恼):(译注:其实并不难,其内容只涉及到一些脚本语言和XML文档的知识,就算你没有写过程序,也能胜任。)1、准备开始 (1)可以选用的工具第一步必须明白将要做些什么,但是为了能够正确的开始,我们必须选择一些编写脚本的工具。我想首先重要的一点是编辑器(用专业术语来说就是IDE-integrated development evironment), 这可能有许多种选择。由于我们编写脚本的语言是LUA(译注:一种脚本语言,参见:www.lua.org),我们需要的编辑器应当是针对这种语言的,以下十供选择的列表:blua.sourceforge.net/ (译注:sourceforge.net是一个著名的开源项目网站)B:Lua这是首当其充的脚本编辑工具之一,它提供了强大的IDE所提供的功能,足够用来编辑WOW的UI。而且它是用Java语言编写的,不论在何种操作系统中尼都能运行它。.br/luaeclipse/ (译注:一个运用于Eclipse IDE下的插件,建议使用过Java语言的专业人士使用。)Lua Eclipse ? 这是另外一个Java环境的IDE,我没有用过这个IDE(译注:本文中的我不代表译者),它基于Eclipse 平台(译注:请参见www.eclipse.org),它是一个有着多种功能的插件,我确信这是一个很好的工具。</ (译注:editPlus是类似于UltraEdit的文本编辑器)EditPlus ? 这是替代记事本程序的有效工具,这也是我编辑LUA的工具。它有着多种你所需的功能,而且它有着LUA语言的Schema(译注:Schema可以理解为一种模板,它规定者文件如何定义等内容)。但是它有着30天的评估期,你得注册拥有它。这只是3种建议,我认为一旦掌握了B:Lua后,你就能够更好地使用其它工具了。(2)目标:WOW文件你拥有了编辑器后,一切只是刚刚开始,我们需要一些工具来编辑WOW。首选的工具是WinMPQ,下载地址:/dwnload.html#WinMPQ你需要运行库(VB4运行库)来运行它(译注:一般windows都安装了),有了它你就可以打开游戏目录中的MPQ文件或者MoPaO 文件。MPQ是暴雪公司存储游戏资料的文件格式,如果你有兴趣研究的话,请参阅:www.campaigncreations.org/starcraft/inside_mopaq/index.htm有了WinMPQ,你就可以解开文件内容,并且打包到游戏安装目录。了WinMPQ,你就可以解开文件内容,并且打包到游戏安装目录,里面就是你所需的所有内容。Interface.mpq文件里面有基本的界面数据,并且有着大量柯作为例子的文件。Patch.mpq文件里有着所有的补丁内容,在游戏运行时将覆盖所有基础的文件。打开WinMpq,我们将所有基础界面文件作为例子来使用。下面还将示范如何保证数据与最新的补丁保持一致。使用&Open&选项打开interface.mpq文件(该文件在游戏安装目录下),找到一个叫FrameXML的文件夹(还有一个叫glueXML的文件夹,不去管它),选中目录下所有文件并且解压到游戏安装以外的目录下。同样,打开Patch.mpq,其中不仅仅有界面文件,还有许多更新文件。打开Interface\FrameXML目录,将其中的内容解压到刚才interface.mpq文件的解压目录中,并覆盖已有的文件。这样我们就有了一份最新的游戏界面FrameXML目录数据作为参考。(你也可以用WinMPQ 解压其他的文件,例如音乐文件等)。2、有了目标之后 一切准备就绪,让我们开始制作第一个插件吧!首先你的知道具体文件的安排,哪个文件是做什么的。让我们看以下魔兽世界的安装吧。其中有许多目录,我们将要操作的目录是Interface目录(若不存在请创建)。在该目录下有3个主要的目录:FrameXML: 有所有暴雪提供的界面,你将打交道的文件都在这。GlueXML: 包含&游戏之外&的界面,例如登入界面,服务器选择,角色创建等。你不太需要关心这些文件。AddOns: 所有游戏角色的模型。在AddOns目录下每个角色都有其所有的目录并且有一个内容表。3、开动(1)初始化我们要开始创建&Hello world&啦!(译注:&Hello world&常指第一个程序),创建1个叫hello_world的目录在AddOns下,即Warcraft/Interface/AddOns/hello_world。在目录中建立1个叫hello_world.toc的文件,这就是内容表了,它定义了WOW该如何装载插件内容。例如以下就是文件内容:Interface:&4114& &Title:&Hello&World& &Notes:&The&obligatory&hello&world&script&?&WoW-style!& &OptionalDeps:& &Dependencies:& &hello_world.xml&&作一下解释,第一行表示新的代码段的开始。事实上每次暴雪更新补丁后,当前的版本号都会更新。如果你的脚本没有最新的版本号,那么这段脚本将&不会&装载入游戏。这就是为什么版本更新导致插件无法使用的原因。你可以通过打开Interface\FrameXML\FrameXML.toc文件来知道当前的版本号。接下来两行的Title和Nodes就不必解释了吧(译注:分别为标题和注解,可选)。在下一行,OptionalDeps中你可以列出所有你的插件的名称(你可以列出其他插件,用空格分隔)。Dependencies也是同样的,但它不是可选的,我不太确定如果没有这一行你的插件是否会装载。最好所有的都写,不管它是不是可选的,这样所有人都能更好阅读你的代码。在开始的声明之后,你将写入一些XML文件的名称(次序未定),一行写一个文件的名称。你也可以将XML文件写在子目录中,例如&core/hello_world.xml&,这样能使文件夹里看起来更简洁。哦。有些复杂了是么?其他不用管先看(2)加入内容下面将是最有意思的部分,让我们从简单的开始。在目录中创建hello_world.xml文件(该文件名应写在了FrameXML.toc中),内容如下(译注:XML文件格式请寻找有关文档):&xmlns=&/wow/ui/&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&
xsi:schemaLocation=&/wow/ui/&& &&file=&hello_world.lua&& && &&name=&hello_world_core&& && && &this:RegisterEvent(&VARIABLES_LOADED&);& && && &if&(event&==&&VARIABLES_LOADED&)&then& &hello_world_initialize();& &end& && && && &&&(请看wow.nevir.net/tutorial/hello_world/hello_world.xml)哦。有些复杂了是么?其他不用管先看&script file=&hello_world.lua&/&这一行,它告诉游戏 hello_world.lua 是脚本文件,也就是插件运行的脚本所在。每个界面都用&Frame&的标签(Tag)扩起来。这里我们使用了一个Frame标签来简单地把所有事件脚本包进来,你也可以将所有的界面上的按钮,窗口等定义在Frame标签里面。在&Frame&标签里,可以定义其一个叫name的属性(如:&Frame name=&hello_world_core&&)注意里面的值必须在整个文件里是唯一的。建议你用你的插件模块名称作为前缀开始,后接下划线,再接上Frame真正意义的名称。在上面的例子里,我们把它叫做core,因而组成了上述名字。在&Frame&标签里有个&script&标签,其中是真正脚本的内容。在这里有许多事件(译注:即魔兽世界游戏程序在某阶段将做的某个动作),其中 &onLoad& 和&OnEvent&是最常用的2个。其中&onLoad&是当你选择了角色进入游戏时而角色Laoding画面开始之前的将响应的事件(换句话说,你的插件在登入画面时是不会被装载的)。在我们的代码中,我们注册了this给了一个叫&VARIABLES_LOADED&的事件(译注:看不懂代码的朋友还是先看看一些脚本语言的介绍书籍),this代表了当前的Frame,即这个名字叫hello_world_core的Frame,this就是指向该Frame的对象/变量(指向该Frame对象的实例),这里的&:&相当于引用方法的表达符(像其他某些脚本语言中的&.& 号),而RegisterEvent函数的作用是告诉游戏程序在VARIABLES_LOADED事件发生时(VARIABLES_LOADED是游戏内定义的事件)通知你定义的Frame。说到这里又得说说&OnEvent&这个标签了,在其中有一个默认的变量event,它的值就是当前游戏里产生的事件的名称(就好比上面的VARIABLES_LOADED)。(译注: 真的是要了解编程的了哦。 这里处理事件就类似Win32处理事件的代码模式,可以用if(event=事件名称){操作代码}else if(event=事件名称2){操作代码}&..或者 switch case的方式来完成。)现在,暴雪提供了存储变量的方法,你可以用RegisterForSave(&variable_name&)的方法来定义一个变量在游戏过程中。在我们的例子中,当VARIABLES_LOADED发生后,将调用hello_world_initialize()函数来处理。对啦,这个hello_world_initialize()函数还没定义呢,下面就介绍如何定义函数。(3)补完 (译注:写代码的部分,会写脚本的人一定看得懂,不会写的需要学习:&)好了,现在是真正要写代码的时候了。创建1个叫作hello_world.lua的文件。内容如下:function&hello_world_initialize()& &&--&add&our&very&first&chat&command!& &&SlashCmdList[&HELLOW&]&=&hello_world_& &&SLASH_HELLOW1&=&&/hellow&;& &&SLASH_HELLOW2&=&&/hw&;& &end &function&hello_world_command(msg)& & & --&this&function&handles&our&chat&command& &message(msg);& &end&&这里我不想对语法做出解释,如果不懂请看LUA的文档,那里会详细地介绍。参见:www.lua.org/manual/5.0/注意这里系统的I/O 库文件,操作系统的库文件没有包含在魔兽世界UI的PATH路径之中。至于暴雪定义的函数(内置的)和事件,你可以在Cosmos网站上找到,参阅:www.cosmosui.org/texts/BlizzardCommands.xml回到代码,在我们的函数中,我们定义了1个聊天用的命令。似乎我们的代码看起来挺怪的,是的,我们是直接修改了SlashCmdList这个表,其作用是当我们输入宏&/hellow 消息& 或者&/hw 消息&是会调用hello_world_command()函数,(至于游戏内部如何这种关系做映射不在本文讨论范围内)然后玩家看到打出&消息&的聊天信息的窗口(译注:事实上是msg()函数创建的窗口)。可以看到&消息&作为参数传递给了hello_world_command()函数。以上所有做的就是一个简单的插件,它加入了两条命令(宏)。如果你想测试它,进入游戏,输入/console reloadui(重新加载UI),在登入游戏后的聊天框中输入&/hellow Why hello there!&,你会看到游戏中弹出一个消息框,消息是&Why hello there!&。4、完成 这就是我们基本的例子,以后我可能抽空给出一些其它的例子。如果你已经完成了以上这个例子,我真是要为你鼓掌了呀!(那花了你不少时间来阅读吧。)如果你感兴趣的话,以下还有不少资料:LUA (www.lua.org/manual/5.0/),暴雪定义的函数(www.cosmosui.org/texts/BlizzardCommands.xml)。另外,试着看看Interface/FrameXML/BasicControls.xml文件,里面有不少操控语句;还有Font.xml文件,你可以定义自己的字体,颜色等。小结:LUA学习笔记:魔兽世界自定义界面插件的内容介绍完了,希望通过本文的学习能对你有所帮助!--博才网
猜你还喜欢的文章
热点文章排行榜
读完这篇文章后,您心情如何?
您还有150字可以输入
更多资讯请点击
热门关键字:,,,
【打印文章】
该换一换你的桌面了 宅男女神周韦彤
德国超模布洛姆秀香肩美背翘臀 性感热辣
猫眼超模蕾丝内衣
被影射曾援交的女星们(图)
《二炮手》海清裸肩浴照曝光 镜头疑因尺度大被剪
绝对领域诱惑写真
&#8226; 版权所有 Copyright 2011 All rights reserved.mac如何使用 lua_百度知道
mac如何使用 lua
在unity3d开发过程中需要使用LUA脚本 ,但是uni穿担扁杆壮访憋诗铂涧ty不能识别lua.dll 求开发大大的经验
提问者采纳
一、Mac OS X中make和gcc命令的安装在编译Lua前需要做的准备工作。我将lua-5.2.2.tar.gz下载到苹果电脑中,解压后进行编译时,发现我的Mac OS X 没有mak命令,也没有gcc命令。检测苹果电脑的Mac OS X中是否有make命令的方法,可在控制台键入穿担扁杆壮访憋诗铂涧命令:which make如果有该命令,则会返回提示:/usr/bin/make所以我需要在Mac OS X中安装mak命令和gcc使命令。安装工具包需要从苹果的开发网站下载。下载方法:打开Xcode,菜单Xcode --& Open Developer Tool --&More Developer Tools这时Safari浏览器被运行,并弹出注册对话框,要求输入Apple ID和密码,填写完注册信息然后进入Apple Developer的下载站点,搜索“Unix”,结果会列出命令工具包的下载列表:Command Line Tools (OS X Mountain Lion)for Xcode - April 2013
(这个版本需要Xcode 4.6.2 和 Mac OS X 10.8以上版本)Command Line Tools (OS X Lion)for Xcode - April 2013
(这个版本需要Xcode 4.6.2 和 Mac OS X 10.7.4以上版本).....下面还有其它版本,跟据你使用的Mac OS X的版来下载。另外说一下: Mac OS X 10.4.x,代号为:Lion
Mac OS X 10.8.x,代号为:Mountain Lion我的Mac OS X是Mountain Lion,所以下载的是Command Line Tools (OS X Mountain Lion)for Xcode - April 2013 版本,文件名为:xcode462_cltools_10_a.dmg下载完后双击该文件。过一会儿后,会弹出安装包的窗口,对双击安装包。按提示完成安装。这时make和gcc便有了。可使用which命令进行检查。二、编译Lua软件编译和安装方法的详细说明在readme文件中:lua-5.2.2/doc/readme.html在编译前最好进行编译测试,在lua-5.2.2目录下,使用命令如下:make test我的编译和安装方法是:sudo make macosx install
(sudo在Mac OS X中表示使用超级用户权限)注意:Lua的编译和安装说明文档(readme.html)中指出,编译Lua时,需要选择要运行的操作系统,编译并安装的格式如下:make xxx install
(如果不是超级用户登录,则需要前面加sudo命令)其中xxx表示目标操作系统的标记,目标操作系统的标记列表如下:aix
solarisLua 将默认安装到 /usr/local/,安装完成后,在该目录下会生成一些重要文件。/usr/local/ bin:
(可运行程序)lua
(lua是Lua语言的解释器,luacLua语言的编译器)/usr/local/ include:
(头文件)lua.h
lua.hpp/usr/local/lib:
(库文件)liblua.a/usr/local/ man/man1:
(命令手册)lua.1
luac.1Lua 解释器完整的路径是 /usr/local/bin/lua,在终端中运行 lua 即可调用解释器。三、Lua语言解释器的测试在控制台上输入lua命令:luaLua 5.2.1
Copyright (C)
Lua.org, PUC-Rio& print (&Hello World!&)
(进入交互命令状态,在提示符“&”下输入测试代码)Hello World!
(返回的结果)键入 Control+D 退出交互命令如果想运行一个lua脚本文件,可以使用下面命:lua
文件名如:lua
hello.luahello.lua文件的代码:io.write(&Hello world, from &,_VERSION,&&!&#92;n)结果:Hello world, from Lua 5.2!注释:Lua 是一个小巧的脚本语言。 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。很多应用程序使用LUA作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。这其中包括魔兽世界、博德之门、愤怒的小鸟等。
虽然 答非所问
但还是谢谢你啦 。
提问者评价
已解决问题
其他类似问题
lua的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照.
assert(value) - 检查一个&#20540;是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息
collectgarbage() - 垃圾收集器. (新增于1.10.1)
date(format, time) - 返回当前用户机器上的时间.
error(&error message&,level) - 发生错误时,输出一条定义的错误信息.使用pcall() (见下面)捕捉错误.
gcinfo() - 返回使用中插件内存的占用量(kb)以及当前垃圾收集器的使用量(kB).
getfenv(function or integer) - 返回此表已获取函数的堆栈结构或者堆栈等级
getmetatable(obj, mtable) - 获取当前的元表或者用户数据对象.
loadstring(&Lua code&) - 分析字符串中的lua代码块并且将结果作为一个函数返回
next(table, index) - 返回下一个key,一对表&#20540;.允许遍历整个表
pcall(func, arg1, arg2, ...) - 受保护调用. 执行函数内容,同时捕获所有的异常和错误.
select(index, list) - 返回选择此列表中的商品数&#20540;.或者是此件物品在列表中的索引&#20540;
setfenv(function or integer, table) - 设置此表已获取函数的堆栈结构或者堆栈等级
setmetatable(obj, mtable) - 设置当前表的元表或者用户数据对象
time(table) - 返回从一个unix时间&#20540;
type(var) - 判断当前变量的类型, &number&, &string&, &table&, &function& 或者 &userdata&.
unpack(table) - 解压一个表.返回当前表中的所有&#20540;.
xpcall(func, err) - 返回一个布尔&#20540;指示成功执行的函数以及调用失败的错误信息.另外运行函数或者错误的返回&#20540;
table函数库
一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明.&
table.concat(table, sep,& start, end)
concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开.
除了table外, 其他的参数都不是必须的, 分隔符的默认&#20540;是空字符, start的默认&#20540;是1, end的默认&#20540;是数组部分的总长.
sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 但如果要指定靠后的参数, 必须同时指定前面的参数.
& tbl = {&alpha&, &beta&, &gamma&}
& print(table.concat(tbl, &:&))
alpha:beta:gamma
& print(table.concat(tbl, nil, 1, 2))
& print(table.concat(tbl, &\n&, 2, 3))
table.insert(table, pos, value)
table.insert()函数在table的数组部分指定位置(pos)插入&#20540;为value的一个元素. pos参数可选, 默认为数组部分末尾.
& tbl = {&alpha&, &beta&, &gamma&}
& table.insert(tbl, &delta&)
& table.insert(tbl, &epsilon&)
& print(table.concat(tbl, &, &)
alpha, beta, gamma, delta, epsilon
& table.insert(tbl, 3, &zeta&)
& print(table.concat(tbl, &, &)
alpha, beta, zeta, gamma, delta, epsilon
table.maxn(table)
table.maxn()函数返回指定table中所有正数key&#20540;中最大的key&#20540;. 如果不存在key&#20540;为正数的元素, 则返回0.
此函数不限于table的数组部分.
& tbl = {[1] = &a&, [2] = &b&, [3] = &c&, [26] = &z&}
& print(#tbl)
3&&&&&&&&&&&&&& -- 因为26和之前的数字不连续, 所以不算在数组部分内
& print(table.maxn(tbl))
& tbl[91.32] = true
& print(table.maxn(tbl))
table.remove(table, pos)
table.remove()函数删除并返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起.
table.sort(table, comp)
table.sort()函数对给定的table进行升序排序.
& tbl = {&alpha&, &beta&, &gamma&, &delta&}
& table.sort(tbl)
& print(table.concat(tbl, &, &))
alpha, beta, delta, gamma
comp是一个可选的参数, 此参数是一个外部函数, 可以用来自定义sort函数的排序标准.
此函数应满足以下条件: 接受两个参数(依次为a, b), 并返回一个布尔型的&#20540;, 当a应该排在b前面时, 返回true, 反之返回false.
例如, 当我们需要降序排序时, 可以这样写:
& sortFunc = function(a, b) return b & a end
& table.sort(tbl, sortFunc)
& print(table.concat(tbl, &, &))
gamma, delta, beta, alpha
用类&#20284;的原理还可以写出更加复杂的排序函数. 例如, 有一个table存有工会三名成员的姓名及等级信息:
guild = {}
table.insert(guild, {
 name = &Cladhaire&,
 class = &Rogue&,
 level = 70,
table.insert(guild, {
 name = &Sagart&,
 class = &Priest&,
 level = 70,
table.insert(guild, {
 name = &Mallaithe&,
 class = &Warlock&,
 level = 40,
对这个table进行排序时, 应用以下的规则: 按等级升序排序, 在等级相同时, 按姓名升序排序.
可以写出这样的排序函数:
function sortLevelNameAsc(a, b)
 if a.level == b.level then
  return a.name & b.name
  return a.level & b.level
测试功能如下:
& table.sort(guild, sortLevelNameAsc)
& for idx, value in ipairs(guild) do print(idx, value.name) end
1, Mallaithe
2, Cladhaire
数学函数库
以下是一些常用的Lua标准库的数学成员, 按字母顺序排列.
函数&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&功能
math.abs(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回x的绝对&#20540;
math.ceil(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 返回不小于x的最小整数
math.deg(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&将弧度制的x转化为角度
math.exp(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回e的x次方
math.floor(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回不大于x的最大整数
math.fmod(x, y)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 或x % y, 返回x除以y的余数
math.log(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回x的自然对数&#20540;
math.log10(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 返回x的常用对数&#20540;
math.max(x, y, z, ...)&&&&&&&&&&&&&&&&&&&&&&&返回参数列表中的最大&#20540;
math.min(x, y, z, ...)&&&&&&&&&&&&&&&&&&&&&&&&返回参数列表中的最小&#20540;
math.modf(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回两个&#20540;, 依次为x的整数和小数部分
math.pi&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&圆周率常量
math.pow(x, y)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 计算并返回x的y次方
math.rad(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 将角度制的x转化为弧度
math.random(m, n)&&&&&&&&&&&&&&&&&&&&&&&&&&产生随机数, 参数可选并影响范围: 无参数时为[0, 1),&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&单参数时为[1, m], 双参数时为[m, n]
math.randomseed(x)&&&&&&&&&&&&&&&&&&&&&&&&重设随机种子
math.sqrt(x)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&开平方根运算
字符串函数库
以下是一些常用的Lua标准库的字符串工具:&
函数&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&功能
string.len(s)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回s的长度
string.lower(s)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回一个s的副本, 其中的所有大写字母均转换为小写
string.rep(s, n)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回一个字符串, 由n个s头尾相接而成
string.reverse(s)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回一个由s倒转构成的字符串
string.sub(s, i, j)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回s的子字符串, 从i开始, 到j(可缺, 默认为末尾)结束
                  i, j可以是负&#20540;, 此时从字符串结尾开始向前计算
                  例如: Hello的-3~-1代表llo子字符串
string.upper(s)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&返回一个s的副本, 其中的所有小写字母均转换为大写
format(formatstring[, value[, ...]]) - &#26684;式化字符串
gsub(string,pattern,replacement[, limitCount]) - 全局替换
strbyte(string[, index]) - 转换字符串为整数&#20540;(可以指定某个字符).
strchar(asciiCode[, ...]) - 转换整数为相对应的字符
strfind(string, pattern[, initpos[, plain]]) - 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置.
strlen(string) - 返回当前字符串的字符数
strlower(string) - 将字符串的字母转换为小写&#26684;式
strmatch(string, pattern[, initpos]) - 与strfind不同的是,macth返回的是具体&#20540;,而find返回的是此&#20540;的位置
strrep(seed,count) - 返回一个字符串种子副本的个数
strsub(string, index[, endIndex]) - 返回字符串指定位置的&#20540;.
strupper(string) - 将字符串的字母转为大写&#26684;式
tonumber(arg[, base]) - 若参数能转为数字则返回一个数&#20540;.可以指定转换的类型.默认为十进制整数
tostring(arg) - 转换参数为字符串&&
字符串&#26684;式化
Lua提供了string.format()函数来生成具有特定&#26684;式的字符串, 函数的第一个参数是&#26684;式(formatstring), 之后是对应&#26684;式中每个代号的各种数据. 由于&#26684;式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的&#26684;式很像C语言中的printf().
&#26684;式字符串可能包含以下的转义码:
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数&#26684;式
%o - 接受一个数字并将其转化为八进制数&#26684;式
%u - 接受一个数字并将其转化为无符号整数&#26684;式
%x - 接受一个数字并将其转化为十六进制数&#26684;式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数&#26684;式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法&#26684;式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法&#26684;式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数&#26684;式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种&#26684;式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的&#26684;式
%s - 接受一个字符串并按照给定的参数&#26684;式化该字符串
为进一步细化&#26684;式, 可以在%号后添加参数. 参数将以如下的顺序读入:
(1) 符号: 一个&#43;号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空&#26684;.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数&#20540;
(5) 小数位数/字串裁切: 在宽度数&#20540;后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.
在这些参数的后面则是上述所列的转义码类型(c, d, i, f, ...).
以下是一些例子:
string.format(&%%c: %c&, 83)&&&&&&&&&&&&输出S
string.format(&%&#43;d&, 17.0)&&&&&&&&&&&&&&输出&#43;17
string.format(&%05d&, 17)&&&&&&&&&&&&&& 输出00017
string.format(&%o&, 17)&&&&&&&&&&&&&&&&&输出21
string.format(&%u&, 3.14)&&&&&&&&&&&&&& 输出3
string.format(&%x&, 13)&&&&&&&&&&&&&&&&&输出d
string.format(&%X&, 13)&&&&&&&&&&&&&&&&&输出D
string.format(&%e&, 1000)&&&&&&&&&&&&&& 输出1.000000e&#43;03
string.format(&%E&, 1000)&&&&&&&&&&&&&&&输出1.000000E&#43;03
string.format(&%6.3f&, 13)&&&&&&&&&&&&& 输出13.000
string.format(&%q&, &One\nTwo&)&&&&&&&&&输出&One\
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&  Two&
string.format(&%s&, &monkey&)&&&&&&&&&&&输出monkey
string.format(&%10s&, &monkey&)&&&&&&&&&输出&&& monkey
string.format(&%5.3s&, &monkey&)&&&&&&& 输出& mon
在魔兽世界中还有另一个string.format()参数, 允许不按后面的列出顺序读取参数. 在这种情况下, 使用参数的排位&#43;$符号来指定特定的参数.
(此语句在非WoW的Lua编译器中将不能正确运作. 请使用WoWLua或Lua511WoW)
& print(string.format(&%2$d, %1$d, %d&, 13, 17))
17, 13, 13
如果设定了$参数, 其必须紧接在%符号之后, 并且所有的后续参数(在这里指13, 17)都必须被访问; 换言之如果有3个参数, 不能只使用1$和3$. 可以混用含有$和不含$的转义符; 不含$的转义符将自动从参数列表的头部开始获取数据.
$参数在实现本地化中非常方便. 在不同的语言中, 特定的名词可能会以不同顺序出现. 使用带有$参数的&#26684;式字符串, 可以使不同语言版本的客户端共用相同的参数列表.
例如下面这句游戏提示:
Cladhaire's Shadow Word: Pain is removed.
在德语版客户端中是这样写的:
'Shadow Word: Pain' von Cladhaire wurde entfernt.
在英文版中技能(暗言术·痛)出现在角色名称(Cladhaire)之后, 但在德语版中顺序正相反. 如果参数列表中角色名称是排在技能名称之前, 可以为不同的客户端分别写出如下的&#26684;式字符串:
英文版: %s's %s is removed.
德文版: '%2$s' von %1$s wurde entfernt.
这样只要向string.format()传入不同的&#26684;式字符串即可, 不需重写具有不同参数次序的语句.
字符串配对
书写插件经常会遇到的一个问题是: 如何处理游戏提供的文本并从中配对获取所需的信息. Lua提供了一系列的函数, 这些函数可以根据给定的配对表达式, 和给定的字符串配对, 并处理成功配对的部分.
配对表达式支持以下的字符类:
单个字符(除^$()%.[]*&#43;-?外): 与该字符自身配对
.(点): 与任何字符配对
%a: 与任何字母配对
%c: 与任何控制符配对(例如\n)
%d: 与任何数字配对
%l: 与任何小写字母配对
%p: 与任何标点(punctuation)配对
%s: 与空白字符配对
%u: 与任何大写字母配对
%w: 与任何字母/数字配对
%x: 与任何十六进制数配对
%z: 与任何代表0的字符配对
%x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*&#43;-?)的配对问题, 例如%%与%配对
[数个字符类]:&与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
[^数个字符类]: 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对
(还有一个转义码是%f. %f被称作Frontier Pattern, 因为没有被写入Lua的标准文档中. 有兴趣的朋友可以看)
当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对.
配对表达式是由上述字符类代号加上特定选项构成的, 这些特定选项包括:
不加任何选项(例如&%a&): 与单个该类字符配对
后接*号(例如&%a*&): 与0个或更多该类字符配对. 只与给定字符串中符合要求的最长子串配对.
后接&#43;号(例如&%a&#43;&): 与1个或更多该类字符配对. 只与给定字符串中符合要求的最长子串配对.
后接&#43;号(例如&%a-&): 与0个或更多该类字符配对. 只与给定字符串中符合要求的最短子串配对.
后接?号(例如&%a?&): 与0个或1个该类字符配对.
配对表达式还可包含以下两个成员:
%bxy: 其中x, y是字符. 与x开始, y结束, 并且x, y在字符串中平衡配对的字符串配对.
平衡配对表示: 设一初始&#20540;为零的计数器, 从给定字符串左侧至右侧逐个读取字符, 每读取一个x, 计数器&#43;1, 每读取一个y, 计数器-1, 那么最后一个y恰好是第一个使计数器归零的y.
也可以说, 在%bxy成功配对的字符串中, 找不到更短的子字符串使其满足%bxy配对.
%n: 其中n是1~9的数字. 与捕获(见下文)的第n个配对字串配对.
例如: 给定字串&abc ABC 123 !@# \n \000 %&
配对表达式&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&配对结果
%a&&&&&&&&&&&&&&&&&&&&&&&&&&a b c A B C
%a*&&&&&&&&&&&&&&&&&&&&&&&& abc ABC
%a&#43;&&&&&&&&&&&&&&&&&&&&&&&& abc ABC
%a-%s&&&&&&&&&&&&&&&&&&&&&&&abc ABC
%a?&&&&&&&&&&&&&&&&&&&&&&&& a b c A B C
%ba3&&&&&&&&&&&&&&&&&&&&&&&&abc ABC 123
在配对表达式中还可以添加锚点和捕获标记.
锚点包括^和$符号, ^表示字符串起始处,&$表示字符串结束处. 例如^MYADDON:.&#43;表示以MYADDON:开头的字符串.&
出现在配对表达式中的成对的圆括号表示捕获(capture)标记. 每一对圆括号中的表达式成功配对的字符串都会被保存下来, 并且可以用%n获取(参见前文). 由于圆括号可以嵌套, 因此圆括号的编号顺序是以左括号为准的, 按左括号的出现先后顺序编号. 例如配对表达式&(a*(.)%w(%s*))&中,a*(.)%w(%s*)会被存为1号捕捉结果, .和%s*则分别是2号、3号捕捉结果.
以下是一些混合应用各种配对表达式成员的例子:
表达式&&&&&&&&&&&&&& 配对结果
%S&#43;&&&&&&&&&&&&&&&&与原字串所有非空白成员配对(即被空&#26684;隔开的每个部分)
^MYADDON:(.)&&&&&&&与所有MYADDON:开头的字符串配对, 并且捕获其后的部分
(%d&#43;%.?%d*)&&&&&&&&与所有含有或不含有小数部分的数字配对, 并捕获整个数字
(%w&#43;)=(%S&#43;)&&&&&&&&与所有左侧由数字字母组成, 右侧由无空&#26684;字串组成的等式配对,&
&&&&&&&&&&&&&&&&&&&并分别捕获等式的两侧.
%b''&&&&&&&&&&&&&&&与所有单引号内的字符串配对(包括单引号本身)
%S&#43;$&&&&&&&&&&&&&&&与原字串的最后一个非空白成员配对
利用配对表达式的主要有以下几个函数: string.gmatch(str, pattern), string.gsub(str, pattern, repl, n), string.match(str, pattern, init), string.find(str, pattern, init, plain). 为简化书写, 也可以用之前在Lua的面向对象提过的方式直接通过字串自身调用这些函数(e.g. str:gmatch(pattern)).
string.gmatch(str, pattern)
之前已经提过了, 这是一个返回迭代器的函数. 实际的用例如下:
s = &hello world from Lua&
for w in string.gmatch(s, &%a&#43;&) do
 print(w)
这里是一个捕获并将配对字符分别存到不同变量的例子:
s = &from=world, to=Lua&
for k, v in string.gmatch(s, &(%w&#43;)=(%w&#43;)&) do
for k, v in pairs(t) do
 print(k, v)
string.gsub(str, pattern, repl, n)
string.gsub()函数根据给定的配对表达式对源字符串str进行配对, 同时返回源字符串的一个副本, 该副本中成功配对的所有子字符串都将被替换. 函数还将返回成功配对的次数.
实际的替换行为由repl参数的类型决定:
当repl为字符串时, 所有成功配对的子字符串均会被替换成指定的repl字串.
当repl为table时, 对每个成功配对的子字符串, 函数均会试图寻找以其为key&#20540;的table中的元素, 并返回该元素. 如果该配对包含任何捕获信息, 则以编号为1号的捕获作为key&#20540;进行查找.
当repl为函数时, 每个成功配对的子字符串均会作为参数被传入到该函数中去.
在repl是table或函数时, 如果该table或函数返回了字串或数字的&#20540;, 这个&#20540;依然会被用于替换副本字串中的配对子字串. 如果该table/函数返回的&#20540;为空, 将不发生替换.
n参数可选, 当它被指定时, string.gsub()函数只对源字符串中的前n个成功配对的成员进行操作.
以下是几个例子:
& print(string.gsub(&hello world&, &(%w&#43;)&, &%1 %1&))
hello hello world world 2
& print(string.gsub(&hello Lua&, &(%w&#43;)%s*(&w&#43;)&, &%2 %1&))
Lua hello 1
& string.gsub(&hello world&, &%w&#43;&, print)
hello world 2
& lookupTable = {[&hello&] = &hola&, [&world&] = &mundo&}
& print(string.gsub(&hello world&, &(%w&#43;)&, lookupTable))
hola mundo 2
string.match(str, pattern, init)
string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1.
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil.
string.find(str, pattern, init, plain)
string.find()寻找源字串str中的第一个成功的配对, 并返回配对子字符串的起点和终点位置. 若没有成功的配对, 则返回nil. 参数init可选, 指定搜寻过程的起点, 默认为1,可以是负数; plain参数可选, 是个布尔&#20540;, 默认为false, 如果指定为true, 则pattern被视作普通字串(plain string), 在进行查找时,&所有其中的转义符和功能文字全部视作普通文本. 注意如果指定plain, 也必须同时指定init.
如果在配对表达式中设置了捕获标记, 函数将在返回两个位置数&#20540;后继续返回捕获结果.
魔兽世界对Lua新增的函数
以下函数是魔兽世界的插件界面额外增加的. 普通的Lua编译器可能不支持这些函数.
strsplit(sep, str)
strsplit()函数按给定的分隔符sep分割源字符串str并依序返回分割所得的每个部分. 等同于string.split(sep, str).
& print(strsplit(&:&, &foo:bar:blah&))
foo bar blah
& print(string.split(& &, &This is a string&))
This is a string
strjoin(sep, ...)
strjoin()函数将后续参数列表的所有字串依次连接起来, 并以分隔符sep两两隔开. 等同于string.join(sep, ...).
& print(strjoin(& &, &This&, &is&, &a&, &string&))
This is a string
& print(string.join(&, &, &alpha&, &beta&, &gamma&))
alpha, beta, gamma
strconcat(...)
strconcat()连接参数列表中的所有字符串, 并返回连接结果. 等同于string.concat(...).
& print(strconcat(&This&, &is&, &a&, &string&))
Thisisastring
getglobal(name)
获取名字为name的全局变量的&#20540;并返回该&#20540;. 在魔兽世界的界面编程中, 广泛地用于处理父框架和子框架共存时的变量问题.
setglobal(name, value)
将名为name的全局变量的&#20540;设为value. 同样是在默认魔兽界面中被广泛应用的函数.
debugstack(start, count1, count2)
调试用函数.&三个参数均是可省略的.
start: 指定堆栈深度, 追踪过程将从这里开始(默认为1)
count1: 指定达到栈顶时函数返回的&#20540;(默认为12)
count2: 指定达到栈底时函数返回的&#20540;(默认为10)
此函数只能在魔兽世界中正常工作. 普通的Lua中有其他用于追踪堆栈内容的方法.
在WoW中, 大量常用的库函数均拥有别名, 以简化书写. 以下是所有别名及其对应的函数
别名&&&&&&&&&&&&&&&&&&函数&&&&&&&&&&&&&&&&&&&&&&& 别名&&&&&&&&&&&&&&&&&&函数
abs&&&&&&&&&&math.abs&&&&&&& &tan&&&&&&&&&&math.tan
acos&&&&&&&&&math.acos&&&&&& &format&&&&&& string.format
asin&&&&&&&&&math.asin&&&&& &&gmatch&&&&&& string.gmatch
atan&&&&&&&& math.atan&&&&&&& gsub&&&&&&&& string.gsub
atan2&&&&&&& math.atan2&&&& &&strbyte&&&&&&string.byte
ceil&&&&&&&& math.ceil&& &&&&&strchar&&&&&&string.char
cos&&&&&&&&&&math.cos&&&&&&& &strfind&&&&&&string.find
deg&&&&&&&&&&math.deg&&&&& &&&strlen&&&&&& string.len
exp&&&&&&&&&&math.exp&&&&&&& &strlower&&&&&string.lower
floor&&&&&&& math.floor&& &&&&strmatch&&&&&string.match
frexp&&&&&&& math.frexp&&&&&& strrep&&&&&& string.rep
ldexp&&&&&&& math.ldexp&&&&& &strrev&&&&&& string.reverse
log&&&&&&&&& math.log&&&& &&&&strsub&&&&&& string.sub
max&&&&&&&&& math.max&&&&&&&& strupper&&&&&string.upper
min&&&&&&&&& math.min&&&&&&&& foreach&&&&&&table.foreach
mod&&&&&&&&&&math.fmod&&&& &&&foreachi&&&&&table.foreachi
rad&&&&&&&&&&math.rad&&&&&&&& getn&&&&&&&&&table.getn
random&&&&&& math.random&&&&& sort&&&&&&&& table.sort
randomseed&& math.randomseed& tinsert&&&&& table.insert
sin&&&&&&&&&&math.sin&&&&&&&&&tremove&&&&&&table.remove
sqrt&&&&&&&&&math.sqrt
这些表函数同样可以参考Lua表库 (他们都是以&table.开头&, 查阅Table库 f了解更多信息).
也知道, 很多表都被设计为只有数字索引, 开始于1并且没有结尾(如like {[1] = &foo&, [3] = &bar&} --- [2]是不存在的所以为nil&#20540;).工作时,与任何其他表并没有差别,但很可能会产生意想不到的结果. 在编写lua中, 这个也就是通常所说的bug
foreach(table,function) - 为表中的每个元素执行函数
foreachi(table,function) - 为表中的每个元素执行函数, 按顺序访问(不推荐, 可以使用ipairs代替)
getn(table) - 当作为一个聊表时, 返回当前表的大小. 现在已经废弃了, 你可以直接使用#符号.使用#(table)代替table.getn(table)
ipairs(table) - 返回一个迭代型整数遍历表。
pairs(table) - 返回一个迭代遍历表
sort(table[, comp]) - 对一个数组进行排序, 还可以指定一个可选的次序函数
tinsert(table[, pos], value) - 将一个元素插入指定的位置(默认在表的最后)
tremove(table[, pos]) - 删除指定位置的元素(默认表最后一个)
&------------------------------------------------------------------------------------------------
Lua5.1中数学库的所有函数如下表:
math.pi 为圆周率常量 = 3.
取绝对&#20540;
math.abs(-15)
反余弦函数
math.acos(0.5)
反正弦函数
math.asin(0.5)
x&/&y的反正切&#20540;
math.atan2(90.0,&45.0)
反正切函数
math.atan(0.5)
不小于x的最大整数
math.ceil(5.8)
双曲线余弦函数
math.cosh(0.5)
math.cos(0.5)
弧度转角度
math.deg(math.pi)
计算以e为底x次方&#20540;
math.exp(2)
不大于x的最大整数
math.floor(5.6)
fmod&(mod)
math.mod(14,&5)
把双精度数val分解为数字部分(尾数)和以2为底的指数n,即val=x*2n
math.frexp(10.0)
0.625&&&&4
计算value&*&2的n次方
math.ldexp(10.0,&3)
80&=&10&*&(2&^3)
计算以10为基数的对数
math.log10(100)
计算一个数字的自然对数
math.log(2.71)
取得参数中最大&#20540;
math.max(2.71,&100,&-98,&23)
取得参数中最小&#20540;
math.min(2.71,&100,&-98,&23)
把数分为整数和小数
math.modf(15.98)
得到x的y次方
math.pow(2,&5)
角度转弧度
math.rad(180)
获取随机数
math.random(1,&100)
math.random(100)
获取1-100的随机数
randomseed
设置随机数种子
math.randomseed(os.time())
在使用math.random函数之前必须使用此函数设置随机数种子
双曲线正弦函数
math.sinh(0.5)
math.sin(math.rad(30))
开平方函数
math.sqrt(16)
双曲线正切函数
math.tanh(0.5)
math.tan(0.5)
取绝对&#20540;
math.abs(-15)
反余弦函数
math.acos(0.5)
反正弦函数
math.asin(0.5)
x&/&y的反正切&#20540;
math.atan2(90.0,&45.0)
反正切函数
math.atan(0.5)
不小于x的最大整数
math.ceil(5.8)
双曲线余弦函数
math.cosh(0.5)
math.cos(0.5)
弧度转角度
math.deg(math.pi)
计算以e为底x次方&#20540;
math.exp(2)
不大于x的最大整数
math.floor(5.6)
fmod&(mod)
math.mod(14,&5)
把双精度数val分解为数字部分(尾数)和以2为底的指数n,即val=x*2n
math.frexp(10.0)
0.625&&&&4
计算value&*&2的n次方
math.ldexp(10.0,&3)
80&=&10&*&(2&^3)
计算以10为基数的对数
math.log10(100)
计算一个数字的自然对数
math.log(2.71)
取得参数中最大&#20540;
math.max(2.71,&100,&-98,&23)
取得参数中最小&#20540;
math.min(2.71,&100,&-98,&23)
把数分为整数和小数
math.modf(15.98)
得到x的y次方
math.pow(2,&5)
角度转弧度
math.rad(180)
获取随机数
math.random(1,&100)
math.random(100)
获取1-100的随机数
randomseed
设置随机数种子
math.randomseed(os.time())
在使用math.random函数之前必须使用此函数设置随机数种子
双曲线正弦函数
math.sinh(0.5)
math.sin(math.rad(30))
开平方函数
math.sqrt(16)
双曲线正切函数
math.tanh(0.5)
math.tan(0.5)
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:71177次
排名:千里之外
转载:77篇
评论:15条
(1)(1)(1)(1)(5)(3)(1)(2)(1)(1)(3)(2)(8)(15)(5)(2)(10)(18)}

我要回帖

更多关于 lua wow 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信