偶久网

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索

网站魔兽热门地图

查看: 6666|回复: 4

Jass申明局部变量要点

  [复制链接]
ou99孽缘 title=
发表于 2010-12-14 20:36:00
PS:大家对于变量可能不会太陌生,变量分为全局变量局部变量
局部变量的用法相信大家基本上都会,那么偶就对局部变量的用法做一 个小小的讲解吧。

声明格式:
    local 变量 类型 变量名
    local 变量 类型 array 变量名
    local 变量 类型 变量名 =

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

***那里面有关于对常用变量类型的基本解绍!***

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

局部变量的用法和全局变量是一样的,只要掌握了全局变量的用法,局部变量的使用基本是 可以很快地理解。

A、局部变量代替全局变量
建立一个全变局变量,名为 Lv
2.jpg

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

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

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

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

局部变量的使用有以下几点是必须注意的。



    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中,在“单位组、玩家组”的动作中,不能使用在这个触发声明的变量,因为“单位 组、玩家组”动作会自动生成新的函数
如图:

9.jpg

如果将图中的触发转为 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 ,如果在触发中直接用局部变量代替全局变量将会导致前面讲的声明上的错误。这时我们可以改成下面的动作,触发就可以正常使用了
10.jpg
当然函数的局限不是全指局部变量的局限,还有很多,这里就主 要指局部变量了。


四、代入参数

参数函数是函数中常用的一种函数写法,这类函数的用法很多,最主要的针对相同的多次运算最为有效。如设置杀怪掉 宝,用变量来设置物品的代码,当用全局变量时,显得有些麻烦————特别是要设置掉落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 的作用。这种参数,传回值的用法是非常 实用的,可以解决一些貌似比较复杂的问题。所以在这时提及一下。

ou99孽缘 title=
 楼主| 发表于 2010-12-14 20:36:28
{:6_306:}
  路过
k2322571
发表于 2010-12-17 19:58:45
{:6_306:}
zx5585269
发表于 2012-1-10 16:21:44
飘过飘过飘过飘过飘过飘过飘过飘过
快速回复 返回顶部 返回列表