找回密码
 点一下
查看: 1196|回复: 5

关于循环中局部变量,以及J的一些问题.以及函数.

[复制链接]
发表于 2010-8-17 11:50:44 | 显示全部楼层 |阅读模式
[trigger]

attack function kof97 复制
    事件
        单位 - 任意单位 被攻击
    条件
        ((攻击单位) 的类型) 等于 圣骑士
    动作
        等待 0.10 秒
        触发器 - 关闭 (当前触发)
        设置 kof97hero = (攻击单位)
        设置 pointfunction = ((被攻击单位) 的位置)
        设置 heroattribute = 100
        设置 herooverall = 10
        设置 uib = (半径为 100.00 圆心为 pointfunction 且满足 ((((匹配单位) 是存活的) 等于 TRUE) and (((匹配单位) 是 (kof97hero 的所有者) 的同盟单位) 等于 FALSE)) 的所有单位)  
        For JNX 从 1 到 10, 做动作
            Loop - 动作
                For JNY 从 1 到 17, 做动作
                    Loop - 动作
                        设置 functionpoint = (从 pointfunction 开始,距离 (100.00 x (转换 JNX 为实数)) ,方向为 (20.00 x (转换 JNY 为实数)) 度的位移处)
                        特殊效果 - 删除 (新建特效 Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl 在 functionpoint 处)
                        特殊效果 - 删除 (新建特效 Abilities\Spells\Undead\DarkRitual\DarkRitualTarget.mdl 在 functionpoint 处)
                        特殊效果 - 删除 (新建特效 Abilities\Spells\Other\Monsoon\MonsoonBoltTarget.mdl 在 functionpoint 处)
                        特殊效果 - 删除 (新建特效 Abilities\Spells\Orc\LiquidFire\Liquidfire.mdl 在 functionpoint 处)
                        点 - 清除 functionpoint
        单位组 - 选取 uib 内所有单位做动作
            Loop - 动作
                单位 - 命令 kof97hero 对 (选取单位) 造成 ((转换 heroattribute 为实数) x (转换 herooverall 为实数)) 点伤害(是 攻击伤害, 不是远程攻击) 攻击类型: 法术 伤害类型: 通用 装甲类型: 无
        单位组 - 删除 uib
        点 - 清除 pointfunction
        触发器 - 开启 (当前触发)

[/trigger]
我想把这个T转成J.让后再通过教程把它改成函数.但是我发现几个问题我实在是解决不了,只好又来提问(挠头...擦汗)
1. 这个触发我看来看去 看不出哪里还没有排泄,但是一旦使用的时候把FOR JNX 从1到X  这个条件的里的X调大的话,进入游戏攻击怪物的时候,攻击几次,就会出现画面错乱......一群单位好像被搅拌机搅成一片片的在空中乱飘............一会又回复正常.但是如果那个X调成1就没事.1以上就出现错乱.........
2. 我现在只会简单的把全局变量替换成局部变量.可是有个问题,就是,当像上面这种如循环整数,选区单位等子触发里面,我在它之前声明的局部变量是不管用的..........但是我又有点不知所措,不知道该怎么声明......难道可以这样
For
local integer JNY
从 1 到 17, 做动作

[/table]
另外的一个问题如下,下面的红色部分.我想问下,应该以怎样的格式来改这些名字呢?
希望有高手把它改写成J.让我学习下.在下不胜感激.
[jass]
function Trig_attack_function_kof97_______u_Conditions takes nothing returns boolean
    if ( not ( GetUnitTypeId(GetAttacker()) == 'Hpal' ) ) then
        return false
    endif
    return true
endfunction
function Trig_attack_function_kof97_______u_
Func007002003001
takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction
function Trig_attack_function_kof97_______u_
Func007002003002
takes nothing returns boolean
    return ( IsUnitAlly(GetFilterUnit(), GetOwningPlayer(udg_kof97hero)) == false )
endfunction
function Trig_attack_function_kof97_______u_
Func007002003
takes nothing returns boolean
    return GetBooleanAnd( Trig_attack_function_kof97_______u_Func007002003001(), Trig_attack_function_kof97_______u_Func007002003002() )
endfunction
function Trig_attack_function_kof97_______u_
Func009A takes
nothing returns nothing
    call UnitDamageTarget( udg_kof97hero, GetEnumUnit(), ( I2R(udg_heroattribute) * I2R(udg_herooverall) ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
endfunction
function Trig_attack_function_kof97_______u_Actions takes nothing returns nothing
    call TriggerSleepAction( 0.10 )
    call DisableTrigger( GetTriggeringTrigger() )
    set udg_kof97hero = GetAttacker()
    set udg_pointfunction = GetUnitLoc(GetAttackedUnitBJ())
    set udg_heroattribute = 100
    set udg_herooverall = 10
    set udg_uib = GetUnitsInRangeOfLocMatching(100.00, udg_pointfunction, Condition(function Trig_attack_function_kof97_______u_Func007002003))
    set udg_JNX = 1
    loop
        exitwhen udg_JNX > 10
        set udg_JNY = 1
        loop
            exitwhen udg_JNY > 17
            set udg_functionpoint = PolarProjectionBJ(udg_pointfunction, ( 100.00 * I2R(udg_JNX) ), ( 20.00 * I2R(udg_JNY) ))
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", udg_functionpoint) )
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Undead\\DarkRitual\\DarkRitualTarget.mdl", udg_functionpoint) )
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", udg_functionpoint) )
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Orc\\LiquidFire\\Liquidfire.mdl", udg_functionpoint) )
            call RemoveLocation( udg_functionpoint )
            set udg_JNY = udg_JNY + 1
        endloop
        set udg_JNX = udg_JNX + 1
    endloop
    call ForGroupBJ( udg_uib, function Trig_attack_function_kof97_______u_Func009A )
    call DestroyGroup( udg_uib )
    call RemoveLocation( udg_pointfunction )
    call EnableTrigger( GetTriggeringTrigger() )
endfunction
//===========================================================================
function InitTrig_attack_function_kof97_______u takes nothing returns nothing
    set gg_trg_attack_function_kof97_______u = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_attack_function_kof97_______u, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_attack_function_kof97_______u, Condition( function Trig_attack_function_kof97_______u_Conditions ) )
    call TriggerAddAction( gg_trg_attack_function_kof97_______u, function Trig_attack_function_kof97_______u_Actions )
endfunction
[/jass]
接下来是关于函数的问题.我尝试着把上面的J按着教程转换成函数.但是到了一个地方卡住了,如下的黄色部分.
[jass]
function kof97attack takes nothing returns nothing
    call TriggerSleepAction( 0.10 )
    call DisableTrigger( GetTriggeringTrigger() )
    local unit kof97hero = GetAttacker()
    local location pointfunction = GetUnitLoc(GetAttackedUnitBJ())
    local integer heroattribute = 100
    local integer herooverall = 10
    local group uib = GetUnitsInRangeOfLocMatching(100.00, udg_pointfunction, Condition(function Trig_attack_function_kof97_______u_Func007002003))
    local integer JNX = 1
    loop
        exitwhen JNX > 10
        local integer JNY = 1
        loop
            exitwhen JNY > 17
            set functionpoint = PolarProjectionBJ(udg_pointfunction, ( 100.00 * I2R(udg_JNX) ), ( 20.00 * I2R(udg_JNY) ))
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", udg_functionpoint) )
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Undead\\DarkRitual\\DarkRitualTarget.mdl", udg_functionpoint) )
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", udg_functionpoint) )
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Orc\\LiquidFire\\Liquidfire.mdl", udg_functionpoint) )
            call RemoveLocation( udg_functionpoint )
            set JNY = udg_JNY + 1
        endloop
        set JNX = JNX + 1
    endloop
    call ForGroupBJ( uib, [table=100%,#ffff00]function Trig_attack_function_kof97_______u_Func009A
)
    call DestroyGroup( uib )
    call RemoveLocation( pointfunction )
    call EnableTrigger( GetTriggeringTrigger() )
endfunction
[/jass]

请问,像金色部分.我该如何解决呢?(教程中没有提到............)
另外请高手看想我转的函数,存在哪些问题.请给指点一下.麻烦了.
发表于 2010-8-17 12:41:43 | 显示全部楼层
建议用“trigger”和“jass”把代码框起来吧。
回复

使用道具 举报

发表于 2010-8-17 12:50:49 | 显示全部楼层
t转j的j不是真正的完美的函数,它会把判断真值写成单独的函数,局域变量的有效单位是一个函数Function和EndFunction之间。详细还是先看演示吧
回复

使用道具 举报

 楼主| 发表于 2010-8-18 00:08:54 | 显示全部楼层
看来要学习的还有很多啊.努力.
回复

使用道具 举报

发表于 2010-8-18 05:57:35 | 显示全部楼层
局部变量申明和全局的一样,不过要加 local
还要写在函数开头...
回复

使用道具 举报

发表于 2010-8-18 13:20:08 | 显示全部楼层
1. 这个触发我看来看去 看不出哪里还没有排泄,但是一旦使用的时候把FOR JNX 从1到X  这个条件的里的X调大的话,进入游戏攻击怪物的时候,攻击几次,就会出现画面错乱......一群单位好像被搅拌机搅成一片片的在空中乱飘............一会又回复正常.但是如果那个X调成1就没事.1以上就出现错乱.........
这个……能发地图吗,因为可能不是排泄的问题,可能是循环整数冲突或者其他问题。
2. 我现在只会简单的把全局变量替换成局部变量.可是有个问题,就是,当像上面这种如循环整数,选区单位等子触发里面,我在它之前声明的局部变量是不管用的..........但是我又有点不知所措,不知道该怎么声明......难道可以这样
                For local integer JNY 从 1 到 17, 做动作
变量的申明必须在定义域的最开始,也就是写在“funciton”的下面。
而循环里面使用局部变量是没有问题的,有问题的是在“选取单位组”里面。
因为“选取单位组”执行的代码其实是另外的函数。
所以并不是全部变量都要转换成“局部变量”,一切根据实际情况而定,该使用全局变量还是要用的……
另外的一个问题如下,下面的红色部分.我想问下,应该以怎样的格式来改这些名字呢?
名字取什么无所谓,只要自己能记住就行了;不过为了增强可读性,有时候取名字还是需要一定规律:
比如:
杀死一个单位的函数:fun_no_kill
fun是类型(函数)no是返回值(没有)kill是作用
选英雄时记录英雄的变量:unt_chs_hero
unt是类型(单位)chs是作用区(选英雄)hero是作用(记录英雄)

当然,这些都要看你的习惯了……像DOTA的变量名AG,NF,E3,Y5,DY........其实也可以提升加密功能......
请问,像金色部分.我该如何解决呢?(教程中没有提到............)
“选取单位组”执行的动作必须是单独的函数(且没有参数与返回值)
所以如果想要使用“选取单位组”,就要在前面先写出这个函数。
当然,你也可以使用“循环”来代替“单位组”。
另外请高手看想我转的函数,存在哪些问题.请给指点一下.麻烦了.
要把这些写成“函数”,其实还要看你是想要这个函数有什么作用:
是只是开启这个效果,还是开启指定单位的攻击效果,还是通过这个函数改变这个效果的参数……

其实你要将T转换成J的话,根本没有必要写成有参数的“函数”,因为要实现改变效果参数,直接通过修改全局变量也是可以的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 06:35 , Processed in 0.036261 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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