找回密码
 点一下
查看: 1775|回复: 2

关于JASS的使用.

[复制链接]
发表于 2011-2-12 16:24:23 | 显示全部楼层 |阅读模式
关于JASS的使用.
鄙人最近学习JASS.
有一些疑惑.想请高手赐教.
1.我想用jass来做施放技能的判断..结果发现...条件中似乎不通使用jass代码...无语.想问除了T转J后修改外.有没有什么其它的方法.
2,我对JASS的运用.我觉得很成问题.但是我自己又搞不明白.想得到高手的指点.就量我现在对jass的运用.仅限在写一个或者复制别人的写好的函数.
在T里面用变量设定一下参数,然后CALL XXXX(xxx).....
可是如何用JASS写T呢?..就是说用jass来代替触发,该如何写呢?能否请高手写一个简单的j 事件,条件.动作出来.比如 刷怪...或者其它.都好.
希望赐教.谢谢.
发表于 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
回复

使用道具 举报

发表于 2011-2-13 11:06:10 | 显示全部楼层
//=====================================条件======================================
function Trig_jitui_1_Conditions takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == false ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetKillingUnitBJ(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    if ( not ( IsPlayerEnemy(GetTriggerPlayer(), Player(0)) == true ) ) then
        return false
    endif
    return true
endfunction

//=====================================动作======================================
function Trig_jass_jitui_Actions takes nothing returns nothing
    local location p_KillingUnit = GetUnitLoc(GetKillingUnitBJ())
    local location p_TriggerUnit = GetUnitLoc(GetTriggerUnit())
    local integer i
    set i = 1
    loop
        exitwhen i > 5
    call SetUnitPositionLoc( GetTriggerUnit(), PolarProjectionBJ(GetUnitLoc(GetTriggerUnit()), 100, AngleBetweenPoints(GetUnitLoc(GetKillingUnitBJ()), GetUnitLoc(GetTriggerUnit()))) )
    call AddSpecialEffectTargetUnitBJ( "origin", GetTriggerUnit(), "Objects\\\\Spawnmodels\\\\Undead\\\\ImpaleTargetDust\\\\ImpaleTargetDust.mdl" )
    call DestroyEffect( GetLastCreatedEffectBJ() )
        call TriggerSleepAction( 0.01 )
        set i = i + 1
    endloop
endfunction

//=====================================事件======================================
function InitTrig_jass_jitui takes nothing returns nothing
    set gg_trg_jass_jitui = CreateTrigger(  )
    call TriggerAddAction( gg_trg_jass_jitui, function Trig_jass_jitui_Actions )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_jass_jitui, EVENT_PLAYER_UNIT_DEATH )
endfunction





刚开始学J。这是我的第一个J。在WE里改的。楼上说的可以不需要事件和条件。是怎么实现的。
个人觉得J不难。以前学过PHP。对脚本类的有一点基础。所以对于语法不那么陌生
J就像武功秘籍。心法是基本懂了。现在剩下的就是一些实际的招数套路了。想多看看完整的套路。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 14:52 , Processed in 0.120185 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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