找回密码
 点一下
查看: 1914|回复: 8

[已解决]缓存取不了值了= =

[复制链接]
发表于 2009-2-22 05:43:37 | 显示全部楼层 |阅读模式
被这个问题困扰了一晚上
利用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]
发表于 2009-2-22 10:13:35 | 显示全部楼层
LZ的自定义单位或者是缓存初始化的问题吧 我试了一下 虽然什么效果也看不到
但是X,Y值都不是0
回复

使用道具 举报

 楼主| 发表于 2009-2-22 10:20:51 | 显示全部楼层
...........................

郁闷,偶是大笨蛋,找了一晚上错.............
[trigger]
未命名触发器 001
    事件
        时间 - 游戏开始 0.01 秒
    条件
    动作
        可见度 - 禁用 战争迷雾
        可见度 - 禁用 黑色阴影
        游戏缓存 - 创建游戏缓存,使用文件名: GC.w3v
        设置 GC = (最后创建的游戏缓存)
[/trigger]
其中 游戏缓存 - 创建游戏缓存,使用文件名: GC.w3v 是忘记写了的....................................
回复

使用道具 举报

发表于 2009-2-22 10:25:40 | 显示全部楼层
LZ的Act中g没有CreateGroup()
回复

使用道具 举报

发表于 2009-2-22 10:28:21 | 显示全部楼层
还有LZ的一个小习惯。。
既然有x,y,为什么还要location呢?u1和u2在主函数运行时候的位置相同,I2S(h2i(t))这个string 多次试用,为什么不local一个string来储存呢?这个会省很多函数调用的资源 每一步都两个函数调用 太。 。。

只是一个建议 个人口直,LZ要是不喜欢请别见怪
回复

使用道具 举报

 楼主| 发表于 2009-2-22 11:00:11 | 显示全部楼层
...是说怎么debug单位组没反应,谢谢你
回复

使用道具 举报

发表于 2009-2-22 11:32:40 | 显示全部楼层
  1. function h2i takes handle h returns integer
  2. return h
  3. return 0
  4. endfunction
  5. function i2u takes integer i returns unit
  6. return i
  7. return null
  8. endfunction
  9. function bullet_Cond takes nothing returns boolean
  10. local unit u = i2u(GetStoredInteger(udg_GC,I2S(h2i(GetExpiredTimer())),"unit"))
  11. return (IsUnitEnemy(u,GetOwningPlayer(GetFilterUnit())))and(not IsUnitType(GetFilterUnit(),UNIT_TYPE_GIANT))and(GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0)
  12. endfunction
  13. function bullet_Act takes nothing returns nothing
  14. local timer t = GetExpiredTimer()
  15. local string s = I2S(h2i(t))
  16. local unit u = i2u(GetStoredInteger(udg_GC,s,"unit"))
  17. local real angle = GetStoredReal(udg_GC,s,"angle")
  18. local real Range = GetStoredReal(udg_GC,s,"Range")
  19. local real Time = GetStoredReal(udg_GC,s,"Time")
  20. local real Width = GetStoredReal(udg_GC,s,"Width")
  21. local real Damage = GetStoredReal(udg_GC,s,"Damage")
  22. local real x = GetStoredReal(udg_GC,s,"x")
  23. local real y = GetStoredReal(udg_GC,s,"y")
  24. local real Data = GetStoredReal(udg_GC,s,"Data")
  25. local group g = CreateGroup()
  26. local unit up = null
  27. //call BJDebugMsg("0.02funcX: "+R2S(x))
  28. //call BJDebugMsg("0.02funcY: "+R2S(y))
  29. if Data<Time then
  30.     set Data = Data + 0.02
  31.     call StoreReal(udg_GC,s,"Data",Data)
  32.     //call BJDebugMsg("0.02funcEndCond: "+R2S(Data))
  33.     set x = x+Range*Cos(angle)*Data/Time
  34.     set y = y+Range*Sin(angle)*Data/Time
  35.     call GroupEnumUnitsInRange(g,x,y,50,Condition(function bullet_Cond))
  36.     if (FirstOfGroup(g)==null) then
  37.         call SetUnitX(u,x)
  38.         call SetUnitY(u,y)
  39.     else
  40.         call KillUnit(u)
  41.         call GroupEnumUnitsInRange(g,x,y,Width,Condition(function bullet_Cond))
  42.         loop
  43.             set up = FirstOfGroup(g)
  44.             exitwhen up == null
  45.             call UnitDamageTarget(u,up,Damage,true,false,ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
  46.             call GroupRemoveUnit(g,up)
  47.         endloop
  48.         call DestroyTimer(t)
  49.         call FlushStoredMission(udg_GC,s)
  50.     endif
  51. else
  52.     //call BJDebugMsg("0.02func End!!")
  53.     call KillUnit(u)
  54.     call DestroyTimer(t)
  55.     call FlushStoredMission(udg_GC,s)
  56. endif
  57. call DestroyGroup(g)
  58. set t = null
  59. set u = null
  60. set g = null
  61. endfunction
  62. function bullet takes integer i,real Range,real Time,real Width,real Damage returns nothing
  63. local timer t = CreateTimer()
  64. local unit u1 = GetTriggerUnit()
  65. local real x = GetUnitX(u1)
  66. local real y = GetUnitY(u1)
  67. local real angle = GetUnitFacing(u1)
  68. local unit u2 = CreateUnit(GetOwningPlayer(u1),i,x,y,angle)
  69. local real Data = 0.02
  70. local string s = I2S(h2i(t))
  71. call StoreInteger(udg_GC,s,"unit",h2i(u2))
  72. call StoreReal(udg_GC,s,"angle",Deg2Rad(angle))
  73. call StoreReal(udg_GC,s,"Range",Range)
  74. call StoreReal(udg_GC,s,"Width",Width)
  75. call StoreReal(udg_GC,s,"Time",Time)
  76. call StoreReal(udg_GC,s,"Damage",Damage)
  77. call StoreReal(udg_GC,s,"x",x)
  78. call StoreReal(udg_GC,s,"y",y)
  79. call StoreReal(udg_GC,s,"Data",Data)
  80. call TimerStart(t,0.02,true,function bullet_Act)
  81. //call BJDebugMsg("infoX: "+R2S(x))
  82. //call BJDebugMsg("infoY: "+R2S(y))
  83. set u1 = null
  84. set u2 = null
  85. set t = null
  86. endfunction
复制代码


改了一下LZ的函数
回复

使用道具 举报

发表于 2009-2-22 11:33:59 | 显示全部楼层
lss不是说了吗,Act里没有CreateGroup(),后面关于group的语句当然没反应
回复

使用道具 举报

 楼主| 发表于 2009-2-23 02:41:12 | 显示全部楼层
原来在条件函数里也能使用GetExpiredTimer()来获得当前的计时器啊......
一直以为只有被TimerStart召唤的函数里才能用GetExpiredTimer()
绕了不少弯子,结果还是没成功......
谢谢6L....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

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

GMT+8, 2024-11-21 23:37 , Processed in 0.065254 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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