找回密码
 点一下
查看: 3490|回复: 8

关于ForGroup的简化写法

[复制链接]
发表于 2008-11-28 12:39:32 | 显示全部楼层 |阅读模式
[jass]
globals
    player udg_TempPlayer
    group udg_Group=CreateGroup()
endglobals


代码1:
function GroupFunc takes nothing returns nothing
    call KillUnit(GetEnumUnit())
endfunction

function FilterFunc takes nothing returns nothing
    return IsUnitEnemy(GetFilterUnit(),udg_TempPlayer)
endfunction

function TestFunc takes unit u nothing returns nothing
    local group g = CreateGroup()
    set udg_TempPlayer = GetOwningPlayer(u)
    call GroupEnumUnitsInRange(g,GetUnitX(u),GetUnitX(u),1000,function FilterFunc)
    //事实上这里一般可以直接用全局变量udg_Group,可以省去Create/DestroyGroup以及set null的步骤
    call ForGroup(g,GroupFunc)
    DestroyGroup(g)
    set g = null
endfunction


代码2:

//条件式可以直接用returns nothing
//函数总是返回false
function GroupFunc takes nothing returns nothing
    if IsUnitEnemy(GetFilterUnit(),udg_TempPlayer) then
        call KillUnit(GetFilterUnit())
    endif
endfunction

function TestFunc2 takes unit u nothing returns nothing
    set udg_TempPlayer = GetOwningPlayer(u)
    call GroupEnumUnitsInRange(udg_Group,GetUnitX(u),GetUnitX(Y),1000,Condition(function GroupFunc))
endfunction
[/jass]

即是说完全省去ForGroup这一步,直接在选取判断的时候做动作
GroupEnum类函数使用时会把Group中原先的单位都清空,所以不需要进行GroupClear操作
事实上这种写法udg_Group在整个游戏过程中都是空的,只是作为临时的一个容器而已,所以是可以直接无视的  



题外:单位组动作中使用全局变量
我一般习惯在单位组动作之前使用这样的方式将参数保存在全局变量中
      如:set udg_TempPlayer = GetOwningPlayer(GetTriggerUnit())
这样在GroupFunc用到该参数的时候就不需要反复调用一些函数了
(比如以上代码中,1000范围内有多少单位就需要调用多少次GroupFunc)
全局变量在这里的使用是瞬时性的,所以一般不需要担心数据覆盖的问题
之所以叫一般不需要担心是因为:
如果你在单位组动作中使用伤害函数并触发了takeDamage事件(设该触发函数为B)
那么在该伤害函数运行之后运行的是被触发的触发函数B,直到B函数结束或是遇到等待命令(TriggerSleepAction),之后再从原函数中断点处继续运行
所以在函数B中是有可能改变这些全局变量的~
该代码运行顺序同样适用于其他类型的触发,但是在代码运行过程中只有单位受到伤害事件可能被触发
所以在伤害事件的触发中需要注意"公用全局变量"的使用 (适用于所有使用全局变量的情况)
 楼主| 发表于 2008-11-28 12:45:29 | 显示全部楼层
被问得太多的问题了。。。。。。
每次要打这么多字
所以诈尸来发个贴子备份下~~
回复

使用道具 举报

发表于 2008-11-28 13:01:40 | 显示全部楼层
老狼老狼!!!

让我咬一口吧...
回复

使用道具 举报

恶声恶气 该用户已被删除
发表于 2008-11-28 13:16:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-11-28 15:08:55 | 显示全部楼层
学习了   要制作一个扇形区域的 伤害有没有好一点的方法  
我那个创建N多个区域 每个区域单位组选取条件单位做伤害  好像很是。。。。BUG 啊  居然有的区域单位不受伤害。。。。。。  >_<
回复

使用道具 举报

发表于 2008-11-28 20:30:40 | 显示全部楼层
用区域选取,替换act到con
回复

使用道具 举报

发表于 2008-12-1 13:15:12 | 显示全部楼层
尸变哇尸变   [s:187]
回复

使用道具 举报

发表于 2008-12-2 12:55:13 | 显示全部楼层
因为pj认为函数传递到CONDITION必须返回布尔值,所以这么写通不过PJ,JH的功能就禁用了,所以用了JH功能的如DEBUG,VJASS的还是写成return false吧。
回复

使用道具 举报

发表于 2008-12-20 17:37:32 | 显示全部楼层
function TestFunc takes unit u nothing returns nothing

这里的传入很诡异。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 21:16 , Processed in 0.059083 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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