|
楼主 |
发表于 2009-2-28 15:43:37
|
显示全部楼层
看代码:
下边这个是初始化触发器需添加的一条自定义代码:
[codes=jass]
call DanweiSiwang()
[/codes]
下边这个是添加到自定义代码区的函数:
如果你的地图已经有这两个return bug函数了,那么从分割线以下开始复制,同样放到return bug函数的下边,如果没有,那么从头复制。
[codes=jass]
//***********************************
//* *
//* 公共函数 *
//* *
//***********************************
//return bug 函数
function H2I takes handle h returns integer
return h
return 0
endfunction
function I2U takes integer i returns unit
return i
return null
endfunction
//-------------------------------------- 分割线 --------------------------------------------
//***********************************
//* *
//* 专用函数 *
//* *
//***********************************
//获得缓存,如果还没有创建,先创建它.
function CacheHuayuan takes nothing returns gamecache
if udg_cchHuayuan == null then
set udg_cchHuayuan = InitGameCache( "HuaYuan.w3v") //如果你希望命名不同的全局变量,请修改这里
endif
return udg_cchHuayuan ////如果你希望命名不同的全局变量,请修改这里
endfunction
//主函数
function Main takes location locYuanxin,real relYuanxinGaodu,real relYuanBanjing,real relQingjiao,real relZZhouYuxuan,real relZZhouXuanjiao,integer intFuzhuLeixing,integer intShuliang,string strHuancunLeibie returns nothing
local integer intXunhuan = 1 //定义循环整数
local real relYuanxinjiao //定义圆心角
local real relTuoyuanBanjing //定义椭圆半径
local real relTuoyuanYuanxinjiao //定义椭圆圆心角
local real relGaodu //定义特效单位高度
local location locTuoyuan //定义特效单位位置
local unit untTexiao //定义特效单位
//
if intFuzhuLeixing == -1 then //等于-1表示要移动特效
set intShuliang = GetStoredInteger(CacheHuayuan(), strHuancunLeibie, "Shuliang")
if locYuanxin == null then
set locYuanxin = Location(GetStoredReal(CacheHuayuan(), strHuancunLeibie, "XZuobiao"), GetStoredReal(CacheHuayuan(), strHuancunLeibie, "YZuobiao"))
endif
if strHuancunLeibie == "" then //捕获参数错误
call DisplayTextToForce( GetPlayersAll(), "|cffff0000参数错误:|cffffff00移动特效时必须指定特效所在缓存类别!|r" )
endif
else //不等于-1表示要创建特效
if intFuzhuLeixing == 0 then //捕获参数错误
call DisplayTextToForce( GetPlayersAll(), "|cffff0000参数错误:|cffffff00没有指定辅助单位的类型!|r" )
return
endif
if intShuliang <= 0 then
call DisplayTextToForce( GetPlayersAll(), "|cffff0000参数错误:|cffffff00辅助单位的数量必须为正整数!|r" )
return
endif
if locYuanxin == null then
call DisplayTextToForce( GetPlayersAll(), "|cffff0000参数错误:|cffffff00没有指定圆心!|r" )
return
endif
if strHuancunLeibie != "" then //类别为空表示不记录本次创建的特效单位
call StoreReal(CacheHuayuan(), strHuancunLeibie, "XZuobiao", GetLocationX(locYuanxin)) //缓存记录圆心X坐标
call StoreReal(CacheHuayuan(), strHuancunLeibie, "YZuobiao", GetLocationY(locYuanxin)) //缓存记录圆心Y坐标
call StoreInteger(CacheHuayuan(), strHuancunLeibie, "Shuliang", intShuliang) //缓存记录特效单位数量
call StoreInteger(CacheHuayuan(), strHuancunLeibie, "JiluShuliang", intShuliang) //缓存记录该类别的记录数量
//记录数量初始=特效数量,但是记录数量会随单位死亡而被改写,特效数量则不会,所以要分开记录。
endif
endif
loop
exitwhen intXunhuan > intShuliang
//
// 计算循环整数指定的圆心角
set relYuanxinjiao = ( intXunhuan * ( 360.00 / intShuliang ) )
//
// 加上预旋角度的影响,因为可能会大于360°,所以要取模
set relYuanxinjiao = ModuloReal( ( relYuanxinjiao + relZZhouYuxuan ),360 )
//
// 计算在当前圆心角下,圆半径的投影长度,即对应的椭圆半径的长度。
set relTuoyuanBanjing = ( relYuanBanjing * SquareRoot(( 1 - ( Pow( SinBJ(relYuanxinjiao ),2 ) ) * ( Pow(SinBJ(relQingjiao) ,2) ) ) ))
//
// 计算在当前圆心角在地面的投影,即对应的椭圆圆心角的大小。
set relTuoyuanYuanxinjiao = AtanBJ(( ( SinBJ(relYuanxinjiao) * CosBJ(relQingjiao) ) / CosBJ(relYuanxinjiao ) ))
//
// 计算在当前圆心角下,圆周上对应点的飞行高度。
set relGaodu = ( ( relYuanBanjing * ( SinBJ(relQingjiao) * SinBJ(relYuanxinjiao) ) ) + relYuanxinGaodu )
//
// 因为反正切定义域的问题,求得的椭圆圆心角与实际需要的不符合,用下边的语句串修正。
if ( relYuanxinjiao > 90.00 and relYuanxinjiao <= 270.00 ) then
set relTuoyuanYuanxinjiao = ( 180.00 + relTuoyuanYuanxinjiao ) //校正椭圆圆心角
endif
set relTuoyuanYuanxinjiao = ( relTuoyuanYuanxinjiao + relZZhouXuanjiao ) //加上Z轴旋转角度的影响
//
// 计算在当前圆心角下,圆周上对应点在地面的投影,即椭圆圆周上的对应点。
set locTuoyuan = PolarProjectionBJ(locYuanxin, relTuoyuanBanjing, relTuoyuanYuanxinjiao)
//
if intFuzhuLeixing == -1 then //等于-1表示要移动圆
set untTexiao = I2U(GetStoredInteger(CacheHuayuan(),strHuancunLeibie,I2S(intXunhuan))) //得到缓存里的单位
call SetUnitPositionLocFacingBJ( untTexiao, locTuoyuan, relTuoyuanYuanxinjiao ) //移动特效单位到计算出的位置。
else //不等于-1表示要创建圆
set untTexiao = CreateUnitAtLoc(Player(15),intFuzhuLeixing,locTuoyuan,relTuoyuanYuanxinjiao) //设置特效单位为新创建指定类型的单位
if untTexiao == null then //如果创建失败,提示指定的单位类型无效
call DisplayTextToForce( GetPlayersAll(), "|cffff0000参数错误:|cffffff00辅助单位的类型ID无效!|r")
return
endif
if strHuancunLeibie != "" then
call StoreInteger(CacheHuayuan(), strHuancunLeibie, I2S(intXunhuan), H2I(untTexiao)) //缓存记录最后创建的单位
call StoreString(CacheHuayuan(), I2S(H2I(untTexiao)), "Leibie", strHuancunLeibie) //缓存记录该单位的记录类别
call StoreString(CacheHuayuan(), I2S(H2I(untTexiao)), "Bianhao", I2S(intXunhuan)) //缓存记录该单位的记录编号
endif
endif
if relYuanxinGaodu != -1 then //指定的圆心高度等于-1表示不重新设置高度
call SetUnitFlyHeight( untTexiao, relGaodu, 0.00 ) //设置特效单位的飞行高度。
endif
call RemoveLocation( locTuoyuan ) //清除点
set intXunhuan = intXunhuan + 1
endloop
call RemoveLocation( locYuanxin ) //清除点
set locYuanxin = null //设null
set locTuoyuan = null //设null
set untTexiao = null
endfunction
//移动特效函数
function YidongYuan takes location locYuanxin,real relYuanxinGaodu,real relYuanBanjing,real relQingjiao,real relZZhouYuxuan,real relZZhouXuanjiao,string strHuancunLeibie returns nothing
call Main(locYuanxin, relYuanxinGaodu, relYuanBanjing, relQingjiao, relZZhouYuxuan, relZZhouXuanjiao,-1,0, strHuancunLeibie)
endfunction
//创建特效函数
function HuaYuan takes location locYuanxin,real relYuanxinGaodu,real relYuanBanjing,real relQingjiao,real relZZhouYuxuan,real relZZhouXuanjiao,integer intFuzhuLeixing,integer intShuliang,string strHuancunLeibie returns nothing
call Main(locYuanxin, relYuanxinGaodu, relYuanBanjing, relQingjiao, relZZhouYuxuan, relZZhouXuanjiao,intFuzhuLeixing,intShuliang, strHuancunLeibie)
endfunction
//清除缓存
function QingchuHuancun takes nothing returns nothing
local string s
local string s2
local integer intJilu
set s = GetStoredString(CacheHuayuan(),I2S(H2I(GetTriggerUnit())),"Leibie")
if s == null then //等于null表示该单位没有被缓存记录
return
endif
set intJilu = GetStoredInteger(CacheHuayuan(), s, "JiluShuliang") - 1 //为缓存记录的数量减1
if intJilu == 0 then //如果该类别的记录仅剩当前单位,做彻底清除,否则,仅删除相关单位
call FlushStoredMission(CacheHuayuan(),s) //清除记录特效的整个数据类别
else
call StoreInteger(CacheHuayuan(), s, "JiluShuliang", intJilu) //更新缓存记录该类别的记录数量
set s2 = GetStoredString(CacheHuayuan(),I2S(H2I(GetTriggerUnit())),"Bianhao")
call FlushStoredInteger(CacheHuayuan(),s,s2) //清除特效记录类别中关于该单位的记录
endif
call FlushStoredMission(CacheHuayuan(),I2S(H2I(GetTriggerUnit()))) //清除关于该特效单位的数据
endfunction
function DanweiSiwang takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
call TriggerAddAction( t, function QingchuHuancun )
set t = null
endfunction
[/codes] |
|