找回密码
 点一下
查看: 4643|回复: 38

求助 技能可以运行不过没有结果==希望高手帮帮我====

[复制链接]
发表于 2008-1-17 17:12:07 | 显示全部楼层 |阅读模式
我自己在学习Jass 于是就用Jass写了一个技能。 希望实在一条斜线上产生一连串的Noval

其中Jass代码如下:
function H2I takes handle h returns integer
      return h
      return 0
endfunction
function Trig_Noval_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction

function Actions takes nothing returns nothing
    local timer tm=GetExpiredTimer()
    local integer N=GetStoredInteger(udg_GC, I2S(H2I(tm)), "Number")
    if N>0 then
        call AddSpecialEffect("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl",udg_x,udg_y)
        set udg_x=udg_x+30
        set udg_y=udg_y+30
        call StoreInteger(udg_GC,I2S(H2I(tm)), "Number",N)
    else
        call FlushStoredMission(udg_GC,I2S(H2I(tm)))
        call DestroyTimer(tm)  
    endif         
    set tm=null
endfunction
   
function Trig_Noval_Actions takes nothing returns nothing
    local timer tm=CreateTimer()
    set udg_x=GetLocationX(GetSpellTargetLoc())
    set udg_y=GetLocationY(GetSpellTargetLoc())
    call StoreInteger(udg_GC,I2S(H2I(tm)), "Number", 10)
    call TimerStart(tm,1,true,function Actions)
    set tm=null
endfunction
//===========================================================================
function InitTrig_Noval takes nothing returns nothing
    local trigger trg = CreateTrigger(  )  
    call TriggerRegisterUnitEvent( trg, gg_unit_Hpal_0000, EVENT_UNIT_SPELL_CAST )
    call TriggerAddCondition( trg , Condition( function Trig_Noval_Conditions ) )
    call TriggerAddAction(trg,function Trig_Noval_Actions  )
    set trg = null
    endif
endfunction

我在WE里面可以运行,We检查为没有语法错误。可是我在运行里面,什么效果都没有看到。请问是怎么回事啊。希望大家能帮助帮助我 谢谢了

ps:codes没有设置高亮,因为我预览的时候都是红色的 没有显示出来 不知道怎么回事。
发表于 2008-1-17 18:19:57 | 显示全部楼层
问下下,udg_GC初始化过吗??如果没有的话N读出来肯定是0咯
还有,在Actions里没有对N做任何处理就又写入,如果没有以上问题,执行的话会不会出现死循环呢??

你可以在测试时尝试用DisplayTextToPlay把N打出来,看看是什么结果哦~~
回复

使用道具 举报

发表于 2008-1-17 21:43:11 | 显示全部楼层
显然是没有初始化。
回复

使用道具 举报

 楼主| 发表于 2008-1-19 14:45:55 | 显示全部楼层
非常感谢大家对我的帮助。问题已经解决了。 出现问题的部分就是没有初始化缓存。需要建一个触发器-地图初始化-创建游戏缓存-CG=最后的游戏缓存。

非常感谢。

至于那个N 是复制的时候出现的问题~呵呵。那个我之前想用全局变量来实现关闭Timer来的。不过一编译就死机,不知道为什么。。。
回复

使用道具 举报

 楼主| 发表于 2008-1-19 14:49:33 | 显示全部楼层
还有一个问题, 如上面楼顶代码(已经改好了,可以用的。)就是在一条斜线上创造了Noval特效,可是关于伤害的计算,怎么写呢。希望大家帮帮我 谢谢了
回复

使用道具 举报

发表于 2008-1-19 14:59:29 | 显示全部楼层
UnitDamagePoint,嗯~~这样会对以(x,y)为圆心,radius为半径范围内的所有单位造成伤害

或者用单位组选择目标用UnitDamageTarget造成伤害
回复

使用道具 举报

 楼主| 发表于 2008-1-19 15:32:24 | 显示全部楼层
谢谢啦 我试试看。
回复

使用道具 举报

 楼主| 发表于 2008-1-19 16:06:27 | 显示全部楼层
还是有些问题要麻烦一下

怎么才能用用单位组选择到目标单位呢。 技能是类似与Dota里面水人的Waveform 当他冲过去后,冲击的那条线上都受到了伤害。他是怎么选择到他周围的单位呢。能否把其中用到的API告诉我一下,我刚开始学Jass 其中好多API还不知道。麻烦了。

另外,我在看其他人做的一些技能之中,都是设置了一个生命周期为几秒的水元素类型的单位,然后命令他以不死族复仇蜂群的方式移动到那里。没看见有什么伤害判定的触发,不过的确造成了伤害。我在物品编辑器里面,看到了那个水元素单位拥有的技能。 其中该技能的 数据-伤害里面填的是125 数据-最大伤害 里面填的是99999

我想问一下 这些是和造成技能的伤害有关么? 其中 数据-伤害 和数据-最大伤害 有什么用处。
那个几秒的水元素类型的单位的意思是让其移动到指定地点后自己就死亡,复仇蜂群的移动方式是为了让其移动的时候有一个尾巴。用这两样,从而产生了特效。 那两个用处我这样理解对么?

表述的有点乱,不好意思了啊。。。
回复

使用道具 举报

发表于 2008-1-19 17:41:33 | 显示全部楼层
引用第7楼zealotwang于2008-01-19 16:06发表的  :
还是有些问题要麻烦一下

怎么才能用用单位组选择到目标单位呢。 技能是类似与Dota里面水人的Waveform 当他冲过去后,冲击的那条线上都受到了伤害。他是怎么选择到他周围的单位呢。能否把其中用到的API告诉我一下,我刚开始学Jass 其中好多API还不知道。麻烦了。

另外,我在看其他人做的一些技能之中,都是设置了一个生命周期为几秒的水元素类型的单位,然后命令他以不死族复仇蜂群的方式移动到那里。没看见有什么伤害判定的触发,不过的确造成了伤害。我在物品编辑器里面,看到了那个水元素单位拥有的技能。 其中该技能的 数据-伤害里面填的是125 数据-最大伤害 里面填的是99999
.......
我不懂Jass
不过看你这段话 好象不是很难理解
给单位设置生命周期的确是为了让这个单位在完成它要做的事情之后自己去死,不过我还是喜欢用删除,貌似那样更顺畅一些
至于你说什么复仇蜂群我不太明白 是那个被设置生命周期的单位拥有这技能吗?
是的话大概作者是利用这技能创造特效或者直接用这技能伤害
[最大伤害]和[伤害]这两个数据一般是在范围技能里才出现
我是这么理解的
最大伤害是这技能在一次释放后对范围内所有单位能够造成的伤害的总和的最大值
伤害就是这个技能在一次释放后对范围内的每一个单位能够造成的一次性伤害……

以上.....
回复

使用道具 举报

发表于 2008-1-19 18:46:39 | 显示全部楼层
我记得以前看到过某位大人做得判断单位在矩形区域(倾斜)的j代码的,现在寻找中
回复

使用道具 举报

 楼主| 发表于 2008-1-19 19:24:34 | 显示全部楼层
可是那个区域怎么创建的呢? 是在施放技能的时候创建,可是我看关于区域的J 只有进入区域和离开区域两种。没有判断是否有Unit在区域内的Api呀。。。。。

要努力找哦~靠你了  谢谢 谢谢啦 呵呵。

还有就是 使用非J的话,那些技能都是怎么创建的啊。。我试了一下,创建一个小精灵,发布让其以牛头人酋长的冲击波方式移动到某点,可是他都没动喔,可是我看别人做的地图里面,就是使用那个命令啊。

我特别想知道以XXX-XXXX的方式移动(大部分技能都是以复仇蜂群或者是冲击波)到底是什么意思?怎么就能一移动就造成伤害了呢?谁知道告诉我一下吧 谢谢了。。
回复

使用道具 举报

发表于 2008-1-19 19:32:23 | 显示全部楼层
http://www.ourga.com/bbs/read.php?tid=9216
可以看看那个图中的DrawCube函数

貌似参数中x,y是单位的坐标x,y值,a是宽度,b是距离,ang是角度

如有错误请eff大人指出~~
回复

使用道具 举报

 楼主| 发表于 2008-1-19 20:34:49 | 显示全部楼层
我看一下 有些地方看不懂。。

[codes=jass]function VoidFugg_trg_ShockWavenc takes nothing returns boolean
   if(IsUnitInRangeXY(GetFilterUnit(),SYS_TempReal[3323],SYS_TempReal[3324],SYS_TempReal[3325]) and not(IsUnitInGroup(GetFilterUnit(),SYS_TempGroup)))then
      call GroupAddUnit(SYS_TempGroup,GetFilterUnit())
      call AddEffectTargetUnitTimed(GetFilterUnit(),"Abilities\\\\Spells\\\\Other\\\\TalkToMe\\\\TalkToMe.mdl","overhead",2.00)
      return true
   endif
   return false
endfunction

function DrawCube takes real x,real y,real a,real b,real ang returns nothing
   local real tx
   local real ty
   local real r = a/2.00
   local real l = 100.00
   local group gp = CreateGroup()
   local group gpTemp = CreateGroup()
   local boolexpr cond = Condition(function VoidFunc)
   set SYS_TempGroup = gp
   loop
      exitwhen(l>b)
      set tx = x + CosBJ(ang)*l
      set ty = y + SinBJ(ang)*l
      set SYS_TempReal[3323] = tx
      set SYS_TempReal[3324] = ty
      set SYS_TempReal[3325] = r
      call GroupEnumUnitsInRange(gpTemp,tx,ty,r+200.00,cond)
      set SYS_TempReal[3323] = 0.00
      set SYS_TempReal[3324] = 0.00
      set SYS_TempReal[3325] = 0.00
      call GroupClear(gpTemp)
      set l = l+100.00
   endloop
   call DestroyGroup(gp)
   call DestroyGroup(gpTemp)
   set gp = null
   set gpTemp = null
   set SYS_TempGroup = null
endfunction[/codes]

这个是DrawCube 直接调用的函数,function VoidFugg_trg_ShockWavenc里面的判断条件有个GetFilterUnit(),这个应该是T里面的匹配的单位的意思吧,就是匹配Conditons的单位,可是VoidFugg_trg_ShockWavenc没有Conditons啊。那他取得的Unit是什么Unit呢?
回复

使用道具 举报

发表于 2008-1-19 20:51:05 | 显示全部楼层
这个………………还是请教下eff大人吧~~
回复

使用道具 举报

 楼主| 发表于 2008-1-19 20:54:07 | 显示全部楼层
-。- 好吧 谢谢啦 呵呵

那我怎么和“eff大人”联系呀
回复

使用道具 举报

发表于 2008-1-19 20:56:02 | 显示全部楼层
啊。。问弱智问题
楼主这里的
function H2I takes handle h returns integer
      return h
      return 0
endfunction
这句话是传说 XXX bug吗?它在这里的作用是什么呀?
回复

使用道具 举报

发表于 2008-1-19 20:59:36 | 显示全部楼层
引用第15楼cupidtns于2008-01-19 20:56发表的  :
啊。。问弱智问题
楼主这里的
function H2I takes handle h returns integer
      return h
      return 0
.......

恩,这个就是传说中的****** bug~~
作用么,就是相当于强制类型转换吧~~
回复

使用道具 举报

 楼主| 发表于 2008-1-19 21:03:30 | 显示全部楼层
因为要用到GameCache 传送一个参数。 呵呵

local timer tm=GetExpiredTimer()
  local integer N=GetStoredInteger(udg_GC, I2S(H2I(tm)), "Number")

就是这两句,要把Timer转化成Interger然后放缓存里面记录。其实是看everguo 注册Timer事件的时候这样用的,其实里面有些地方我也不是很明白,不过先放一放,等先把这块弄懂了回头再看那里了。哦对,主要这么用是因为我想用全局变量记录N让其传递的时候WE就报错关闭了,所以只好这样了。
回复

使用道具 举报

发表于 2008-1-19 21:45:45 | 显示全部楼层
哦!!!狠狠地明白了!!谢谢两位!
set x=1
loop
exitwhen x>Die
call BJDebugMsg("Thanks")
endloop
回复

使用道具 举报

 楼主| 发表于 2008-1-19 22:38:28 | 显示全部楼层
呵呵 不客气 一起学习么 没准以后有不会的还要问你呢。  还是等待高手解决我的问题中。。。。不过大概其知道应该用
GroupEnumUnitsInRange选取区域了,不过半径不知道设置多少才好,我老怕边上的单位会选不上去,然后应该用GetEnumUnit选取整个Group里面的单位 完成UnitDamageTarget吧。 正在查找控制循环整个Group的变量,我怎么知道整个Group里面有多少个变量呢?
那个ForGroup是什么意思?
请知道的人回复一下 谢谢了 各位
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 03:15 , Processed in 0.190289 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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