|
被这个问题困扰了一晚上
利用return bug+cache+timer做了一个模拟冲击波的函数
可是在读取缓存时,所有的real变量值都为0了= =||
(缓存已在游戏开始时设置好了)
以下是代码
[jass]
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 i2g takes integer i returns group
return i
return null
endfunction
function i2t takes integer i returns timer
return i
return null
endfunction
function bullet_Cond takes nothing returns boolean
local timer t = i2t(GetStoredInteger(udg_GC,I2S(h2i(GetTriggeringTrigger())),"timer"))
local unit u = i2u(GetStoredInteger(udg_GC,I2S(h2i(t)),"unit"))
call BJDebugMsg(I2S(h2i(t)))
return (IsUnitEnemy(u,GetOwningPlayer(GetFilterUnit()))==true)and(IsUnitType(GetFilterUnit(),UNIT_TYPE_GIANT)==false)and(IsUnitAliveBJ(GetFilterUnit())==true)
endfunction
function bullet_Ac takes nothing returns nothing
local timer t = i2t(GetStoredInteger(udg_GC,I2S(h2i(GetTriggeringTrigger())),"timer"))
local real Damage = GetStoredReal(udg_GC,I2S(h2i(t)),"Damage")
local unit u = i2u(GetStoredInteger(udg_GC,I2S(h2i(t)),"unit"))
call BJDebugMsg(I2S(h2i(t)))
call UnitDamageTargetBJ(u,GetEnumUnit(),Damage,ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL)
endfunction
function bullet_Act takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = i2u(GetStoredInteger(udg_GC,I2S(h2i(t)),"unit"))
local real angle = GetStoredReal(udg_GC,I2S(h2i(t)),"angle")
local real Range = GetStoredReal(udg_GC,I2S(h2i(t)),"Range")
local real Time = GetStoredReal(udg_GC,I2S(h2i(t)),"Time")
local real Width = GetStoredReal(udg_GC,I2S(h2i(t)),"Width")
local real Damage = GetStoredReal(udg_GC,I2S(h2i(t)),"Damage")
local real x = GetStoredReal(udg_GC,I2S(h2i(t)),"x")
local real y = GetStoredReal(udg_GC,I2S(h2i(t)),"y")
local real Data = GetStoredReal(udg_GC,I2S(h2i(t)),"Data")
local location l
local group g
call BJDebugMsg("0.02funcX: "+R2S(x))
call BJDebugMsg("0.02funcY: "+R2S(y))
if Data<(Time/0.02) then
set Data = Data + 1
call StoreReal(udg_GC,I2S(h2i(t)),"Data",Data)
call BJDebugMsg("0.02funcEndCond: "+R2S(Data))
call StoreInteger(udg_GC,I2S(h2i(t)),"g",h2i(g))
set l = Location((x+((Data-1)*(Range*((CosBJ(angle)*0.02)/Time)))),(y+((Data-1)*(Range*((SinBJ(angle)*0.02)/Time)))))
set g = GetUnitsInRangeOfLocMatching(Width,l,Condition(function bullet_Cond))
if (IsUnitGroupEmptyBJ(g)==true) then
call SetUnitX(u,(x+(Data*(Range*((CosBJ(angle)*0.02)/Time)))))
call SetUnitY(u,(x+(Data*(Range*((SinBJ(angle)*0.02)/Time)))))
else
call KillUnit(u)
call ForGroupBJ(g,function bullet_Ac)
call DestroyTimer(t)
call FlushStoredMission(udg_GC,I2S(h2i(t)))
endif
else
call BJDebugMsg("0.02func End!!")
call KillUnit(u)
call DestroyTimer(t)
call FlushStoredMission(udg_GC,I2S(h2i(t)))
endif
call RemoveLocation(l)
call DestroyGroup(g)
set t = null
set u = null
set l = null
set g = null
endfunction
function bullet takes integer i,real Range,real Time,real Width,real Damage returns nothing
local timer t = CreateTimer()
local unit u1 = GetTriggerUnit()
local location l = GetUnitLoc(u1)
local real angle = GetUnitFacing(u1)
local unit u2 = CreateUnitAtLoc(GetOwningPlayer(u1),i,l,angle)
local real x = GetUnitX(u2)
local real y = GetUnitY(u2)
local real Data = 1.00
call StoreInteger(udg_GC,I2S(h2i(GetTriggeringTrigger())),"timer",h2i(t))
call StoreInteger(udg_GC,I2S(h2i(t)),"unit",h2i(u2))
call StoreReal(udg_GC,I2S(h2i(t)),"angle",angle)
call StoreReal(udg_GC,I2S(h2i(t)),"Range",Range)
call StoreReal(udg_GC,I2S(h2i(t)),"Width",Width)
call StoreReal(udg_GC,I2S(h2i(t)),"Time",Time)
call StoreReal(udg_GC,I2S(h2i(t)),"Damage",Damage)
call StoreReal(udg_GC,I2S(h2i(t)),"x",x)
call StoreReal(udg_GC,I2S(h2i(t)),"y",y)
call StoreReal(udg_GC,I2S(h2i(t)),"Data",Data)
call TimerStart(t,0.02,true,function bullet_Act)
call BJDebugMsg("infoX: "+R2S(x))
call BJDebugMsg("infoY: "+R2S(y))
call RemoveLocation(l)
set l = null
set u1 = null
set u2 = null
set t = null
endfunction
[/jass]
以下是调用:
[trigger]
Skill2 复制
事件
单位 - 任意单位 开始施放技能
条件
(施放技能) 等于 雷霆一击
动作
自定义代码: call bullet('e000',1000.00,2.00,100.00,100.00)
[/trigger]
// bullet(马甲ID,移动总距离,移动时间,伤害范围,伤害值)
最开始测试时是发现马甲不移动,随后一层一层debug找到了原因,在bullet_Act中根本就取不到缓存= =
这是为什么呢?
因为要作为技能模板,所以用以下的T改来的,这个T是有效的:
全局变量:
DM 单位,创建的马甲单位
DM_G 单位组,为了不让同一目标多次受伤害而存在
Damage 实数,用于记录伤害
Data 实数,用于判断移动次数,并参与移动的计算
FangXiang 实数,马甲角度
KuanDu 实数,选取单位组的范围,充当冲击波的宽度
Range 实数,马甲移动的距离
Target_Loc_X / Target_Loc_Y 实数,马甲的XY坐标
Time 实数,马甲的移动总时间
GC 游戏缓存
[trigger]
Skill2
事件
单位 - 任意单位 开始施放技能
条件
(施放技能) 等于 雷霆一击
动作
设置 Data = 0.00
设置 DM = (新建 ((触发单位) 的所有者) 的 弹幕 在 ((触发单位) 的位置) 面向角度:((触发单位) 的面向角度) 度)
设置 FangXiang = ((触发单位) 的面向角度)
设置 Target_Loc_X = (DM 所在X轴坐标)
设置 Target_Loc_Y = (DM 所在Y轴坐标)
-------- 最大射程 --------
设置 Range = 1500.00
-------- 飞行时间 --------
设置 Time = 1.00
-------- 宽度 --------
设置 KuanDu = 40.00
-------- 伤害值 --------
设置 Damage = 50.00
触发器 - 开启 Move YunSu <预设>
[/trigger]
[trigger]
Move YunSu
事件
时间 - 每 0.02 秒触发事件
条件
动作
设置 Data = (Data + 1.00)
设置 DM_G = (半径为 KuanDu 圆心为 (坐标((Target_Loc_X + ((Data - 1.00) x (Range x (((Cos(FangXiang)) x 0.02) / Time)))), (Target_Loc_Y + ((Data - 1.00) x (Range x (((Sin(FangXiang)) x 0.02) / Time)))))) 且满足 ((((匹配单位) 是存活的) 等于 TRUE) and ((((匹配单位) 是 泰坦族 [R]) 等于 FALSE) and ((DM 是 ((匹配单位) 的所有者) 的敌对单位) 等于 TRUE)
如果所有条件成立则做动作1,否则做动作2
If - 条件
(DM_G 为空) 等于 TRUE
Then - 动作
单位 - 设置 DM 的X坐标为 (Target_Loc_X + (Data x (Range x (((Cos(FangXiang)) x 0.02) / Time))))
单位 - 设置 DM 的Y坐标为 (Target_Loc_Y + (Data x (Range x (((Sin(FangXiang)) x 0.02) / Time))))
Else - 动作
单位 - 杀死 DM
单位组 - 选取 DM_G 内所有单位做动作
Loop - 动作
单位 - 命令 DM 对 (选取单位) 造成 Damage 点伤害,攻击类型: 法术 伤害类型: 普通
触发器 - 关闭 (当前触发)
如果所有条件成立则做动作1,否则做动作2
If - 条件
Data 大于或等于 (Time / 0.02)
Then - 动作
触发器 - 关闭 (当前触发)
单位 - 杀死 DM
Else - 动作
[/trigger] |
|