关于魔兽争霸lua 调用typeoflua的问题

由于我是用LuaTool 工具环境运行lua代码得嘚 所以将生成的dll文件放在了其bin下 如下图所示

上面所有压入的不同类型的值其实在lua中都是用一个类型所集合的 就是TValue这样一个结构体 它对应luaΦ的所有数据类型 是一个{值,类型}结构 这就是lua的动态类型实现 将值和类型绑定在一起 用tt记录value的类型 value是一个联合体 联合体有四个域

1.所有lua中的徝由lua自己管理 C++/C并不知道 并且他们其中的值Lua也不知道 如果C++/C要lua中的东西 由lua产生放到栈上 C++/C通过API接口获取这个值

2.凡是lua的变量 lua负责这些变量的生命周期和垃圾回收 

 
//lua 调用typeoflua中的函数
//获取lua中的字符串
 
需要注意的是 堆栈操作是基于栈顶的 他只会操作栈顶的值 lua中-1永远指向栈顶 1永远指向栈底
}

关于插件以前在nga上看人说,老外大多用单体插件国内大多用整合插件。

不论是单体还是整合后者是默认的UI,总是会有自己觉得不舒服的地方那么就自己来动手微調一下吧。

首先来举一个例子:比如盗贼的能量默认是在血条的下方,打怪的时候经常要斜着眼睛瞄着那里很不利于身心健康,所以峩们想把它放到中间来

盗贼能量移动代码如下做成宏就可以了。(说明:这个例子不是我自己写的原贴来自nga)

不过提供宏不是我们的目的,我们的目的是要知道如何来写类似的宏所以老胡来解释一下这4行代码的含义:
1、先说每行都有的这个PlayerFrameManaBar,上节课《老胡lua随笔——5)魔兽插件介绍如何编写一个魔兽插件》里面,我们用到了一个frame目的是做事件监控,这里的PlayerFrameManaBar也是一个Frame是一个UI类的Frame,他就代表着玩家的Mana條对于盗贼来说就是能量条,对于其他职业来说可能是蓝条、怒气等等

有同学可能要问了,你怎么猜到蓝条是PlayerFrameManaBar的如果我想搞血条怎麼办,有没有一个字典答案是没有,但是blz提供了一个更好的宏/fstack

在聊天框输入这个命令之后鼠标移动到任意的界面上,就会提示当前frame的洺字(注意只针对全局frame,局部frame的名字是动态生成的所以可能是一堆数字之类的,那种就不行了)

2、然后来说第二行的SetPoint这个方法(第一荇等下说)这个方法是用来调整UI的位置,这个方法有两种用法我们来一一介绍:

一般来说,我们会像下面这样来定位一个窗口指定怹的左上角与屏幕左上角的距离,对魔兽来说UIParent代表着屏幕窗体所以可以这样写。

lefttop大家应该理解了,但是这两个TOPLEFT 是什么鬼

第一个TOPLEFT指的昰当前frame的左上角,第二个TOPLEFT指的是UIParent的左上角合起来,就是说frame左上角的点距离UIParent左上角是100,80。想想一下两本书一个大一个小,先左上角对齐然后把小的那本,往右100再往下80。

下面再来说一个例子请思考,如果我想把一个方块放到另一个方块的右边怎么做?


按照刚才的思蕗先把两本书的左上角对齐,然后往右移动Frame1宽度的距离就行了因为是顶部对齐,所以不用往下移动所以这样就可以了。

再来一个這就需要不但往右,还要往下往下的距离是两个frame的高度差。

说明上面的Frame1:GetHeight()-Frame2:GetHeight()应该是不对的,上面我们说过向下是负数,所以应该取一个負但是这里不是我们的关键,请忽略这个我们只讲思路,正负问题留给你去尝试了多试才能会啊。

经过上面几个例子我们应该有點会了,但是老胡告诉你我们上面的代码实际上是很low的,来我们来看一下这个方法的完全体:

比如刚才这个例子我们刚才是说,先左仩角对齐然后Frame2往右移动Frame:GetWidth()的距离,但是我们也可以想象成我直接用Frame2的左上角,对齐Frame1的右上角然后不移动,对比一下这两种的写法:

然後下面这个就是2的左下,对齐到1的右下


2的中间点对齐到1的中间点(想象一下如果都用TOPLEFT,是不是繁琐了不少)

回顾一下我们开头的例子能量条的中间点,对齐到UIParent的中间点然后往右移动0,往下移动80

好SetPoint方法就啰嗦到这里。到这里大家应该发现了我上面提到说有两种用法,绝对定位和相对定位实际上并没有,只有相对定位这一种(完事无绝对啊)绝对定位,其实就是相对于屏幕而屏幕本身也是一個frame,叫UIParent记住了,这个名字很常用

3、再回到最初的例子,来说最后几个这几个就简单了。

第一行ClearAllPoints,跟SetPoint刚好相反是用来删掉frame之前设置的Point,因为后设置的Point并不会直接覆盖前面的也就是说可以设置多个Point(多个Point的用法老胡也没用过),一般来说我们设置新的Point之前,需要紦旧的删掉所以无脑加一下就行了。

第三行SetScale是设置frame的尺寸1是原本的大小,0.9就代表只有原来的0.9倍大小1.2就代表放大到1.2倍

第四行SetAlpha,是设置透明度1是完全不透明,0.1~0.9是半透明越小越透明,0就看不见了

好啦,今天就写到这里SetPoint部分比较啰嗦,还望大家耐心有问题可以找我討论哦。

}

我要回帖

更多关于 lua 调用typeof 的文章

更多推荐

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

点击添加站长微信