|
TRIGGER看起来简单,实际很复杂,很臃肿,很麻烦,很糟糕。(三个字总结:弱爆了!)
[trigger]对战初始化
    事件
        地图初始化
    条件
    动作
        对战游戏 - 使用对战昼夜设置
        对战游戏 - 使用对战英雄设置
        对战游戏 - 给首发英雄一个回城卷轴
        对战游戏 - 设置初始资源
        对战游戏 - 删除已使用开始点附近的中立生物
        对战游戏 - 创建对战初始单位
        对战游戏 - 对电脑玩家运行对战AI脚本
        对战游戏 - 强制使用对战胜利/失败条件
[/trigger]
最终有War3执行的时候,还是要转换成Jass。
[jass]function Trig________________u_Actions takes nothing returns nothing
    call MeleeStartingVisibility(  )
    call MeleeStartingHeroLimit(  )
    call MeleeGrantHeroItems(  )
    call MeleeStartingResources(  )
    call MeleeClearExcessUnits(  )
    call MeleeStartingUnits(  )
    call MeleeStartingAI(  )
    call MeleeInitVictoryDefeat(  )
endfunction
//===========================================================================
function InitTrig________________u takes nothing returns nothing
    set gg_trg________________u = CreateTrigger(  )
    call TriggerAddAction( gg_trg________________u, function Trig________________u_Actions )
endfunction[/jass]
注意!在Jass内,地图初始化这个事件是不存在的,那么这个触发器该这么运行?
答案:被另一个函数调用。
[jass]function main takes nothing returns nothing
    call SetCameraBounds( -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM) )
    call SetDayNightModels( "Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl" )
    call NewSoundEnvironment( "Default" )
    call SetAmbientDaySound( "LordaeronSummerDay" )
    call SetAmbientNightSound( "LordaeronSummerNight" )
    call SetMapMusic( "Music", true, 0 )
    call InitBlizzard(  )
    call InitGlobals(  )
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    call InitCustomTriggers(  )//←就是这个函数调用的
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    call RunInitializationTriggers(  )
endfunction[/jass]
[jass]function InitCustomTriggers takes nothing returns nothing
    call InitTrig________________u(  )
endfunction[/jass]
我勒个去,绕赤道一圈才运行这个触发器,效率太低下了。所以我们要对这个进行小小的改进下。
(过去的触发器弱爆了!看Jass的)
[jass]function main takes nothing returns nothing
    call SetCameraBounds( -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM) )
    call SetDayNightModels( "Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl" )
    call NewSoundEnvironment( "Default" )
    call SetAmbientDaySound( "LordaeronSummerDay" )
    call SetAmbientNightSound( "LordaeronSummerNight" )
    call SetMapMusic( "Music", true, 0 )
//这里是刚才的触发器,我们直接加入到游戏初始化中。
    call InitBlizzard(  )
    call MeleeStartingVisibility(  )
    call MeleeStartingHeroLimit(  )
    call MeleeGrantHeroItems(  )
    call MeleeStartingResources(  )
    call MeleeClearExcessUnits(  )
    call MeleeStartingUnits(  )
    call MeleeStartingAI(  )
    call MeleeInitVictoryDefeat(  )
//Over
    call InitTrig________________u()
    call RunInitializationTriggers(  )
endfunction[/jass]
Jass内虽然代码可以精简很多,但是顺序千万别搞错了,错误的顺序War3是不认识的。
[jass]
//正确使用方式
function Actions_2 takes nothing returns nothing
endfunction
function Actions takes nothing returns nothing
call Actions_2()
endfunction
function main takes nothing returns nothing
call Actions()
endfunction[/jass]
[jass]
//错误的使用方式
function main takes nothing returns nothing
call Actions()
endfunction
function Actions takes nothing returns nothing
call Actions_2()
endfunction
function Actions_2 takes nothing returns nothing
endfunction[/jass]
Jass的写法是从上往下开始写的,所以当多个代码之间相互调用时,是从下往上调用的。
如果你的代码是从上往下调用……恭喜你,War3不认识。
解决方法很简单。
新建两个触发器,新建触发器1改名为Jass,新建第二个触发器改名为Init。
Jass内位置为
[jass]
function Trig_Jass_Actions takes nothing returns nothing
endfunction
function InitTrig_Jass takes nothing returns nothing
    set gg_trg_Jass = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Jass, function Trig_Jass_Actions )
endfunction
function Trig_Init_Actions takes nothing returns nothing
endfunction
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction[/jass]
如果你无法确认位置,用Jassshoppro打开地图,可以看到。
其他的……有问题了再说。 |
评分
-
查看全部评分
|