找回密码
 点一下
查看: 2759|回复: 11

关于局部变量代替全局变量的问题。。。

[复制链接]
发表于 2010-4-10 22:51:45 | 显示全部楼层 |阅读模式
[trigger]
KOF97xiuluodao
    事件
        单位 - 任意单位 被攻击
    条件
        ((攻击单位) 的类型) 等于 追风游侠 修罗道
    动作
        设置 xld = (攻击单位)
        设置 zhushuxing = (xld 的敏捷值(包括 加成))
        设置 dengji = (xld 的英雄等级)
        单位组 - 选取 (半径为 500.00 圆心为 ((被攻击单位) 的位置) 且满足 ((((匹配单位) 是存活的) 等于 TRUE) and (((匹配单位) 是 (xld 的所有者) 的敌对单位) 等于 TRUE)) 的所有单位) 内所有单位做动作
            Loop - 动作
                单位 - 命令 xld 对 (选取单位) 造成 ((转换 zhushuxing 为实数) x ((转换 dengji 为实数) x 0.05)) 点伤害(是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 通用 装甲类型: 无
                特殊效果 - 在 ((选取单位) 的位置) 创建特效: Abilities\Spells\Other\Monsoon\MonsoonBoltTarget.mdl
                等待 1.00 秒
                特殊效果 - 删除 (最后创建的特效)
[/trigger]
我想把这个触发中的全局变量替换成 局部变量 但是发现,我一般都是现把T转换成J,然后在 在 Trig_XXX_Actions  下边声明局部变量,然后把全局的变量统统替换掉。
但是发现这个触发中,这样做不行。。。。。会出现语法错误。。。
我把转换后的J贴出来,请高手们指点一下。。。。。 应该在哪里声明 局部变量 才能成功共的替换掉 全局变量??
[trigger]
function Trig_KOF97xiuluodao_Conditions takes nothing returns boolean
    if ( not ( GetUnitTypeId(GetAttacker()) == 'H000' ) ) then
        return false
    endif
    return true
endfunction
function Trig_KOF97xiuluodao_Func004001003001 takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction
function Trig_KOF97xiuluodao_Func004001003002 takes nothing returns boolean
    return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_xld)) == true )
endfunction
function Trig_KOF97xiuluodao_Func004001003 takes nothing returns boolean
    return GetBooleanAnd( Trig_KOF97xiuluodao_Func004001003001(), Trig_KOF97xiuluodao_Func004001003002() )
endfunction
function Trig_KOF97xiuluodao_Func004A takes nothing returns nothing
    call UnitDamageTarget( udg_xld, GetEnumUnit(), ( I2R(udg_zhushuxing) * ( I2R(udg_dengji) * 0.05 ) ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
    call AddSpecialEffectLocBJ( GetUnitLoc(GetEnumUnit()), "Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl" )
    call TriggerSleepAction( 1.00 )
    call DestroyEffect( GetLastCreatedEffectBJ() )
endfunction
function Trig_KOF97xiuluodao_Actions takes nothing returns nothing
    set udg_xld = GetAttacker()
    set udg_zhushuxing = GetHeroAgi(udg_xld, true)
    set udg_dengji = GetHeroLevel(udg_xld)
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(GetAttackedUnitBJ()), Condition(function Trig_KOF97xiuluodao_Func004001003)), function Trig_KOF97xiuluodao_Func004A )
endfunction
//===========================================================================
function InitTrig_KOF97xiuluodao takes nothing returns nothing
    set gg_trg_KOF97xiuluodao = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_KOF97xiuluodao, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_KOF97xiuluodao, Condition( function Trig_KOF97xiuluodao_Conditions ) )
    call TriggerAddAction( gg_trg_KOF97xiuluodao, function Trig_KOF97xiuluodao_Actions )
endfunction
[/trigger]
发表于 2010-4-11 00:48:44 | 显示全部楼层
set udg_xld = GetAttacker()

局部变量的话要在函数内声明

local udg_xld = GetAttacker()

最好变量名不要“udg_”免得和WE的全局变量冲突
回复

使用道具 举报

发表于 2010-4-11 01:15:53 | 显示全部楼层
[jass]
function Trig_KOF97xiuluodao_Conditions takes nothing returns boolean
return GetUnitTypeId(GetAttacker()) == 'H000'
endfunction
function Trig_KOF97xiuluodao_A takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE)>0.00 and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetAttacker()))
endfunction
function Trig_KOF97xiuluodao_B takes nothing returns nothing
local unit u = GetEnumUnit()
local integer zhushuxing = GetHeroAgi(GetAttacker(), true)
local integer dengji = GetHeroAgi(GetAttacker(), true)
call UnitDamageTarget( GetAttacker(), u, ( I2R(zhushuxing) * ( I2R(dengji) * 0.05 ) ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
call DestroyEffect( AddSpecialEffect (  "Abilities\\\\Spells\\\\Other\\\\Monsoon\\\\MonsoonBoltTarget.mdl", GetUnitX(u),GetUnitY(u)))
set u = null
endfunction
function Trig_KOF97xiuluodao_Actions takes nothing returns nothing
local group g=CreateGroup()
call GroupEnumUnitsInRange(g,GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()),500,Condition(function Trig_KOF97xiuluodao_A))
call ForGroup(g, function Trig_KOF97xiuluodao_B )
call DestroyGroup(g)
set g = null
endfunction
//===========================================================================
function InitTrig_KOF97xiuluodao takes nothing returns nothing
set gg_trg_KOF97xiuluodao = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_KOF97xiuluodao, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_KOF97xiuluodao, Condition( function Trig_KOF97xiuluodao_Conditions ) )
call TriggerAddAction( gg_trg_KOF97xiuluodao, function Trig_KOF97xiuluodao_Actions )
endfunction
[/jass]
回复

使用道具 举报

 楼主| 发表于 2010-4-11 07:29:07 | 显示全部楼层
先感谢一下楼上.我去试试看.
回复

使用道具 举报

发表于 2010-4-12 09:17:05 | 显示全部楼层
好像大概是,选取单位组做动作,实际上,又定义了个子函数,所以主函数中的局部变量无法在子函数中使用
回复

使用道具 举报

 楼主| 发表于 2010-4-14 10:07:45 | 显示全部楼层
回楼上,子函数的局部变量是不是再次声明一次就可以了?
回复

使用道具 举报

发表于 2010-4-15 16:47:14 | 显示全部楼层
声明,你声明了赋什么值?
回复

使用道具 举报

 楼主| 发表于 2010-4-16 12:36:12 | 显示全部楼层
感谢楼上提醒……是我写的太简略了,声明加赋值,子函数中赋值时赋予和主函数中相同的值,可以么?
回复

使用道具 举报

发表于 2010-11-22 16:07:06 | 显示全部楼层
你泄漏那么多   还在乎全局变量啊   你把泄露都给清了   比创10个全局变量都要节省吧
回复

使用道具 举报

发表于 2010-12-3 10:46:46 | 显示全部楼层

回 楼主(4133789) 的帖子

楼主,你这样写东西实在是太浪费时间了,T都转换成J了你居然还想办法转回来,真想不出来有什么意义,而且你这样搞。
你不觉得维护起来很麻烦吗?
回复

使用道具 举报

发表于 2010-12-3 13:25:16 | 显示全部楼层
其实楼主应该下个YDWE看看到底泄露了多少内存
至于改为局部变量 我的做法是  写触发器时不加入任何全局变量
等能泄露的都泄露了  再转换成J  直接加局部变量  释放无用内存
楼主的做法我表示有压力
回复

使用道具 举报

发表于 2010-12-9 09:05:01 | 显示全部楼层
很压力
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 15:13 , Processed in 0.060980 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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