请选择 进入手机版 | 继续访问电脑版

GA地精研究院

 找回密码
 立即注册
查看: 1422|回复: 16

[演示&系统] 通用函数集合帖 又是黑科技系列

[复制链接]
发表于 2014-12-20 18:27:55 | 显示全部楼层 |阅读模式
既然百度贴吧魔兽争霸编辑器吧的大神们都喜欢弄1套自己的通用函数库 那我就收集整理1下吧
话说天灵萃梦和橙子貌似失踪了? N年不见人影了
1 图片弹幕函数(预读的)


  • // -------------
  • //real MOVEIMAGETIMER_TIMEOUT=0.04
  • //! textmacro imageBulletsFunction takes NAME
  • globals
  •     image array imageBullet_$NAME$_images
  •     timer imageBullet_$NAME$_timer
  •     integer imageBullet_$NAME$_Max=0
  •     integer imageBullet_$NAME$_imageMax=0
  •     integer array imageBullet_$NAME$_id
  •     unit array imageBullet_$NAME$_spellunit
  •     real array imageBullet_$NAME$_x
  •     real array imageBullet_$NAME$_y
  •     real array imageBullet_$NAME$_z
  •     real array imageBullet_$NAME$_speed_x
  •     real array imageBullet_$NAME$_speed_y
  •     real array imageBullet_$NAME$_distance
  •     real array imageBullet_$NAME$_speed
  •     string array imageBullet_$NAME$_effpath
  •     string array imageBullet_$NAME$_targeteffpath
  •     real array imageBullet_$NAME$_collision
  •     real array imageBullet_$NAME$_range
  •     integer udg_$NAME$_Max = 0
  •     integer array udg_$NAME$_Flu
  • endglobals
  • function Create_$NAME$_Id takes nothing returns integer
  •     set udg_$NAME$_Max = udg_$NAME$_Max + 1
  •     debug call BJDebugMsg("$NAME$_Max_ID="+I2S(udg_$NAME$_Max))
  •     if udg_$NAME$_Max>8190 then
  •         call BJDebugMsg("|cffff0000 CreateImageId_$NAME$_error: cannot create id (>8190)|r")
  •         return 0
  •     endif
  •     if udg_$NAME$_Flu[udg_$NAME$_Max == 0 then
  •         return udg_$NAME$_Max
  •     endif
  •     return udg_$NAME$_Flu[udg_$NAME$_Max
  • endfunction
  • function Remove_$NAME$_Id takes integer tid returns nothing
  •     set udg_$NAME$_Flu[udg_$NAME$_Max = tid
  •     set udg_$NAME$_Max = udg_$NAME$_Max - 1
  •     debug call BJDebugMsg("$NAME$_Max_ID="+I2S(udg_$NAME$_Max))
  • endfunction
  • function imageBullet_$NAME$_Preload takes nothing returns nothing
  •     local integer c=imageBullet_$NAME$_imageMax+IMAGE_BULLET_PRELOAD_AMOUNT
  •     debug call BJDebugMsg("Image_$NAME$ is preloading")
  •     if c>8190 then
  •         call BJDebugMsg("|cffff0000 Image_$NAME$_error: preload is failed|r")
  •         return
  •     endif
  •     loop
  •         set imageBullet_$NAME$_imageMax=imageBullet_$NAME$_imageMax+1
  •         exitwhen imageBullet_$NAME$_imageMax>c
  •         set imageBullet_$NAME$_images[imageBullet_$NAME$_imageMax=CreateImage(IMAGE_BULLETS_paths[$NAME$,IMAGE_BULLETS_size[$NAME$,IMAGE_BULLETS_size[$NAME$,IMAGE_BULLETS_size[$NAME$,0,0,0,0,0,0,2)
  •         call ShowImage(imageBullet_$NAME$_images[imageBullet_$NAME$_imageMax,false)
  •         call SetImageRenderAlways(imageBullet_$NAME$_images[imageBullet_$NAME$_imageMax,true)
  •     endloop
  •     set imageBullet_$NAME$_imageMax=imageBullet_$NAME$_imageMax-1
  • endfunction
  • function imageBullet_$NAME$_Delete takes integer id returns nothing
  •     call ShowImage(imageBullet_$NAME$_images[imageBullet_$NAME$_id[id,false)
  •     call Remove_$NAME$_Id(imageBullet_$NAME$_id[id)
  •     set imageBullet_$NAME$_id[id=imageBullet_$NAME$_id[imageBullet_$NAME$_Max
  •     set imageBullet_$NAME$_Max=imageBullet_$NAME$_Max-1
  • endfunction
  • function imageBullet_$NAME$_New takes unit spellunit,real x,real y,real z,real angle,real speed,real distance,string effpath,real collision,real range,string targeteffpath returns nothing
  •     local integer id
  •     set imageBullet_$NAME$_Max=imageBullet_$NAME$_Max+1
  •     set id=imageBullet_$NAME$_Max
  •     if id>imageBullet_$NAME$_imageMax then
  •         call imageBullet_$NAME$_Preload()
  •     endif
  •     set imageBullet_$NAME$_id[imageBullet_$NAME$_Max=Create_$NAME$_Id()
  •     set id=imageBullet_$NAME$_id[imageBullet_$NAME$_Max
  •     set imageBullet_$NAME$_spellunit[id=spellunit
  •     set imageBullet_$NAME$_x[id=x
  •     set imageBullet_$NAME$_y[id=y
  •     set imageBullet_$NAME$_z[id=z
  •     set speed=speed*MOVEIMAGETIMER_TIMEOUT
  •     set imageBullet_$NAME$_speed_x[id=speed*Cos(angle)
  •     set imageBullet_$NAME$_speed_y[id=speed*Sin(angle)
  •     set imageBullet_$NAME$_distance[id=distance
  •     set imageBullet_$NAME$_speed[id=speed
  •     set imageBullet_$NAME$_effpath[id=effpath
  •     set imageBullet_$NAME$_targeteffpath[id=targeteffpath
  •     set imageBullet_$NAME$_collision[id=collision
  •     set imageBullet_$NAME$_range[id=range
  •     call ShowImage(imageBullet_$NAME$_images[id,true)
  •     call SetImagePosition(imageBullet_$NAME$_images[id,x,y,z)
  • endfunction
  • function imageBullet_$NAME$_TimerAction takes nothing returns nothing
  •     local integer id
  •     local integer i
  •     local group g
  •     local unit u
  •     local boolean b
  •     local player p
  •     set i=imageBullet_$NAME$_Max
  •     loop
  •         exitwhen i<=0
  •         set id=imageBullet_$NAME$_id[i
  •         set b=false
  •         set p=GetOwningPlayer(imageBullet_$NAME$_spellunit[id)
  •         if imageBullet_$NAME$_effpath[id!=null then
  •             call DestroyEffect(AddSpecialEffect(imageBullet_$NAME$_effpath[id,imageBullet_$NAME$_x[id,imageBullet_$NAME$_y[id))
  •         endif
  •         set imageBullet_$NAME$_x[id=imageBullet_$NAME$_x[id+imageBullet_$NAME$_speed_x[id
  •         set imageBullet_$NAME$_y[id=imageBullet_$NAME$_y[id+imageBullet_$NAME$_speed_y[id
  •         if (imageBullet_$NAME$_x[id>MAP_MINX)and(imageBullet_$NAME$_y[id>MAP_MINY)and(imageBullet_$NAME$_x[id<MAP_MAXX)and(imageBullet_$NAME$_y[id<MAP_MAXY) then
  •             call SetImagePosition(imageBullet_$NAME$_images[id,imageBullet_$NAME$_x[id,imageBullet_$NAME$_y[id,imageBullet_$NAME$_z[id)
  •         else
  •             set b=true
  •         endif
  •         set imageBullet_$NAME$_distance[id=imageBullet_$NAME$_distance[id-imageBullet_$NAME$_speed[id
  •         if imageBullet_$NAME$_distance[id<=0 then
  •             set b=true
  •             set g=CreateGroup()
  •             call GroupEnumUnitsInRange(g,imageBullet_$NAME$_x[id,imageBullet_$NAME$_y[id,imageBullet_$NAME$_range[id,null)
  •             loop
  •                 set u = FirstOfGroup(g)
  •                 exitwhen u == null
  •                 if (GetUnitState(u,UNIT_STATE_LIFE)>0 and IsUnitEnemy(u,p)) then
  •                     // call Damage 此处为伤害动作
  •                 endif
  •                 call GroupRemoveUnit(g,u)
  •             endloop
  •         else
  •             set g=CreateGroup()
  •             call GroupEnumUnitsInRange(g,imageBullet_$NAME$_x[id,imageBullet_$NAME$_y[id,imageBullet_$NAME$_collision[id,null)
  •             loop
  •                 set u = FirstOfGroup(g)
  •                 exitwhen u == null
  •                 if (GetUnitState(u,UNIT_STATE_LIFE)>0 and IsUnitEnemy(u,p)) or b then
  •                     call GroupEnumUnitsInRange(g,imageBullet_$NAME$_x[id,imageBullet_$NAME$_y[id,imageBullet_$NAME$_range[id,null)
  •                     loop
  •                         set u = FirstOfGroup(g)
  •                         exitwhen u == null
  •                         if (GetUnitState(u,UNIT_STATE_LIFE)>0 and IsUnitEnemy(u,p)) then
  •                             // call Damage 此处为伤害动作
  •                         endif
  •                         call GroupRemoveUnit(g,u)
  •                     endloop
  •                     set b=true
  •                     exitwhen true
  •                 endif
  •                 call GroupRemoveUnit(g,u)
  •             endloop
  •         endif
  •         call DestroyGroup(g)
  •         set g = null
  •         if b then
  •             if imageBullet_$NAME$_targeteffpath[id!=null then
  •                 call DestroyEffect(AddSpecialEffect(imageBullet_$NAME$_targeteffpath[id,imageBullet_$NAME$_x[id,imageBullet_$NAME$_y[id))
  •             endif
  •             call imageBullet_$NAME$_Delete(i)
  •         endif
  •         set i=i-1
  •     endloop
  • endfunction
  • function imageBullet_$NAME$_init takes nothing returns nothing
  •     set imageBullet_$NAME$_timer=CreateTimer()
  •     call TimerStart(imageBullet_$NAME$_timer,MOVEIMAGETIMER_TIMEOUT,true,function imageBullet_$NAME$_TimerAction)
  • endfunction
  • //! endtextmacro
  • // -------------
  • //! textmacro imageBulletsInit takes NAME,PATH,SIZE
  • set IMAGE_BULLETS_paths[$NAME$="$PATH$"
  • set IMAGE_BULLETS_size[$NAME$=$SIZE$
  • call imageBullet_$NAME$_init()
  • //! endtextmacro
  • globals
  •     real MOVEIMAGETIMER_TIMEOUT=0.04
  •     integer IMAGE_BULLET_PRELOAD_AMOUNT=50 //每次预创建数量
  •     string array IMAGE_BULLETS_paths
  •     real array IMAGE_BULLETS_size
  •     real MAP_MINX=-15594 //地图范围
  •     real MAP_MINY=-15860
  •     real MAP_MAXX=15578
  •     real MAP_MAXY=15342
  • endglobals
  • //! runtextmacro imageBulletsFunction("1")
  • // 参数为数字,做为下标
  • function IMAGE_BULLET_init takes nothing returns nothing
  •     //! runtextmacro imageBulletsInit("1","Cast_BallGreen.BLP","32")
  •     // 设置 1号图片弹幕 图片为Cast_BallGreen.BLP, 大小为32x32x32
  • endfunction
  • // call imageBullet_1_New(spellunit,x,y,z,angle,speed,distance,effpath,collision,range,targeteffpath)
  • // 发布弹幕的单位,坐标x,y,高度z,方向(弧度),速度,距离,路径特效(无则填null),碰撞半径,伤害范围,终点特效(无则填null)



  1. globals
  2. integer array MoveIndex
  3. real array MoveSpeed
  4. // real array MoveAngle
  5. real array MoveRange
  6. real array MoveDamageRange
  7. real array MoveDamage
  8. real array MoveDistance
  9. real array MoveCos
  10. real array MoveSin
  11. unit array MoveUnit
  12. unit array MoveDamageUnit
  13. boolean array MoveAllyRange
  14. boolean BarrierUnitSetsel
  15. integer SetselInt
  16. endglobals
  17. function PopUnit takes integer id returns nothing
  18. local integer i=MoveIndex[0]
  19. set MoveUnit[id]=MoveUnit[i]
  20. set MoveSpeed[id]=MoveSpeed[i]
  21. set MoveDistance[id]=MoveDistance[i]
  22. // set MoveAngle[id]=MoveAngle[i]
  23. set MoveCos[id]=MoveCos[i]
  24. set MoveSin[id]=MoveSin[i]
  25. set MoveAllyRange[id]=MoveAllyRange[i]
  26. set MoveDamageUnit[id]=MoveDamageUnit[i]
  27. set MoveDamageRange[id]=MoveDamageRange[i]
  28. set MoveRange[id]=MoveRange[i]
  29. set MoveDamage[id]=MoveDamage[i]
  30. set MoveUnit[i]=null
  31. set MoveIndex[0]=i-1//指针左移
  32. endfunction
  33. function MoveMode takes nothing returns nothing
  34. local integer i=MoveIndex[0]//获得栈里当前记录单位数
  35. local real x
  36. local real y
  37. local group g0
  38. local group g1
  39. local unit u
  40. local unit u1
  41. local unit mu
  42. local unit du
  43. loop
  44. exitwhen i == 0// 如果栈拥有 >0 个单位 就会从 高id往低id 的对栈里每个单位执行动作
  45. // call BJDebugMsg("a 遍历到了 i = "+I2S(i))
  46. // call BJDebugMsg("b i="+I2S(i)+" 判断距离是否到了 = "+R2S(MoveDistance[i]))
  47. set mu=MoveUnit[i]
  48. if MoveDistance[i]<0 then//如果移动距离到了 就杀死单位 记录销毁序号
  49. call KillUnit(mu)//就杀死单位
  50. // set MoveIndex[MoveIndex[0]]=i//记录销毁序号
  51. call PopUnit(i)
  52. // call BJDebugMsg("c end i="+I2S(i)+" 距离到了 杀死单位 i("+I2S(i)+")入栈 指针-1 = "+I2S(MoveIndex[0]))
  53. else//否则移动单位 同时判断是否碰撞单位 如果碰到就不移动
  54. set du=MoveDamageUnit[i]
  55. set x=GetUnitX(mu)+MoveCos[i]//获得位移坐标x
  56. set y=GetUnitY(mu)+MoveSin[i]//获得位移坐标y
  57. // call BJDebugMsg("c i="+I2S(i)+" 距离没到 准备移动单位("+R2S(GetUnitX(MoveUnit[i]))+","+R2S(GetUnitY(MoveUnit[i]))+") 到 ("+R2S(x)+","+Rsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  58. set BarrierUnitSetsel=false//初始化布尔值变量
  59. set g0=CreateGroup()
  60. call GroupEnumUnitsInRange(g0,x,y,MoveRange[i],null)//选取坐标附近指定范围的所有单位检查条件是否匹配
  61. loop
  62. set u=FirstOfGroup(g0)
  63. exitwhen u == null
  64. if not(IsUnitType(u,UNIT_TYPE_DEAD)) and ((MoveAllyRange[i] and u != du and u != mu) or IsUnitEnemy(du,GetOwningPlayer(u))) and not(BarrierUnitSetsel) then
  65. set BarrierUnitSetsel=true//设置此判断变量真 然后伤害选取到的敌人
  66. if MoveDamageRange[i] == 0 then
  67. call UnitDamageTarget(du,u,MoveDamage[i],true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS )
  68. elseif MoveDamageRange[i]<0 then
  69. call UnitDamagePoint(du,0,0-MoveDamageRange[i],GetUnitX(u),GetUnitY(u),MoveDamage[i],true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
  70. else
  71. set g1=CreateGroup()
  72. call GroupEnumUnitsInRange(g1,GetUnitX(u),GetUnitY(u),MoveDamageRange[i],null)
  73. loop
  74. set u1=FirstOfGroup(g1)
  75. exitwhen u1 == null
  76. if IsUnitType(u1,UNIT_TYPE_DEAD) == false and IsUnitEnemy(du,GetOwningPlayer(u1)) then
  77. call UnitDamageTarget(du,u1,MoveDamage[i],true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS )
  78. endif
  79. call GroupRemoveUnit(g1,u1)
  80. endloop
  81. call DestroyGroup(g1)
  82. set g1=null
  83. endif
  84. call KillUnit(mu)//杀死弹幕单位
  85. call PopUnit(i)
  86. endif
  87. call GroupRemoveUnit(g0,u)
  88. endloop
  89. set du=null
  90. call DestroyGroup(g0)
  91. set g0=null
  92. // call BJDebugMsg("i 选取完")
  93. if not(BarrierUnitSetsel or IsTerrainPathable(x,y,PATHING_TYPE_FLYABILITY)) then//如果此为假 亦即没有选取到敌人单位
  94. call SetUnitX(mu,x)//移动单位到指定x坐标
  95. call SetUnitY(mu,y)//移动单位到指定y坐标
  96. // call BJDebugMsg("j end 没有碰到敌人")
  97. // else
  98. // call BJDebugMsg("j end 碰到敌人了")
  99. endif
  100. set MoveDistance[i]=MoveDistance[i]-MoveSpeed[i]//减少记录的距离 亦即记录剩下移动距离
  101. set mu=null
  102. endif
  103. set i=i-1
  104. endloop
  105. endfunction
  106. //call AddMoveMode(玩家,辅助单位id,伤害来源,初始x,初始y,移动角度,移动速度,最大距离,伤害范围,碰撞检查范围,伤害值)
  107. //角度 按角度制即 0-360
  108. //伤害来源 即最终伤害由谁给出
  109. //伤害范围 设置0 即只伤害目标 设置了正数 就能范围伤害(不伤害队友) 设置负数 伤害队友的范围伤害
  110. //碰撞检查范围 设置了正数 就碰到敌人才爆炸 设置负数 碰到队友也爆炸
  111. function AddMoveMode takes player p,integer uid,unit Damage,real x0,real y0,real r,real speed,real juli,real drange,real range,real damage returns nothing
  112. local integer i
  113. set MoveIndex[0]=MoveIndex[0]+1 //指针右移
  114. if MoveIndex[MoveIndex[0]] != 0 then //如果此位置记录销毁id
  115. set i=MoveIndex[MoveIndex[0]] //设置取得id=此被销毁id
  116. else //如果此位置没记录销毁id
  117. set i=MoveIndex[0] //设置取得id=指针位置
  118. endif
  119. set MoveUnit[i]=CreateUnit(p,uid,x0,y0,r)//创建单位 记录单位
  120. set r=bj_DEGTORAD*r //把角度制转 弧度制 (例:180转bj_PI)
  121. set MoveDamageUnit[i]=Damage
  122. if MoveDamageUnit[i] == null then
  123. set MoveDamageUnit[i]=MoveUnit[i]
  124. endif
  125. set MoveSpeed[i]=speed//记录速度
  126. set MoveDistance[i]=juli//记录最大距离
  127. // set MoveAngle[i]=r//记录移动角度
  128. set MoveAllyRange[i]=range<0
  129. set MoveDamageRange[i]=drange
  130. if MoveAllyRange[i] then
  131. set MoveRange[i]=0-range//记录碰撞检查范围
  132. else
  133. set MoveRange[i]=range//记录碰撞检查范围
  134. endif
  135. set MoveDamage[i]=damage//记录伤害值
  136. set MoveCos[i]=Cos(r)*MoveSpeed[i]
  137. set MoveSin[i]=Sin(r)*MoveSpeed[i]
  138. endfunction
  139. function InitMoveMode takes nothing returns nothing//初始化函数
  140. call TimerStart(CreateTimer(),.01,true,function MoveMode)//永久开启计时器
  141. endfunction
复制代码


调用方法:call AddMoveMode(玩家,辅助单位id,伤害来源,初始x,初始y,移动角度,移动速度,最大距离,伤害范围,碰撞检查范围,伤害值)
//角度 按角度制即 0-360
//伤害来源 即最终伤害由谁给出
//伤害范围 设置0 即只伤害目标 设置了正数 就能范围伤害(不伤害队友) 设置负数 伤害队友的范围伤害
//碰撞检查范围 设置了正数 就碰到敌人才爆炸 设置负数 碰到队友也爆炸


  1. 2.AngleBetweenAngles 角度差
  2. function AngleBetweenAnglesDEG takes real f1,real f2 returns real
  3.     local real r=f1-f2
  4.     if r<0. then
  5.         if r<-180. then
  6.             return 360.+r
  7.         else
  8.             return -r
  9.         endif
  10.     else
  11.         if r<180. then
  12.             return r
  13.         else
  14.             return 360.-r
  15.         endif
  16.     endif
  17. endfunction

  18. function AngleBetweenAnglesRAD takes real f1,real f2 returns real
  19.     local real r=f1-f2
  20.     if r<0. then
  21.         if r<-bj_PI then
  22.             return 6.28319+r
  23.         else
  24.             return -r
  25.         endif
  26.     else
  27.         if r<bj_PI then
  28.             return r
  29.         else
  30.             return 6.28319-r
  31.         endif
  32.     endif
  33. endfunction
  34. //------------------------
  35. 3.GetNearestUnitInRange 得到一定范围内距离某坐标最近的单位
  36. function DistanceBetweenCoords takes real Ax,real Ay,real Bx,real By returns real
  37.     local real dx = Bx-Ax
  38.     local real dy = By-Ay
  39.     return SquareRoot(dx * dx + dy * dy)
  40. endfunction
  41. function GetNearestUnitInRangeA takes unit tu,unit u,real x,real y,real range,boolexpr filter returns unit
  42.     local group g=CreateGroup()
  43.     local real dis
  44.     call GroupEnumUnitsInRange(g,x,y,range,filter)
  45.     set u=FirstOfGroup(g)
  46.     set tu=u
  47.     loop
  48.         exitwhen u==null
  49.         set dis=DistanceBetweenCoords(GetUnitX(u),GetUnitY(u),x,y)
  50.         if dis<range then
  51.             set range=dis
  52.             set tu=u
  53.         endif
  54.         call GroupRemoveUnit(g,u)
  55.         set u=FirstOfGroup(g)
  56.     endloop
  57.     call DestroyGroup(g)
  58.     set g=null
  59.     return tu
  60. endfunction
  61. function GetNearestUnitInRange takes real x,real y,real range,boolexpr filter returns unit
  62.     return GetNearestUnitInRangeA(null,null,x,y,range,filter)
  63. endfunction
复制代码


  1. 4.DistanceFromPointToLine 点到直线距离

  2. function DistanceFromPointToLine_PK takes real pointX, real pointY, real lineX, real lineY, real angle returns real
  3.     //调用 DistanceFromPointToLine_PK(点坐标x,点坐标y,直线上一点坐标x,直线上一点坐标y,直线角度)
  4.     //返回 任意一点到直线的距离     弧度制 -bj_PI ~ bj_PI
  5.     local real lineA
  6.     set lineA = Tan(angle)
  7.     set lineA = (lineA*pointX-pointY-lineA*lineX+lineY)/SquareRoot(lineA*lineA+1)
  8.     if lineA>=0 then
  9.         return lineA
  10.     else
  11.         return -lineA
  12.     endif
  13. endfunction

  14. function DistanceFromPointToLine takes real x0, real y0, real Aa, real Ba, real Ca returns real
  15.     //任意一点(x,y)到直线(Ax+By+C=0)的距离
  16.     set Aa = (x0*Aa+y0*Ba+Ca)/SquareRoot(Aa*Aa+Ba*Ba)
  17.     if Aa>=0 then
  18.         return Aa
  19.     else
  20.         return -Aa
  21.     endif
  22. endfunction
  23. //==============================
  24. 5.GroupEnumUnitsInRectangle 选取任意角度矩形范围内单位组
  25. function IsInRectangle takes real cx,real cy,real x,real y,real l,real w,real angle returns boolean
  26.     local real dis
  27.     local real dx
  28.     local real dy
  29.     set l=l/2
  30.     set w=w/2
  31.     set dx=cx-x
  32.     set dy=cy-y
  33.     set dis=SquareRoot(dx*dx+dy*dy)
  34.     set angle=Atan2(dy,dx)-angle
  35.     set cx=x+dis*Cos(angle)
  36.     set cy=y+dis*Sin(angle)
  37.     return (cx>x-l and cx<x+l and cy>y-w and cy<y+w)
  38. endfunction
  39. globals
  40.     real udg_GEUIRA_tempX
  41.     real udg_GEUIRA_tempY
  42.     real udg_GEUIRA_tempA
  43.     real udg_GEUIRA_tempL
  44.     real udg_GEUIRA_tempW
  45. endglobals
  46. function GroupEnumUnitsInRectangleFilter takes nothing returns boolean
  47.     return IsInRectangle(GetUnitX(GetFilterUnit()),GetUnitY(GetFilterUnit()),udg_GEUIRA_tempX,udg_GEUIRA_tempY,udg_GEUIRA_tempL,udg_GEUIRA_tempW,udg_GEUIRA_tempA)
  48. endfunction
  49. function GroupEnumUnitsInRectangle takes group g,real x,real y,real l,real w,real angle returns nothing
  50.     //点x,y为矩形中心
  51.     set udg_GEUIRA_tempX=x
  52.     set udg_GEUIRA_tempY=y
  53.     set udg_GEUIRA_tempA=angle
  54.     set udg_GEUIRA_tempL=l
  55.     set udg_GEUIRA_tempW=w
  56.     call GroupEnumUnitsInRange(g,x,y,SquareRoot(l*l+w*w)/2,Condition(function GroupEnumUnitsInRectangleFilter))
  57. endfunction
复制代码


  1. //=======================================================
  2. //  函数:CreateEffectEX(locA,locB,modelName,rmLocs)
  3. //        @locA:施法单位点
  4. //        @locB:施法区域点
  5. //        @modelName:特效模型路径,路径中的""请使用"\"代替,进行特殊字符转义
  6. //        @rmLocs:是否删除点
  7. //=======================================================
  8. function CreateEffectEX takes location locA,location locB,string modelName,boolean rmLocs returns nothing
  9.     local real tempX = GetLocationX(locA)
  10.     local real tempY = GetLocationX(locB)
  11.     local real dis = DistanceBetweenPoints(locA,locB)
  12.     local real angle = AngleBetweenPoints(locA,locB)
  13.     local integer index = 0
  14.     loop
  15.         set tempX = tempX + 24*Cos(angle*bj_DEGTORAD)
  16.         set tempY = tempY + 24*Sin(angle*bj_DEGTORAD)
  17.         call DestroyEffect(AddSpecialEffect(modelName,tempX,tempY))
  18.         set index = index + 1
  19.         exitwhen index > dis/24
  20.     endloop
  21.     if rmLocs then
  22.         call RemoveLocation(locA)
  23.         call RemoveLocation(locB)
  24.     endif
  25. endfunction

  26. 把下面函数贴在全局函数中,在触发中使用[ 自定义代码:call CreateEffectEX(locA,locB,modelName,rmLocs) ]调用这个函数就可以进行两点间任意特效创建了,特效的模型由自己指定。
复制代码
 楼主| 发表于 2014-12-20 18:31:16 | 显示全部楼层
@actboy168 不知道你还记得自己做的通用弹幕函数麽? 最近还在添加新的功能麽? 还是说能集成到UI里方便在T中直接调用? 减少工作量
@ckpig 蠢ck快去做1个CKUI出来啊 现在贴吧出了个5in1的UI集合版 我当时就震精了!
QQ图片20141202155546.gif
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-20 18:33:17 | 显示全部楼层
本帖最后由 RoyalFlare 于 2014-12-20 18:34 编辑

  1. //两个坐标之间的角度
  2. function tdbv4 takes real x1,real y1,real x2,real y2 returns real
  3.    return bj_RADTODEG*Atan2(y2-y1,x2-x1)
  4. endfunction

  5. //两个坐标之间的距离
  6. function tdbv3 takes real x1,real y1,real x2,real y2 returns real
  7.    return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  8. endfunction

  9. //两个单位之间的距离
  10. function disU2U takes unit u,unit u1 returns real
  11.    local real y2 = GetUnitY(u1)
  12.    local real y1 = GetUnitY(u)
  13.    local real x2 = GetUnitX(u1)
  14.    local real x1 = GetUnitX(u)
  15.    return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  16. endfunction

  17. //两个单位之间个角度
  18. function angU2U takes unit u,unit u1 returns real
  19.    local real y2 = GetUnitY(u1)
  20.    local real y1 = GetUnitY(u)
  21.    local real x2 = GetUnitX(u1)
  22.    local real x1 = GetUnitX(u)
  23.    return bj_RADTODEG*Atan2(y2-y1,x2-x1)
  24. endfunction
复制代码


  1. //单位组伤害函数

  2. function fun takes unit u ,real x, real y , real distance ,real hurt,string strings ,boolean hurt1,integer i returns nothing
  3. local unit u1
  4. call GroupEnumUnitsInRange(e,x,y,distance,null)
  5. loop
  6. set u1 = FirstOfGroup(e)
  7. exitwhen u1 == null
  8. if Con(u,u1,i) then
  9. if strings != "" then
  10.     call DestroyEffect( AddSpecialEffect(strings, GetUnitX(u1), GetUnitY(u1)) )
  11. endif
  12. call UnitDamageTarget( u, u1, hurt, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS )
  13. call GroupRemoveUnit( e, u1 )
  14. else
  15. call GroupRemoveUnit( e, u1 )
  16. endif
  17. endloop
  18. call GroupClear(e)
  19. set u1 = null
  20. endfunction
复制代码

  1. //1.24timerunits库
  2. library_once TimerUtils
  3.     globals
  4.         private constant integer MAX_HANDLE_ID_COUNT = 408000
  5.         private integer array data[MAX_HANDLE_ID_COUNT]
  6.         private constant integer MIN_HANDLE_ID=0x100000
  7.         private constant integer HELD=0x28829022
  8.         private timer array tT
  9.         private integer tN = 0
  10.     endglobals
  11.     function SetTimerData takes timer t, integer value returns nothing
  12.         set data[GetHandleId(t)-MIN_HANDLE_ID]=value
  13.     endfunction
  14.     function GetTimerData takes timer t returns integer
  15.        return data[GetHandleId(t)-MIN_HANDLE_ID]
  16.     endfunction
  17.     function NewTimer takes nothing returns timer
  18.         if (tN==0) then
  19.             set tT[0]=CreateTimer()
  20.         else
  21.             set tN=tN-1
  22.         endif
  23.         call SetTimerData(tT[tN],0)
  24.      return tT[tN]
  25.     endfunction
  26.     function ReleaseTimer takes timer t returns nothing
  27.         if(t==null) then
  28.             return
  29.         endif
  30.         if (tN==8191) then
  31.             call DestroyTimer(t)
  32.         else
  33.             call PauseTimer(t)
  34.             if(GetTimerData(t)==HELD) then
  35.                 return
  36.             endif
  37.             call SetTimerData(t,HELD)
  38.             set tT[tN]=t
  39.             set tN=tN+1
  40.         endif   
  41.     endfunction
  42. endlibrary
复制代码


  1. //跳跃函数
  2. library flyhigh requires TimerUtils ,system
  3. struct fly
  4.     timer t
  5.     real x
  6.     real y
  7.     real dist
  8.     real dheig
  9.     real OriginHeight
  10.     real x1
  11.     real y1
  12.     real ang
  13.     real heightMax
  14.     real height
  15.     real hurt
  16.     integer steepsMax
  17.     integer steeps
  18.     integer lvJumpTimer
  19.     unit u
  20.     unit u2
  21.     string strings
  22.     effect eff
  23.     boolean stops
  24.     boolean kill
  25.     boolean gone
  26.    
  27. static method JumpLoop takes nothing returns nothing
  28.            local thistype d = thistype(GetTimerData(GetExpiredTimer()))
  29.            local location l
  30.            local real z
  31.            set d.x1=d.x+d.steeps*d.dist*Cos(d.ang*3.14159/180.0)
  32.            
  33.            set d.y1=d.y+d.steeps*d.dist*Sin(d.ang*3.14159/180.0)
  34.            
  35.            set d.x1=YDWECoordinateX(d.x1)
  36.            
  37.            set d.y1=YDWECoordinateY(d.y1)
  38.            
  39.            set d.steeps=d.steeps+1
  40.            
  41.            call SetUnitX(d.u,d.x1)
  42.            
  43.            call SetUnitY(d.u,d.y1)
  44.            call UnitAddAbility( d.u, 'Amrf' )
  45.            
  46.            call UnitRemoveAbility(d.u,'Amrf')
  47.            
  48.            set l = Location(d.x1,d.y1)
  49.            
  50.            set z = GetLocationZ(l)
  51.            
  52.            set d.height=((-(2*I2R(d.steeps)*d.dheig-1)*(2*I2R(d.steeps)*d.dheig-1)+1)*d.heightMax+d.OriginHeight)   +  z  
  53.            
  54.            call RemoveLocation(l)
  55.            call SetUnitFlyHeight(d.u,d.height,99999)   
  56.            
  57.            call SetUnitFacing(d.u,d.ang)
  58.            if d.steeps == d.steepsMax  then
  59.            call PauseTimer(d.t)
  60.            
  61.            if d.stops == true then
  62.            call PauseUnit( d.u, false )
  63.            
  64.            call IssueImmediateOrder( d.u, "stop" )
  65.            endif
  66.            if d.hurt >= 0. then
  67.            call fun(d.u2,GetUnitX(d.u),GetUnitY(d.u),350.,d.hurt,d.strings,false,0)
  68.            endif
  69.            if d.kill == true then
  70.            call RemoveUnit(d.u)
  71.            endif
  72.            call SetUnitFlyHeight(d.u,GetUnitDefaultFlyHeight(d.u),700)
  73.            call d.destroy()
  74.            set d.u = null
  75.            set d.u2=null
  76.            set d.eff = null
  77.   
  78.            endif
  79.            set l = null
  80. endmethod
  81. static method Jump takes unit un,real a,real d,real l,real t,real h,boolean stop,real hurt,unit u2,boolean kill ,string strings,boolean gone  returns thistype
  82.     local thistype q = thistype.allocate()
  83.     set q.steepsMax=R2I(l/t)
  84.     set q.steeps=0
  85.     set q.u = un
  86.     set q.u2=u2
  87.     set q.gone = gone
  88.     set q.hurt = hurt
  89.     set q.strings = strings
  90.     set q.ang = a
  91.     set q.kill = kill
  92.     set q.t=NewTimer()
  93.     set q.x=GetUnitX(q.u)  
  94.     set q.y=GetUnitY(q.u)
  95.     set q.dist=d/q.steepsMax  
  96.     set q.dheig=1.0/q.steepsMax  
  97.     set q.heightMax = h
  98.     set q.OriginHeight=GetUnitFlyHeight(q.u)
  99.     call SetTimerData(q.t, integer(q))
  100.     if stop == true then
  101.     set q.stops = stop
  102.         call PauseUnit( q.u, true )
  103.     endif
  104.     call TimerStart(q.t,t,true,function fly.JumpLoop)
  105.     return q
  106. endmethod
  107.         
  108.         method onDestroy takes nothing returns nothing
  109.            set .u = null
  110.            set .u2 = null
  111.            set .eff = null
  112.            call ReleaseTimer(.t)
  113.         endmethod
  114. endstruct
  115. endlibrary
复制代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-20 18:35:54 | 显示全部楼层

  1. //============================冲锋==================================

  2. library MoveUnit requires system

  3. globals
  4. private constant timer displacement_timer=CreateTimer()
  5. private constant real displacement_time=0.05
  6. private integer displacement_index=0
  7. private integer array displacement_array
  8. endglobals

  9. struct moving
  10. unit units
  11. real ang
  12. real x
  13. real y
  14. real x1
  15. real y1
  16. real max=0.
  17. real index
  18. real dis
  19. integer AnimationByIndex
  20. boolean kills
  21. static moving data

  22. static method Loop takes nothing returns nothing
  23. local integer i=0
  24. local real Former
  25. local real Latter
  26. local boolean NotifyX
  27. local boolean NotifyY
  28. loop
  29. exitwhen       i==displacement_index
  30. set data=displacement_array[i]
  31. if             data.max>=data.dis then
  32. if data.kills == true then
  33. call RemoveUnit(data.units)
  34. endif
  35. call SetUnitAnimation( data.units, "stand" )
  36. set data.units = null
  37. set displacement_index=displacement_index-1
  38. set displacement_array[i]=displacement_array[displacement_index]
  39. set i=i-1
  40. call data.destroy()
  41. else
  42. if data.AnimationByIndex != 0 then
  43. call SetUnitAnimationByIndex( data.units, data.AnimationByIndex )
  44. endif
  45. set data.max=data.max+26
  46. call IssueImmediateOrder(data.units,"stop")
  47. set Former=GetUnitX(data.units)+26.*Cos(data.ang*bj_DEGTORAD)
  48. set Latter=GetUnitY(data.units)+26.*Sin(data.ang*bj_DEGTORAD)
  49. set data.x=GetUnitX(data.units)
  50. set data.y=GetUnitY(data.units)
  51. call SetUnitPosition(data.units,Former,Latter)
  52. if  (RAbsBJ(GetUnitX(data.units)-Former)>.5)or(RAbsBJ(GetUnitY(data.units)-Latter)>.5)then
  53. set NotifyX=RAbsBJ(GetUnitX(data.units)-Former)<=.5
  54. set NotifyY=RAbsBJ(GetUnitY(data.units)-Latter)<=.5
  55. if             NotifyX then
  56. call SetUnitPosition(data.units,Former,data.y)
  57. elseif NotifyY then
  58. call SetUnitPosition(data.units,data.x,Latter)
  59. else
  60. call SetUnitPosition(data.units,data.x,Latter)
  61. endif
  62. endif
  63. endif
  64. set i=i+1
  65. endloop
  66. if             displacement_index==0 then
  67. call PauseTimer(displacement_timer)
  68. endif
  69. endmethod
  70. endstruct

  71. function TimerCreate takes unit units,real ang,real dis,integer i,boolean kills returns nothing
  72. local moving dat
  73. set dat=moving.create()
  74. set dat.units=units
  75. set dat.ang=ang
  76. set dat.kills = kills
  77. set dat.dis=dis
  78. set dat.AnimationByIndex = i
  79. set displacement_array[displacement_index]=dat
  80. set displacement_index=displacement_index+1
  81. if             displacement_index==1 then
  82. call TimerStart(displacement_timer,displacement_time,true,function moving.Loop)
  83. endif
  84. endfunction
  85. endlibrary
复制代码

最后来个冲锋函数 终结此贴
回复 支持 反对

使用道具 举报

发表于 2014-12-20 18:39:44 | 显示全部楼层
能赶在被广告机淹没之前看到真是幸运啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-20 18:42:47 | 显示全部楼层
@o0木子0o 这种东西发在飞飞世界论坛没什麽人看 还是发到这里来吧
召唤最萌小汐 也许她能看到吧
回复 支持 反对

使用道具 举报

发表于 2014-12-21 06:16:51 | 显示全部楼层
RoyalFlare 发表于 2014-12-20 18:54
我估计下面会出现各种这TM是什麽玩意 1点都看不懂;
看不明白啊 求科普; J盲路过之类的评论
呵呵

看不明白啊 求科普,J盲路过~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-21 16:21:59 | 显示全部楼层
chyj4747 发表于 2014-12-21 06:16
看不明白啊 求科普,J盲路过~


你别逗了行不? chyj4747
关于自己编写WE的UI 你是否有做过研究或尝试? 我想把这些通用函数封装到1个mpq文件里 然后在WE中调用
需要lua脚本(其实你是想模仿YDWE啊鲁)

回复 支持 反对

使用道具 举报

发表于 2014-12-21 16:58:34 | 显示全部楼层
ui毕竟是新手玩的 没有任何通用性 等玩腻了自然还是要自己找原理 如此还不如indexer系统通用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-21 17:37:49 | 显示全部楼层
ck5524210 发表于 2014-12-21 16:58
ui毕竟是新手玩的 没有任何通用性 等玩腻了自然还是要自己找原理 如此还不如indexer系统通用

每次创建1张新地图你都要在自定义代码去写1堆预定义函数?
还是几个vJass的library 解决
现在的效率就是时间啊 写个Boss战设计英雄技能的时候调用1个弹幕函数和单位组选取敌对单位的函数(1个Filter) 然后在T里面直接call 1下就好了 你说简不简单?!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-21 17:39:30 | 显示全部楼层
本帖最后由 RoyalFlare 于 2014-12-21 17:57 编辑

QQ截图20141219163738.jpg

QQ截图20140605020023.jpg

QQ截图20141219163057.jpg

QQ截图20141219163244.jpg

QQ图片20141215140417.jpg ck来做1个反魂蝶练练手吧 试试
这些函数还没研究 有时间去做1下这些技能 其实说穿了就是堆特效 XY坐标轴马甲移动 选取1下范围单位组造成伤害.

回复 支持 反对

使用道具 举报

发表于 2014-12-21 18:12:28 | 显示全部楼层
呵呵  你觉得方便你自己做就是了 喊我干嘛
回复 支持 反对

使用道具 举报

发表于 2014-12-24 11:31:39 | 显示全部楼层
我弄的蛋目函数只是玩玩,不用在意
回复 支持 反对

使用道具 举报

发表于 2015-5-17 23:24:53 | 显示全部楼层
很不错支持下
回复 支持 反对

使用道具 举报

发表于 2015-6-1 12:50:45 | 显示全部楼层
RoyalFlare 发表于 2014-12-21 17:39
ck来做1个反魂蝶练练手吧 试试
这些函数还没研究 有时间去做1下这些技能 其实说穿了就是 ...

这图是你的吗,能不能玩,我想玩下,还有你写的太长了,能不能放在地图上给出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-1 19:12:11 | 显示全部楼层
yeeboys 发表于 2015-6-1 12:50
这图是你的吗,能不能玩,我想玩下,还有你写的太长了,能不能放在地图上给出

地图名字是梦境神域 U9论坛上可以搜索到下载
动漫对抗地图 不是我的作品.
回复 支持 反对

使用道具 举报

发表于 2019-3-8 06:11:17 | 显示全部楼层
厉害厉害1支持下。
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2019-7-18 02:56 , Processed in 0.089166 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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