LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
查看: 19014|回复: 23

(转自贴吧)lua语言基础入门教学,献给那些爱学习的好孩子

[复制链接]
发表于 2017-2-16 08:53:22 | 显示全部楼层 |阅读模式
本帖最后由 扑满 于 2017-2-16 09:29 编辑

Lua脚本在魔兽世界里的应用不仅限于做宏,我们使用的插件也都是用lua脚本做出来的,所以学习了lua不仅可以做到比一般宏更强大的宏,还能做插件,当然这个帖子是为做宏,想做插件的朋友还需参见其他文章。这篇文章是自己通过编程知识写的科普扫盲贴。API库是从网上查阅各处资料并整改而成,有不足或错误之处请指出并轻喷,谢谢。
================================我不是分割线,我是中出线==================================
先来说说Lua的语法,会C语言的朋友请看http://wenku.baidu.com/view/c3b56c3467ec102de2bd89ef.html,不会的就看我整理的通俗版吧。

做脚本宏,其本质就是编程,只不过在编以魔兽世界为平台和限制的程序,所以要想做出好的脚本宏,根本问题就是建立和提高编程的思维,由于魔兽世界脚本的限制很大,无法展现编程的全貌,所以大家有兴趣可以钻研一门真正的计算机编程语言以提高编程思维。

在魔兽世界lua的脚本宏中,是用

/script [宏语句]

来执行宏的,在下面的代码中,我就不写整个宏(一个一个在前面加/script)了,直接把宏语句写出来。

由于TBC后加入的许多限制,而且又有限制字数,无法自由写出所有功能,但是理论上我们还是要一观宏的全貌,把思维角度放在被砍前的脚本宏上,并在实际编写宏时,学会巧妙地绕过一些被禁用的语句,和判断此种功能是否能直接用宏制作出来,甚至是结合按键精灵做出超能力的宏。



一、基本语法

下面我对lua的基本语法作一个介绍,初学的朋友一定要仔细看好每一个字,认真分析好代码的每一个语句,会编程的朋友可以略看,在20秒钟内略览完所有内容,在实际编写的时候用到什么查什么,并且可以温故而知新。

1、赋值语句,在lua编程中,一切都是在处理变量,我们要定义变量并指定这个变量的值,这个指定变量的值的过程叫做赋值

[变量名]=[值]

这个语句的作用是把变量的值变成[值],如a=1就是把变量a的值指定为1

[变量名1],[变量名2],[变量名3]……[变量名n]=[值1],[值2],[值3]……[值n]

这个语句相当于

[变量名1]=[值1]

[变量名2]=[值2]

[变量名3]=[值3]

……

[变量名n]=[值n]

比如a,b,c,d,e=14,20,93,61,0相当于

a=14

b=20

c=93

d=61

e=0

2、条件判断语句,也就是如果什么什么条件成立,就做什么什么事,甚至是否则做什么事。



最简单的就是下面的:



if [做这件事的条件] then
     [要做的事]
end



即如果[做这件事的条件]成立则做[要做的事]

还可以加一个else表示否则做什么事:

  

if [做这件事的条件] then

     [要做的事]

else

     [否则做的事]

end



即如果[做这件事的条件]成立则做[要做的事],否则做[否则做的事]

有时需要根据多种情况决定如何做,就会用到elseif:

if [做A事的条件] then

     [A事]

elseif [做B事的条件] then

     [B事]

else

     [否则做的事]

end



就是先判断[做A事的条件]是否成立,成立就做[A事],如果不成立,就判断[做B事的条件],如果成立,就做[B事],如果还不成立,就做[否则做的事],这样写相当于:



if [做A事的条件] then

     [A事]

else

     if [做B事的条件] then

         [B事]

else

         [否则做的事]

     end

end



由此可见,如果[做A事的条件]和[做B事的条件]同时成立,只会做B事,如果要A事B事都做,就只能分开写:



if [做A事的条件] then

     [A事]

end

if [做A事的条件] then

     [A事]

end



注意elseif可以有多个,

比如

if [做A事的条件] then

     [A事]

elseif [做B事的条件] then

     [B事]

elseif [做C事的条件] then

     [C事]

elseif [做D事的条件] then

     [D事]

else

     [否则做的事]

end

举例:一个小德的宏,知道一个变量a的值有1,2,3,4,5,6,7这几种情况,如果a=1就变熊,2就猫,3就树,4鸟,5陆地,6飞行,7水下。

if a=1 then

     [变熊,具体代码这里不细写]

elseif a=2 then

     [变猫]

elseif a=3 then

     [变树]

elseif a=4 then

     [变鸟]

elseif a=5 then

     [变陆地坐骑]

elseif a=6 then

     [变飞行形态]

else

     [变水下形态]

end

3、循环语句

有时会出现需要对一组事物进行相似的操作,为了简便,我们可以将它写成循环。

举例:法师要给整个小队刷奥术增效,假设奥术增效没有公共CD。

for i=1,5,1 do

     [给小队第i个队员刷奥术增效]

end

这个脚本就可以执行循环,具体原理就是这个循环语句

for [循环变量]=[初始值],[终点值],[步进值] do

     [要重复做的事]

end

[循环变量]可以粗略的理解为指示目前循环了第几次的变量,我们开始一般会为它指定[初始值]为1,每个循环结束都会把循环变量加上一个[步进值],步进值一般是1,也就是[循环变量]每次循环都会加1,所以第一次循环[循环变量]是1,第二次是2,第N次是N。直到[循环变量]超过[终点值]时停止循环,在上例中,第五次循环时,i=5,这个循环结束后,i值变成6,超过了终点值5,所以不会进行第6次循环。注意这个[循环变量]如果前面没有定义或赋值,则是循环中的局部变量,既只有在循环中才能使用,出了循环[循环变量]就没有了。而且,如果不写[步进值]的话,[步进值]默认为1。为了简单思维,我们可以套用

for i=1,[循环次数] do

     [要循环做的事]

end

的格式,[循环次数] 是多少,循环就会执行多少遍,并且第x次循环时,i的值是x。

注意!!如果未经认真思考,在循环中改变i的值,将会产生不可预知的后果,甚至有可能产生死循环,导致死机!

在上面的循环中,只能给小队的每一个人上Buff,如果要给全团上Buff该怎么办呢,请看下面代码(假设是个25人团,5个小队)。

for j=1,5 do

     for i=1,5 do

         [给第j小队第i个队员刷奥术增效]

     end

end

这是一个新手接触可能有点费解的两层循环,这个代码执行时,第j次循环就代表给第j个小队全队刷buff(外层循环),具体给这个小队的每一个人刷Buff就又进行了一层循环(内层循环),挨着个给每个队员刷Buff,当刷完第一队第5个人的buff时,内层循环结束,外层进入第二次循环,然后又开始进行内层循环,给第二队每人挨着个刷Buff。这样外循环5次*内循环5次,也就是说这个两层循环把刷奥术增效这个动作循环了25次,给25人团每个人刷上了Buff。


回复

使用道具 举报

 楼主| 发表于 2017-2-16 08:54:33 | 显示全部楼层
本帖最后由 扑满 于 2017-2-16 08:58 编辑

不仅仅是可以2层循环,还有多层循环,只要机器坚持得下来,多少层都可以。举个极端点的例子,屠城团组了3个团,我们要给所有人上奥术增效,就只有这样写了:

for k=1,3 do

     for j=1,5 do

         for i=1,5 do

             [给第k团第j小队第i个队员刷奥术增效]

         end

     end

end

当然这些例子举得有些牵强,实际中是很少用到的。

上面的For循环语句非常的简便易用,但有时我们需要自己控制无法预知次数的循环或循环条件非常复杂的循环,就需要一个基本的循环语句:

while [循环条件] do

     [要循环做的事]

end

这个循环语句是在每次循环开始前检查循环条件,如果成立就进行一次循环,然后再检查循环条件,一旦不成立,整个循环就结束了。

所以

i=1

while i<=[循环次数] do

     [要循环做的事]

     i=i+1

end



for i=1,[循环次数] do

     [要循环做的事]

end

效果是一样的。

如果我们不在循环开始前检查循环条件,而是在循环一开始就检查循环条件,就需要Repeat语句。

repeat

     [要循环做的事]

until [循环条件]

这个语句与while不同的是,系统会在循环执行后检查循环条件,而不是循环执行前就检查。

循还中有时会需要遇到无视循环条件直接退出循环的情况,就需要break语句直接跳出循环。住注意此处的跳出循环是指遇到break语句直接掠过后面的语句跳到循环后,而不是执行完这一次循环后无视条件结束循环。

下面有一例,如何在团队中随便找到一个DK,这里考虑了任何人数组合的团队,这个例子中用到了--来作注释,即注释中的话都是用的来说明语句作用的,是给人看的,不是给电脑执行的。

--我们这里用循环来搜索整个团队中的所有小队,看小队中有没有DK,如果有便找到了,没有便搜索下一个小队。

i=1

j=1

--上面定义循环变量,并赋值为1。

while i<=[团队的小队数] do --按照团队中小队的数量自动分配循环次数,即小队数就是循环次数,每个循环搜索一个小队。

     j=1 --将内循环的变量重置到1,不然外循环第二次时内循环就会出错,因为此时内循环变量j还是上一个外循环中内循环保留下来的值

     while j<=[第i小队的人数] do --进行内循环搜索这个小队,小队人数就是循环次数,即为小队中的每一个人循环一次,每一次循环判断这个人是否是DK,如果是便找到了,不是便循环下一次来看下一个人。

         if [第i队第j人是DK] then

             break --这个人是DK就说明找到了,下面的循环没有意义了,所以跳出,而且此时j值刚好是这个DK所在小队的第j位。

         end

         j=j+1 --如果这个小队中,没有DK,这个循环将正常进行,不会遇到break语句,循环结束后的j值将大于[第i小队的人数],如果找到了DK,j值会在[第i小队的人数]以内。

     end

     if j<=[第i小队的人数] then --通过上述的j值是否大于[第i小队的人数],判断是否找到了DK,如果找到了DK,就直接break出外循环,而此时i值刚好等于该DK所在的小队编号。

         break

     end

     i=i+1

end

if i<=[团队的小队数] then --同理,如果i值大于小队数,则整个团里没有DK。

     [这里是找到DK后所做的事,该DK在第i小队第j个位置]

else

     [这里是找不到DK后所做的事,此时i和j的值都指向一个不存在的位置]

end

大家可以看到,在无序的列表中对单个结果的查找最基本的方法就是循环+跳出,这样的代码在限制了字数的宏中可谓非常无力,不过这里只是把前面讲述的知识归纳并举的一个例子,在实践,消化这些语句的同时,也能帮助初步形成编程的思维。

二、函数库(API)

在WOW的lua脚本中,该怎么用代码实现控制各种行为与设置,做出我们想要的功能呢?这需要使用到Wow专门为这些功能设置的函数接口,简单来说就是脚本的眼睛鼻子耳朵,我们上面介绍的语句就像大脑一样,先想好该做什么,然后调用API函数做事。我们调用函数的基本语法就是

[函数名]([参数1],[参数2],[参数3],[参数4],[参数5]……[参数n])

比如

a=30

b=sin(a)+0.5

运行后b=1,这里的sin便是函数,我们可以引入数学的思维理解这样的函数。再比如

OpenAllBags()
这个函数没有参数,直接运行,功能是打开所有背包。这样的函数我们可以理解为命令。注意这些函数不能省略(),否则函数无法运行。再比如

ActionButtonDown(abs(3-5))

运行后按下动作条2号键,这说明函数的调用本身可以作为另一个函数的调用参数。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-16 08:57:21 | 显示全部楼层
本帖最后由 扑满 于 2017-2-16 09:31 编辑

下面有一个API字典,是通过首字母排序的,每个函数都有用法的举例,大家不用一一读完,只需在需要时查函数和使用方法自学就行了,这个API在网上搜到后有整改,把一些错误的地方改掉了。
********************************************************************************************
                                             全局函数
********************************************************************************************
函数信息

AbandonQuest();
返回值:
示例: AbandonQuest();
描述: 放弃指定任务


AbandonSkill(index);
返回值:
示例: AbandonSkill(index);
描述: 丢弃一个技能;该方法需要传递一个参数index,index为技能在技能表中的索引.


abs(number)
返回值: Number
示例: abs(-22);
描述: 返回一个数的绝对值


AcceptDuel();
返回值:
示例: AcceptDuel();
描述: 接受一个PK 邀请


AcceptGroup()
返回值:
示例: AcceptGroup()
描述: 接受加入一个组队.


AcceptGuild()
返回值:
示例: AcceptGuild()
描述: 接受公会邀请。


AcceptResurrect();
返回值:
示例: AcceptResurrect();
描述: 接受另一个玩家对自身的复活魔法.


AcceptXPLoss();
返回值:
示例: AcceptXPLoss();
描述: 接受天使姐姐的虚弱复活


acos(number)
返回值: Number
示例: myangle = acos(1);
描述: 返回一个比值的反余弦值.(按角度计算)


ActionButtonDown(buttonID);
返回值:
示例: ActionButtonDown(1);
描述: 鼠标按下指定的活动按钮.该函数需要一个参数,buttonID 参数为活动按钮的ID


ActionButtonUp(buttonID)
返回值:
示例: ActionButtonDown(1);
描述: 鼠标弹起指定按钮.该函数需要一个参数,buttonID 参数为活动按钮的ID


AddChatWindowChannel(identifier, channel);
返回值:
示例: AddChatWindowChannel(chatFrame:GetID(), channel);
描述: 添加一个聊天频道到聊天窗口.该方法需要两个参数,一个参数为聊天窗口的标识,另一个为要添加的频道名.


AddChatWindowMessage(identifier, group)
返回值:
示例: AddChatWindowMessages(chatFrame:GetID(), group);
描述: 添加一个消息组到聊天频道.


AddFriend(FriendName);
返回值:
示例: AddFriend(editBox:GetText());
描述: 添加好友到好友列表.


AddFriend(name)
返回值:
示例: AddFriend("kelthan");
描述: 添加指定的好友到你的好友列表.


AddIgnore(UserName);
返回值:
示例: AddIgnore(editBox:GetText());
描述: 添加玩家到忽略列表(黑名单).


AddOrDelIgnore(name);
返回值:
示例: AddOrDelIgnore("Marco");
描述: 忽略指定玩家状态.


AddTradeMoney()
返回值:
示例:
描述: 添加金钱到交易窗.


AddTradeMoney();
返回值:
示例: AddTradeMoney();
描述: 添加金钱到交易窗时触发该事件.


asin(number)
返回值: Number
示例: myangle = asin(1);
描述: 返回一个比值的反正弦值.(按角度计算)


AssistByName(target)
返回值:
示例: AssistByName("Marco");
描述: 援助一个玩家.


AssistUnit(target)
返回值:
示例: AssistUnit("target");
描述: 援助指定单位.


AssistUnit(targetcode);
返回值:
示例: AssistUnit("target");

描述: 瞄准一个可瞄准的目标.


atan(number)
返回值: Number
示例: myangle = atan(1);
描述: 返回一个比值的反正切值.


atan2(numberx, numbery)
返回值: Number
示例: myangle = atan2(1,2);
描述: 返回X/Y的反正切值.


AttackTarget();
返回值:
示例: AttackTarget();
描述: 攻击当前目标.


AutoEquipCursorItem()
返回值:
示例: if ( button == "LeftButton" ) then AutoEquipCursorItem(); end
描述: 自动装备鼠标指向的装备上.


AutoEquipCursorItem();
返回值:
示例: AutoEquipCursorItem();
描述: 自动装备鼠标指向的物品.


BankButtonIDToInvSlotID(indentifier,bankboject)
返回值: Identifier
示例: BankButtonIDToInvSlotID(this:GetID(),this.isBag)
描述: 返回银行按钮标识.


BeginTrade();
返回值:
示例: BeginTrade();
描述: 开始交易.


BonusActionButtonDown(buttonID);
返回值:
示例: BonusActionButtonDown(1);
描述: 触发指定的动作按钮(宠物或战斗宠物).


BonusActionButtonUp(buttonID);
返回值:
示例: BonusActionButtonUp(1);
描述: 释放指定的动作按钮(宠物或战斗宠物).


CancelDuel()
返回值:
示例: CancelDuel()
描述: 拒绝PK 邀请


CancelDuel();
返回值:
示例: CancelDuel();
描述: 取消与指定玩家对战.


CancelLogout()
返回值:
示例: CancelLogout()
描述: 取消登出.


CancelPendingEquip(slot);
返回值:
示例: CancelPendingEquip(slot);
描述: 取消装备一个物品.(拖拽方式)


CancelPlayerBuff(index)
返回值:
示例: CancelPlayerBuff(0);
描述: 取消指定玩家的索引.


CancelTrade();
返回值:
示例: CancelTrade()
描述: 取消交易.


CancelTradeAccept();
返回值:
示例: CancelTradeAccept();
描述: 取消当前交易时触发该事件.


CanOpenPanels()
返回值: Boolean
示例: if ( CanOpenPanels() ) then
描述: 如果一个玩家允许你打开他的物品栏时该事件被触发.


CanSignPetition()
返回值: Boolean
示例: CanSignPetition()
描述: 如果一个玩家不在公会中那么返回true否则返回false.


CastSpell(id, SpellBookFrame.bookType);
返回值:
示例: CastSpell(id, SpellBookFrame.bookType);
描述: 通过id 查询魔法书并计算该魔法.


CastSpellByName(spellname)
返回值:
示例: CastSpellByName("Demon Skin");
描述: 释放技能、魔法。相当于/cast命令


ceil(number)
返回值: Number
示例: 1 == ceil(.8);
描述: 返回不小于number的最小整数


ChangeActionBarPage()
返回值:
示例: ChangeActionBarPage();
描述: 更新动作面板.


ChangeActionBarPage();
返回值:
示例: ChangeActionBarPage();
描述: 改变指定的动作栏到指定的页(CURRENT_ACTIONBAR_PAGE)


ChannelBan(channel,player)
返回值:
示例: ChannelBan("uimods", "alexyoshi")
描述: 从指定频道中禁止一个玩家.


ChannelInvite(channel,player)
返回值:
示例: ChannelInvite("cutestelves","glorfindel");
描述: 邀请指定玩家到聊天室.


ChannelKick(channel,player)
返回值:
示例: ChannelKick("bigllamas", "Strong_Bad_Is_Geh");
描述: 从频道踢出指定玩家.


ChannelModerator(channel,player)

返回值:
示例: ChannelModerator("uimods","Kelthan");
描述: 设置指定玩家作为频道的管理员。


ChannelMute(channel, player)
返回值:
示例: ChannelMute("uimods","zileas");
描述: 关闭指定玩家的公告技能.


ChannelToggleAnnouncements(channel);
返回值:
示例: ChannelToggleAnnouncements(channel);
描述: 设置频道广播.


ChannelUnban(channel, player)
返回值:
示例: ChannelUnban("uimods", "kat");
描述: 从指定频道中取消禁止一个玩家.


ChannelUnmoderator(channel, player)
返回值:
示例: ChannelUnmoderator("uimods", "xiphoric");
描述: 取消指定玩家作为频道的管理员。


ChannelUnmute(channel,player)
返回值:
示例: ChannelUnmute("uimods", "marco");
描述: 开启指定玩家的公告技能.


ClearTutorials();
返回值:
示例: ClearTutorials();
描述: 移除指南Popup 窗


CloseBag(number)
返回值:
示例: CloseBag(0);
描述: 关闭指定的背包.


CloseTrade();
返回值:
示例: CloseTrade();
描述: 结束交易.


CloseWindows( ignoreCenter)
返回值:
示例: CloseWindows(true)
描述: 关闭当前所有已开面板.


CollapseQuestHeader(questID);
返回值:
示例: CollapseQuestHeader(questID);
描述: 折叠任务头


CollapseTrainerSkillLine(0);
返回值:
示例: CollapseTrainerSkillLine(0);
描述: 折叠交易技能栏.


CompleteQuest()
返回值:
示例: CompleteQuest()
描述: 当完成任务按钮被按下时触发该事件.


CompleteQuest();
返回值:
示例: CompleteQuest();
描述: 完成任务.


ConfirmAcceptQuest();
返回值:
示例: ConfirmAcceptQuest();
描述: 确认接受任务.(对话框Yes,No)


cos(number)
返回值: Number
示例: myx = cos(180);
描述: 返回一个角度的余弦值.


CursorHasItem()
返回值: Boolean
示例: CursorHasItem()
描述: 如果当前物品拥有图标那么返回true.


DeclineGroup()
返回值:
示例: DeclineGroup()
描述: 拒绝加入公会.


DeclineGuild()
返回值:
示例: DeclineGuild()
描述: 拒绝加入公会.


DeclineQuest()
返回值:
示例: DeclineQuest()
描述: 拒绝当前所命令的任务.


DeclineQuest();
返回值:
示例: DeclineQuest();
描述: 拒绝接受当前任务.


DeclineResurrect();
返回值:
示例: DeclineResurrect();
描述: 拒绝玩家复活自己。


deg(numberinradians)
返回值: Number
示例: myangle = sin (deg(PI));
描述: 返回一个角度的弧度值.


DeleteCursorItem();
返回值:
示例: DeleteCursorItem();
描述: 摧毁指定的物品.


DeleteGMTicket();
返回值:
示例: DeleteGMTicket();
描述: 从列表中删除GM邀请函.


DelIgnore(name)
返回值:
示例: DelIgnore("Xiphoric");
描述: 从黑名单中删除一个玩家.


DropCursorMoney()
返回值:
示例:
描述: 从指向的目标获取金钱.


Duel(name)
返回值:
示例: Duel("Boboubo Bobobo");
描述: 邀请指定玩家决斗.


EditMacro(macro, nil, nil, text, 1)
返回值:
示例: EditMacro(MacroFrame.selectedMacro, nil, nil, MacroFrameText:GetText(), 1);
描述: 编辑一个宏命令.





EquipPendingIte***ot);
返回值:
示例: EquipPendingIte***ot);
描述: 装备一个物品并等待装备成功.


exp(base, exponent);
返回值: Number
示例: if (8 == exp(2,3) ) then
描述: 返回一个数的指数值.


ExpandQuestHeader(questID)
返回值:
示例: ExpandQuestHeader(questID);
描述: 展开任务头


ExpandTrainerSkillLine(0);
返回值:
示例: ExpandTrainerSkillLine(0);
描述: 展开交易技能栏(What is this?)


FauxScrollFrame_GetOffset(frame)
返回值: Number
示例:
描述: 返回指定窗体的偏移.


FauxScrollFrame_OnVerticalScroll(itemHeight,updateFunction, startingoffset)
返回值:
示例:
描述: 调整滚轴.


FauxScrollFrame_SetOffset(frame, offset)
返回值:
示例:
描述: 设置窗体的偏移.


FauxScrollFrame_Update(frameobject, maxitemsshown, numbershownatonetime,pixelheight of each shown, highlightframe,

smallhighlightwidht,
smallhighlightheight)
返回值:
示例: FauxScrollFrame_Update(FriendsFrameFriendsScrollFrame, numFriends, FRIENDS_TO_DISPLAY, FRIENDS_FRAME_FRIEND_HEIGHT );
描述: 从一个无效的滚动框中更新一个位置.


FlagTutorial(currentTutorial);
返回值:
示例: FlagTutorial(currentTutorial);
描述: 标记一个指南为已读或正读.


floor(number)
返回值: Number
示例: 0 == floor(.8)
描述: 返回不大于number的最大整数


FollowUnit(target)
返回值:
示例: FollowUnit("target");
描述: 跟随一个单位.


FollowUnit(target);
返回值:
示例: FollowUnit("target");
描述: 跟随指定目标.


FollowUnitByName(target)
返回值:
示例: FollowByName("Beeblebrox");
描述: 跟随指定名称的单位.


ForceLogout()
返回值:
示例: ForceLogout()
描述: 强行登出.


ForceQuit()
返回值:
示例: ForceQuit()
描述: 强行退出游戏.


foreach(table)
返回值:
示例: foreach(Chatcommand) then
描述: 从一个表中枚举每一个元素.


function(object, method)
返回值: 未知
示例: this.SplitStack = function(button, split)
描述: 分离一对物品




回复 支持 反对

使用道具 举报

发表于 2017-9-21 09:26:32 | 显示全部楼层
来学习,感谢楼主分享。打算自己做试试呢
回复 支持 反对

使用道具 举报

发表于 2017-10-1 09:58:41 | 显示全部楼层
LUA还是值得学的,现在很多引擎都支持用LUA写游戏了http://www.luacn.net/thread-14460-1-1.html
回复 支持 反对

使用道具 举报

发表于 2017-10-17 13:02:17 | 显示全部楼层
最近再学习LUA,感谢分享
回复 支持 反对

使用道具 举报

发表于 2017-11-8 11:07:57 | 显示全部楼层
在学Lua   不知道能来做什么  现在是做iOS开发呢
回复 支持 反对

使用道具 举报

发表于 2018-5-26 06:52:49 | 显示全部楼层
66666666666666666666666666666
回复 支持 反对

使用道具 举报

发表于 2018-6-27 12:24:57 | 显示全部楼层
学些学习,有点C语言基础,看着还好。。。就是不知道上手后怎么样
回复 支持 反对

使用道具 举报

发表于 2018-7-5 13:36:00 | 显示全部楼层
楼主你好,请问你有WOW全部的中文API手册吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2024-3-28 09:45 PM , Processed in 0.076819 second(s), 38 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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