心魔网 - 挥洒由笔,创意随心's Archiver

everguo 发表于 2008-5-24 14:58

单位组清空和删除的原理

学会JASS后,可以去分析下一些约定俗成的写法,比如为什么要删除单位组,为什么要在选取XX单位组前面加上[color=blue]set   bj_wantDestroyGroup=ture [/color]


[color=red]============================================JASS的分割线=============================================[/color]

“单位组-选取区域内单位做动作”

这条语句等于创建了一个单位组     因此用完后应该把这个单位组删除     不然它会一直占用内存

我们用个单位组变量来保存改单位组,其实这个变量是指向内存中单位组的地址       如果我们用这个变量对下一个单位组赋值     那么之前创建的单位组就会一直留在那里      占用内存

但我们可以用一句J来解决这个问题,如下所示

                                                [color=blue]自定义代码:set   bj_wantDestroyGroup=ture[/color]

它的作用是删除临时单位组。为什么要加这个,让我们看下这条语句的JASS就清楚了

[jass]function GetUnitsInRectMatching takes rect r, boolexpr filter returns group
local group g = CreateGroup()
call GroupEnumUnitsInRect(g, r, filter)
call DestroyBoolExpr(filter)
return g
endfunction
[/jass]
看到没      其中有 local group g = CreateGroup()     也就是生成了一个单位组

而 最后创建的单位组( bj_lastCreatedGroup )   也等于该单位组     但这只是暂时的     如果这时有其他单位组被创建      那么删除最后创建的单位组就不能删除该单位组

所以,这时加句

[color=blue]自定义代码:set   bj_wantDestroyGroup=ture[/color]  在“选取XX区域内所有单位”,就可以达到目的

因为我们在T里使用的选取单位组,它的JASS代码是这样

[jass]function ForGroupBJ takes group whichGroup, code callback returns nothing
// If the user wants the group destroyed, remember that fact and clear //如果用户希望这个单位组被销毁,记得这事并清零标志(即将
// the flag, in case it is used again in the callback. // bj_wantDestroyGroup 重新设置为false), 以便用户重新使用
local boolean wantDestroy = bj_wantDestroyGroup
set bj_wantDestroyGroup = false
call ForGroup(whichGroup, callback)
// If the user wants the group destroyed, do so now. //如果用户希望单位组被销毁,那么这样做
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction[/jass]


不过上面方法还是有瑕疵,即当多个单位组被创建,还是有可能出问题,毕竟 bj_wantDestroyGroup是全局变量。

所以还是采取设置单位组yy=XX区域里满足XX条件的所有单位     事后再消除比较好
虽说

设置 Group=区域内所有符合条件的单位
选取Group内所有单位做动作
  动作:一连串,略
删除单位组Group

需要说明的是,这里必须加上删除单位组Group,因为这时候变量Group指向的是临时单位组,这个单位组必须要删除掉。

linzefei 发表于 2008-5-25 23:17

顶~`

①歲dē菲菲 发表于 2008-5-26 22:28

很多词看不懂,我想学.
local,endfunction,return等等
这些是什么意思呢?

everguo 发表于 2008-5-27 01:06

这些是JASS中一些基础知识

local  是定义一个局部变量

function   endfunction是一个函数体的“首”和“尾”

return 是返回

如果你想系统地了解   可看下置顶的JASS教程

XXOO 发表于 2008-5-28 00:15


也就是说单位组用完后,调用DestroyGroup(whichGroup)

:ecc37

tianbinde 发表于 2008-6-12 17:20

不用JASS代码可以吗?
直接删除创建的单位组也可以吧?

[[i] 本帖最后由 tianbinde 于 2008-6-12 17:25 编辑 [/i]]

thody 发表于 2008-6-12 17:46

一般说了,如果创建了多个单位组,会删不完全。

linzefei 发表于 2008-6-12 19:04

lss的触发..
那个动作只运行到第一个选取单位 就没 了..
单位组那时被删了....

tianbinde 发表于 2008-6-12 19:19

那怎么搞呀?
用什么删除?

我用的有 每秒创建单位组的
还有,刷怪用的
有的有变量,有的没有
怎么搞?

thody 发表于 2008-6-12 19:35

用t也不难啊,多设置几个单位组就可以了。:ecc15

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.