|
发表于 2011-2-12 17:29:17
|
显示全部楼层
JASS不一定需要“条件”,也不一定需要“动作”,甚至可以没有“事件”。
它的基本构成单位是“函数”。
你可以用if来代替“条件”,可以用timer来代替“时间周期事件”
不过我实在没看懂“条件中似乎不通使用jass代码”是什么意思……
[jass]
function CreateUnitsToLocation takes player id ,integer number,integer unitid,location locs,location loct returns nothing
loop
exitwhen 1> number
call IssuePointOrderByIdLoc(CreateUnitAtLoc(id,unitid,locs,0),851983,loct)
set number=number - 1
endloop
call RemoveLocation(locs)
call RemoveLocation(loct)
endfunction
[/jass]
这是一个用来刷兵的函数,可以创建N个小兵攻击移动到目标地点。
如果想要每30秒刷10个步兵从玩家二的开始点到玩家一的开始点,那么我们可以再写两个函数。
[jass]
function CreateFootman takes nothing returns nothing
call CreateUnitsToLocation(Player(1),10,'hfoo', GetPlayerStartLocationLoc(Player(1)),GetPlayerStartLocationLoc(Player(0)))
endfunction
function TimerCreateUnitsToLocation takes timer t returns timer
call TimerStart(t,30,true,function CreateFootman)
return t
endfunction
[/jass]
然后在地图初始化的时候调用,或者直接写在main函数里面
[trigger]对战初始化
事件
地图初始化
条件
动作
自定义代码: call TimerCreateUnitsToLocation(CreateTimer())
[/trigger]
然后,如果我们想要做一个属性伤害风暴之锤,我们可以这样写。
[jass]
function SXSH takes nothing returns nothing
if GetSpellAbilityId()=='AHtb' then
call UnitDamageTarget(GetTriggerUnit(),GetSpellTargetUnit(),10*I2R(GetHeroStr(GetTriggerUnit(),true)),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_FIRE,WEAPON_TYPE_WHOKNOWS)
endif
endfunction
function InitSXSH takes nothing returns nothing
local trigger gt
if GetLearnedSkill()=='AHtb' and GetUnitAbilityLevelSwapped('AHtb',GetTriggerUnit())==1 then
set gt=CreateTrigger()
call TriggerRegisterUnitEvent(gt,GetTriggerUnit(),EVENT_UNIT_SPELL_EFFECT)
call TriggerAddAction(gt,function SXSH )
endif
endfunction
function XXSXSH takes nothing returns nothing
local trigger gt=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gt,EVENT_PLAYER_HERO_SKILL)
call TriggerAddAction(gt,function InitSXSH)
endfunction
[/jass]
函数SXSH的作用在于它可以判断技能是否是风暴之锤,然后造成伤害。
函数InitSXSH被用来在学习技能的时候为英雄注册技能的释放。
函数XXSXSH用来注册学习技能事件。(所以需要在地图初始化或者选英雄的时候调用这个函数)
dota里面的很多技能都是这样的流程(学习-->释放-->产生效果),这是为了保证技能释放的时候不容易卡机。
当然,为了方便我们可以将“学习”的函数去掉:
[jass]function SXSH takes nothing returns nothing
if GetSpellAbilityId()=='AHtb' then
call UnitDamageTarget(GetTriggerUnit(),GetSpellTargetUnit(),10*I2R(GetHeroStr(GetTriggerUnit(),true)),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_FIRE,WEAPON_TYPE_WHOKNOWS)
endif
endfunction
function InitSXSH takes nothing returns nothing
local trigger gt
set gt=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gt, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction(gt,function SXSH )
endfunction[/jass]
对比T转J:
[jass]
function Trig________________u_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'AHtb' ) ) then
return false
endif
return true
endfunction
function Trig________________u_Actions takes nothing returns nothing
call UnitDamageTarget( GetTriggerUnit(), GetSpellTargetUnit(), ( I2R(GetHeroStatBJ(bj_HEROSTAT_STR, GetTriggerUnit(), true)) * 10.00 ), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS )
endfunction
function InitTrig________________u takes nothing returns nothing
set gg_trg________________u = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg________________u, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg________________u, Condition( function Trig________________u_Conditions ) )
call TriggerAddAction( gg_trg________________u, function Trig________________u_Actions )
endfunction
[/jass]
可见,其实J和T转J其实差不多,都需要注册,都需要在“地图初始化”时调用。
所以,不用太在意这段J是否是T转的,只要你思路清晰就可以写出优秀的代码。
注:
我这里没有使用TriggerCondition,而是直接将条件判断写在了TriggerAction里面。
你也可以将代码写在TriggerCondition里面,而不使用TriggerAction……据说这样效率更高,虽然限制较多,而且比较麻烦。
另附一些资料
JASS版 遗失的记忆
冰块教你学JASS
WE-JASS大全(作者:GreedWind |
|