|
不知道有没有人写过,今天正好要用就写了个
[jass]
globals
boolexpr udg_B
endglobals
function H2I takes handle h returns integer
return h
return 0
endfunction
function RectCon takes nothing returns boolean
return GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0
endfunction
function RectAct takes real length,real width,real a,real x,real y,boolean IsPlayerUnit,boolean IsAlly,integer i returns group
local real Sina=Sin(a)
local real Cosa=Cos(a)
local real x1=x+width*Sina/2
local real y1=y-width*Cosa/2
local real x2=x-width*Sina/2
local real y2=y+width*Cosa/2
local real x3=x2+length*Cosa
local real y3=y2+length*Sina
local real x4=x1+length*Cosa
local real y4=y1+length*Sina
local group g=CreateGroup()
local group gg=CreateGroup()
local integer ig=H2I(gg)
local unit u=null
call GroupEnumUnitsInRange(g,x+length*Cosa/2,y+length*Sina/2,SquareRoot(length*length+width*width)/2,udg_B)
if IsPlayerUnit then
loop
set u=FirstOfGroup(g)
call GroupRemoveUnit(g,u)
set x=GetUnitX(u)
set y=GetUnitY(u)
if GetPlayerId(GetOwningPlayer(u))==i then
if (x1-x)*Sina-(y1-y)*Cosa>=0 and (x2-x)*Cosa+(y2-y)*Sina<=0 and (x3-x)*Sina-(y3-y)*Cosa<=0 and (x4-x)*Cosa+(y4-y)*Sina>=0 then
call GroupAddUnit(gg,u)
endif
endif
exitwhen u==null
endloop
else
loop
set u=FirstOfGroup(g)
call GroupRemoveUnit(g,u)
set x=GetUnitX(u)
set y=GetUnitY(u)
if (IsUnitAlly(u,Player(i)) and IsAlly)or(IsUnitEnemy(u,Player(i))and not IsAlly) then
if (x1-x)*Sina-(y1-y)*Cosa>=0 and (x2-x)*Cosa+(y2-y)*Sina<=0 and (x3-x)*Sina-(y3-y)*Cosa<=0 and (x4-x)*Cosa+(y4-y)*Sina>=0 then
call GroupAddUnit(gg,u)
endif
endif
exitwhen u==null
endloop
endif
set u=null
call DestroyGroup(g)
set g=null
set gg=null
return ig
return null
endfunction
funcion Init takes nothing returns nothing
set udg_B=Condition(functino RectCon)
endfunction
[/jass]
用向量的方法判断的,四个交点作为参考,在直线的同一侧或直线上,点乘>=0,去掉了一些不影响正负的参数 (x1-x)*Sina-(y1-y)*Cosa>=0 and (x2-x)*Cosa+(y2-y)*Sina<=0 and (x3-x)*Sina-(y3-y)*Cosa<=0 and (x4-x)*Cosa+(y4-y)*Sina>=0
调用方式:
call RectAct(长度,宽度,角度,位置x,位置y,是否选择玩家单位,选择盟友,整数)
选取以(x,y)一边中点,位于角度方向的矩形区域内单位 “是否选择玩家”为true,则选择玩家索引为“整数”的玩家的单位
若为false,则当“选择盟友”为true,则选择玩家索引为“整数”的玩家的友军单位,若为false,则选择敌军单位
顺便附上一个用这个做的技能:崩拳 没找到合适的模型和动作,不太好看
对面前的单位造成多次伤害,并且将其推到前方,最多造成10次伤害。每次造成(英雄力量)点伤害
多发了点 ,这个不需要H2I,I2G |
评分
-
查看全部评分
|