推荐地图:火影无级别混战推荐地图:楚汉争霸推荐地图:魔神推荐地图:人族无敌II
推荐专区:技能创作区推荐专区:WE讨论区推荐专区:模型作区推荐专区:申请公告区
发新话题
打印

申明局部变量的注意事项

申明局部变量的注意事项

PS:大家对于变量可能不会太陌生,变量分为全局变量局部变量
局部变量的用法相信大家基本上都会,那么偶就对局部变量的用法做一个小小的讲解吧。
声明格式:
引用:

    local 变量类型 变量名
    local 变量类型 array 变量名
    local 变量类型 变量名 =


我们可以在WE触发编辑器下用“自定义代码”这个动作进行局部变量的声明。
如图:


变量的类型有很多,大家可以去看下我的教程:新手入门之"Jass之路"【第一章】
***那里面有关于对常用变量类型的基本解绍!***


下面我来讲讲局变量的用应用以及限制

局部变量的用法和全局变量是一样的,只要掌握了全局变量的用法,局部变量的使用基本是可以很快地理解。
A、局部变量代替全局变量
建立一个全变局变量,名为 Lv


然后在触发中设置一个英雄的等级

这时候我们就可以在这个触发中用 局部变量 c 来代替 Lv
先将触发转化为JASS:编辑 - 转化自定义文本
(触发变为JASS后为下图,复制红色部分的代码)

然后(撤消转换)。变为原来的样子,并用自定义代码粘帖

将代码中的 udg_Lv 改为 c 就可以了,这样就是用局部代替全局的办法。


本帖最近评分记录
B、局部变量使用注意事项

局部变量的使用有以下几点是必须注意的。
  • a声明格式
  • b使用方式
  • c函数局限
  • d代入参数
一、声明格式
声明格式必须遵守“先声明,再使用”的原则。就是说,不能后使用再声明、且要在函数开始部分声明!这两点是非常重要的,违背了就会造成语法错误,到时候WE重启就自己负责了!
引用:
function TestFunc takes nothing returns nothing
      local real x = 0.00
      local real y = 0.00
      local location loc = Location(x,y)
      call SetUnitPostion(GetTriggerUnit(),loc)
      call RemoveLocation(loc)
endfunction
以上的函数,在使用 x 、y 之前,要先进行声明,然后才能使用。不能这样:
      local location loc = Location(x,y)
      local real x = 0.00
      local real y = 0.00
这种声明方法是错误的。———— 必须先在 loc 之前声明 x 、y

      local real x
      set  x = 0.00
      local real y
      set  y = 0.00
      local location loc = Location(x,y)

这种声明方法是错误的。————  必须在函数开头部分声明 x 、y 、loc 之后再进行变量赋值。
PS:以上是局部变量声明时必须注意的地方,要使局变量,就必须先在函数开头部分进行声明之后才可以使用。

二、使用方法

局部变量也是变量,使方法和全局变量关不多,赋值时要遵守局部变量的声明原则,在变量声明完之后才能对变量用语法中的 “set” 来对局部变量进行赋值。当然也可以用直接赋值的办法“ local 变量类型 变量名 = ”,但要注意的是,数组局部变量不能够直接进行赋值。数组变量的索引数最高为 “8092”。

局部变量之所以称之为局部,因为只能使用于一个函数部分,当函数结束运行或传回值时,局部变量自动退出使用。也就是说,局部变量除了本函数之外不能在其它函数中使用的,即使另一个函数声明了相同名字的局部变量,也不会互相产生冲突。这个是局部变量优于全局变量的地方之一。在“函数局限”中,将讲解一下局部变量在函数中的局限性

以上的要点是对局部变量使用方法上的一些小要求,也是局部变量异于全局变量的地方。

三、函数局限
局部变量的局限也是由于其优越性造成的。局部变量在函数退出运算时,也会退出运算。也就是说,这个变量不能在另一个函数中起作用。所以,在WE中,在“单位组、玩家组”的动作中,不能使用在这个触发声明的变量,因为“单位组、玩家组”动作会自动生成新的函数
如图:



如果将图中的触发转为JASS,如下:
引用:

function Trig_TestTrig_Func004001002 takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO) == true )
endfunction
function Trig_TestTrig_Func004A takes nothing returns nothing
    call SetHeroLevelBJ( GetEnumUnit(), udg_Lv, false )
endfunction
function Trig_TestTrig_Actions takes nothing returns nothing
    local integer a
    local integer array b
    local integer c = 10
    call ForGroupBJ( GetUnitsOfPlayerMatching(Player(0), Condition(function Trig_TestTrig_Func004001002)), function Trig_TestTrig_Func004A )
endfunction
//===========================================================================
function InitTrig_TestTrig takes nothing returns nothing
    set gg_trg_TestTrig = CreateTrigger(  )
    call TriggerAddAction( gg_trg_TestTrig, function Trig_TestTrig_Actions )
endfunction


这时触发将会自动生成一个函数 Trig_TestTrig_Func004A ,如果在触发中直接用局部变量代替全局变量将会导致前面讲的声明上的错误。这时我们可以改成下面的动作,触发就可以正常使用了。


当然函数的局限不是全指局部变量的局限,还有很多,这里就主要指局部变量了。


四、代入参数

参数函数是函数中常用的一种函数写法,这类函数的用法很多,最主要的针对相同的多次运算最为有效。如设置杀怪掉宝,用变量来设置物品的代码,当用全局变量时,显得有些麻烦————特别是要设置掉落N种类别的物品,如果用一个变量来设,很有可能让人觉得头晕。。。这时用一个参数函数,一切就显得非常地简单了。
引用:

function DropItemTJ takes integer a returns integer
      local integer array item_id
      set item_id[1] = 'stel'
      set item_id[2] = 'rhth'
      set item_id[3] = 'ratc'
      set item_id[4] = 'rin1'
// 有多少就设多少吧,想设不同的,可以再创建一个相似参数函数
      return item_id[a]
// 这样,当代入整数 a 时,就会得到一个物品代码,这也是参数函数和局部变量的一个妙用
endfunction

这个函数的调用方式有很多,最直接的是:
引用:

    call CreateItemLoc(DropItemTJ(GetRandom(1,4)), GetUnitLoc(GetDyingUnit()) )


这里,传回值 integer就起到了一个传回 item_id 的作用。这种参数,传回值的用法是非常实用的,可以解决一些貌似比较复杂的问题。所以在这时提及一下。


[ 本帖最后由 feelerly 于 2007-5-13 18:01 编辑 ]
偶会这个- -虾米时候说说自定义函数好了- -
楚汉争霸-wow8暗影制图小组  〆 魔獸地圖制作精華區
懂英文就是不一样 - -
学习了。。。
主啊,赐个姘头给我吧,年纪越小越好,咪咪越大越好,屁股越翘越好。
看看有用的是个很好的孩子。。
主啊,赐个姘头给我吧,年纪越小越好,咪咪越大越好,屁股越翘越好。

TOP

和vb那个象啊

TOP

。。。。。。。嘿嘿
主啊,赐个姘头给我吧,年纪越小越好,咪咪越大越好,屁股越翘越好。

TOP

虽然不太懂不过还是支持

TOP

这次写完了,希望对大家有点帮助咯

TOP

支持ING……
回下#3
自定义函数
function GetCache takes nothing returns gamecache
     return InitGameCache("暗月之舞")
endfunction
上面便是一个func
call GetCache()
因为不用带入  任何参量  所以括号内为空
返回为。。。。(LZ讲哩。。)

自定义函数更多是为别人服务的
下面便是一个例子。
写到自定义码里的话 任何一个T都可以调用  写在T里的话  只能本T调用  类似C++,VB。。。
function name takes *** returns ****
****
***
endfunction

TOP

那也不一定的~~T也是函数~函数调用只受先后顺序,并不受T的限制!

TOP

好教程。。。。恩。。。支持

TOP

楼猪的教程不错,彩图为主叙述为辅,可是楼猪好像忘了写某些局部变量在不再使用时要set null……最好补上去
、谁都会在无意之间
   、、失去了什么...
忽然注意到的时候、、妳已经不在身旁|

TOP

楼主,我想问一下,自定义变量声明时可同时赋值吗??
我看到你的截图要
local integer c=10
_____________________
如果写成
local integer c=10
local integer a
这些会报错吗?

TOP

引用:
原帖由 情谊两相倚 于 2008-5-7 19:16 发表
楼猪的教程不错,彩图为主叙述为辅,可是楼猪好像忘了写某些局部变量在不再使用时要set null……最好补上去
整数变量,不用了吧

TOP

先支持,然后保存,慢慢消化

TOP

强悍!
不要跟随别人的步伐!要学会利用别人的步伐!每一种创伤,都是一种成熟!我要创造传奇!

TOP

发新话题