找回密码
 点一下
查看: 2556|回复: 29

触发的问题

[复制链接]
发表于 2008-10-28 03:16:42 | 显示全部楼层 |阅读模式
我这三个触发是哪里错了~~~~ 大大们 ~~通宵在线等
[trigger]
Dyidong
    事件
        单位 - 任意单位 发动技能效果
    条件
        (施放技能) 等于 空中锁镣
    动作
        自定义代码: local unit D_unit[1]
        自定义代码: local unit D_unit[2]
        自定义代码: set D_unit[1] = GetTriggerUnit()
        自定义代码: set D_unit[2] = GetSpellTargetUnit()
        触发器 - 开启 Dyidong2 <预设>
        触发器 - 开启 DyidongStop <预设>
[/trigger]

[trigger]
Dyidong2
    事件
        时间 - 每 0.04 秒触发事件
    条件
    动作
        自定义代码: local location D_PointA
        自定义代码: local location D_PointB
        自定义代码: set D_PointA = GetUnitLoc(udg_D_unit[1])
        自定义代码: set D_PointB = GetUnitLoc(udg_D_unit[2])
        自定义代码: call SetUnitPositionLocFacingBJ( D_unit[1], PolarProjectionBJ(MultiPoint8[2], DistanceBetweenPoints(D_PointA, D_PointB), ( GetUnitFacing(D_unit[1]) + 10.00 )), ( GetUnitFacing(D_unit[1]) + 10.00 ) )
        自定义代码: set D_PointA = null
        自定义代码: set D_PointB = null
[/trigger]

[trigger]
DyidongStop
    事件
        单位 - 任意单位 停止施放技能
        单位 - 任意单位 施放技能结束
    条件
        (施放技能) 等于 空中锁镣
    动作
        自定义代码: set D_unit[1] = null
        自定义代码: set D_unit[2] = null
[/trigger]
      
发表于 2008-10-28 10:41:52 | 显示全部楼层
[codes=jass] local unit D_unit[1]
local unit D_unit[2][/codes]
这个应该写成local unit array D_unit

[codes=jass]set D_PointA = GetUnitLoc(udg_D_unit[1])
set D_PointB = GetUnitLoc(udg_D_unit[2])[/codes]
貌似没有看到对udg_D_unit的操作

[codes=jass]set D_unit[1] = null
set D_unit[2] = null[/codes]
不晓得从哪里来的变量………………
回复

使用道具 举报

发表于 2008-10-28 11:06:35 | 显示全部楼层
我很好奇楼主思维中的局部变量作用期是多长
回复

使用道具 举报

发表于 2008-10-28 11:24:23 | 显示全部楼层
local unit u = GetTriggerUnit()....单位不能传递,要靠缓存.
回复

使用道具 举报

 楼主| 发表于 2008-10-28 21:41:28 | 显示全部楼层
这样也没反应啊~~大大们

[trigger]
Dyidong
    事件
        单位 - 任意单位 发动技能效果
    条件
        (施放技能) 等于 空中锁镣
    动作
        触发器 - 开启 Dyidong2 <预设>
[/trigger]

[trigger]
Dyidong2
    事件
        时间 - 每 0.04 秒触发事件
    条件
    动作
        自定义代码: local location D_PointA
        自定义代码: local location D_PointB
        自定义代码: set D_PointA = GetUnitLoc(GetTriggerUnit())
        自定义代码: set D_PointB = GetUnitLoc(GetSpellTargetUnit())
        单位 - 立即移动 (技能施放目标) 到 (从 D_PointA 开始,距离 ((D_PointB 和 D_PointA 之间的距离) - 5.00) ,方向为 (((触发单位) 的面向角度) + 10.00) 度的位移处) ,面向角度 (((触发单位) 的面向角度) + 10.00) 度
        自定义代码: set D_PointA = null
        自定义代码: set D_PointB = null
[/trigger]
回复

使用道具 举报

发表于 2008-10-28 21:44:09 | 显示全部楼层
乱来,每XX时间事件哪里来的触发单位和施法单位
回复

使用道具 举报

发表于 2008-10-28 21:45:52 | 显示全部楼层
楼主需要教程
回复

使用道具 举报

 楼主| 发表于 2008-10-28 22:01:44 | 显示全部楼层
大大帮我写下~~让我学习下~~~谢谢了~~~555搞不懂~~~怎么写都不行
回复

使用道具 举报

发表于 2008-10-28 22:33:38 | 显示全部楼层
问题一: LZ是要用全局变量还是要局部变量...........

问题二: 你确定不要先找些教程看看么...........

全局变量比较简单,但是不支持多人施法。局部变量要用到returnbug+GameCache.........LZ自己选吧.........
回复

使用道具 举报

发表于 2008-10-28 22:39:23 | 显示全部楼层
全局要支持多人也可以,不过麻烦点,需要用数组+控制变量,一般还是return bug+gamecache吧

lz最好好好地学习一下jass吧,并不是很难的
回复

使用道具 举报

 楼主| 发表于 2008-10-28 22:58:11 | 显示全部楼层
[月协出品] YD的JASS教程

[简介]月协的JASS教程,一共三卷,内容丰富,语言通俗易懂,举例生动形象妙趣横生,更介绍了一些非常实用的小技巧;虽然YD,却深受某些朋友喜爱;本打算把这些教程净化后发布,但一来太花时间,二来会破坏教程原有的味道,故作保留,请大家以正确的眼光对待。

[序]这些JASS教程,均出自月协会长之手,他以天马行空的手法给我们展现了一个奇妙荒诞的JASS世界,让我们在大笑过后不但消除了对JASS的恐惧更增进了对JASS的了解。在第一卷讲变量时,他以三名妓女来分别比喻全局变量、局部变量和全局变量数组,并在篇末讲解了一种通过“阉割全局变量”,让技能可以多人使用的方法;在第二卷讲函数时,以嫖客和妓女为例讲解函数的调用,情节丝丝入扣,顺带介绍了一种快速查看地图代码的小技巧;在第三卷讲GameCache时,以木子美的性爱日记为参照讲解GameCache的使用,更把GameCache跟Return Bug和Timer的关系比作淫乱的3P...

                               一、变量

1.什么是变量
    变量是存放的是实质的东西,并且因存放的东西不同而分类不同:有单位、区域、触发器等变量——这样说吧,就像容器,放水的叫杯,盛饭的叫碗,装屎的叫马桶。因分类不同,所以你不能让一个变量储存与它类型不同的东西,譬如你不能用单位变量来保存地图上一个区域,就像你不能用马桶给客人盛饭。

2.不同变量类型的转换

     虽说变量不能储存与它类型不同的东西,但变量的类型,其实是可以改变的。我们在T里,看到“将一个整数转换成实数”,“将一个整数转换成字符窜”等等;WE里提供了三种变量类型之间的自由转换——整数,实数,字符窜;就像我们可以用杯子装饭,拿碗装水一样。

     不知不觉便说到我们的周星星同学了,因为有人看到他居然拿马桶吃饭;这是怎么回事?原来有个Return Bug,利用系统漏洞可以实现任意两个变量类型之间的转换。由于周星星是个特工,他的皮鞋,其实是吹风机,他的电话,还是吹风机,也就是说,由于职业需要,他把他的东西做了改装,以麻痹敌人。所以,他拿的马桶也不是真的马桶,那其实是个饭盒,外观像马桶而已。所以当周星星拿着马桶去厕所,别人以为他是去便便,其实他是去吃饭。

     关于Return Bug,将在后面着重单独列出来讲。

3.全局变量与局部变量
 
     变量是容器,这里我们拿杯子来说明全局变量与局部变量的区别。全局变量就像一个玻璃杯,不可能两个人同时使用,使用完下次可继续使用;局部变量则像一叠一次性纸杯,同时可以满足很多任何水的需要,并且使用完纸杯就丢掉,即便你有Sars也不怕传染给别人。

     一般而言,由于程序在执行时,速度很快,因此多个T使用同一个全局变量,出错的概率很小;但,一旦T里有等待,情况就不妙了。

    就像用杯子喝水,如果你是一口气把水喝完,然后把杯子放回原处给下一个人用,没什么问题;但如果你喝一小口,歇半天,再喝下一口,就出问题了——如果这时,另外有人也要用这杯子,那么,你跟他将轮流喝杯子里的水——很有断臂山的感觉。

    好了,我们把目光回到JASS上。

1>全局变量

      全局变量我们并不陌生,顾名思意,它是在不同的函数体里都能使用的变量。

     那么,哪些变量是全局变量呢。

     首先我们在T里自定义的变量全是全局变量;将T转为J后,你会发现,所有自定义变量前都有udg_的前缀。比如,我们定义一个类型为整数的变量i,那么,当保存地图时,我们可以看到下面这条J:

jass:  Copy code
globals
            // User-defined
            integer   udg_i= 0
endglobals
        可见,在J里,全局变量是在globals下定义的。

        以bi_为前缀的变量也是全局变量,比如bj_lastCreatedUnit,bj_forLoopAIndex,等,或许这些变量你看了有些陌生,但是之前在T里我们曾大量使用过。

        在介绍bj_类全局变量前,我们先看两个例子:

        我们常说,不能在循环里加等待,为何?因为bj_forLoopAIndex便是循环里使用的循环整数A,它是一个全局变量;如果在循环里加等待,那么当别的T也用循环整数A来执行循环时,前面的提过断臂山就将上演。

        还有一个经典的错误,我们在创建一个单位后,等待XX秒,然后命令上次创建的单位去XX,便有可能会出错,因为此时最后创建的单位可能不是原来的单位了。或许你已经猜到了,我们在用T时,系统每生成一个单位,便用bj_lastCreatedUni来保存它,因此使用等待之后,那它可能保存别的单位去了。

        其实,bj_类全局变量,不是别的,正是WE自带的全局变量;如果说udg_类变量是二奶,那人家bj_类变量就是原配。

2>局部变量

          局部变量是在一个函数体里定义的变量,并且只能在该函数体内使用。它定义的方式如下:

local <类型> <变量名>

        比如,我们定义一个单位变量:

local unit FRJJ

        于是,我们就定义了个名为“芙蓉姐姐”的单位变量。

      “定义它做什?”

      “待会儿我要用她教训看帖不回帖的人。”

        “YD男,你这样讲解太费事了,把局部变量比作老婆,把全局变量比作军妓,不就讲明白了么!”

      “非也,老婆都还有红杏出墙的可能,但局部变量它忠贞不二绝不会勾一搭二勾三搭四。”

        要注意下,部分类型的局部变量在使用后必须清零,所以在用FRJJ教训完看贴不回帖的人后,要记得

        set FRJJ = null

        除了unit类变量,类似需要清空的还有rect, location, timer, trigger, group, triggercondition, triggeraction,我只记得这几个,漏了的话请大人补充。

3>全局变量+数组

        丽春院的生意火了,这可把已经升级到老鸨的韦春花乐得合不拢嘴;但让她发愁的是,最近人手严重不够用。举个例子,她去给田大爷唱十八摸,都唱到第十七摸了,结果西门大官人又点她去唱;给西门庆唱了第一摸后,在田伯光面前把第十八摸唱成了第二摸,这可把她郁闷到了。
        这该死的全局变量!
        这时,一个小鬼头跑进来,两边脸都有三条纹,跟小花猫似的;他问:
        “店里招人吗,不用给我工钱,给碗拉面就是了。”
        “我们不招伙计。”
        “我可以去接客。”
        “哼,来这的人都来找姑娘的,没人会找正太……”
        韦春花话音未落,眼前的小正太不见了,出现一个裸体的美女,两边脸都也有三条纹。
        “你看,这样行吗?”
        哇噻,这小鬼居然会使传说中的色诱术,相信大家都猜到他是谁了吧!
        这时西门庆跟田伯光打起架了,都想要这小美女陪,但又不肯玩3P,这可急煞了韦春花。此时,只见小美女双手结印,大喝一声“影分身之术”;瞬间三个美女出现在众人面前。
        三个美女,一个陪西门庆,一个陪田伯光,另一个接过拉面埋头大吃。
        韦春花纳闷,难道这小子像孙悟空一样,拔毛一吹能变出小猴子;她好奇地到两位客人的房前偷听,只闻得那一声声“呀咩嗲”连绵不绝,没有任何可疑之处。
        事后,当西门庆跟田伯光满足地走出来,韦春花进屋一看,哪有小美女的影子……
        局部变量就是好啊!不愧是东嬴来的,真厉害。韦春花感叹道。

        这时,又进来一个女人,十分妖艳。
        “你是谁?”
        “难道你看不出,我是个女人吗?”   
        “你来这做什么?”
        “看你缺人手,帮你接客咯!”
        “不用了,我有人选了。”这小鬼只要一碗拉面就能打发,而且会这么厉害的法术,韦春花当然不会再招人。
        “这小Y头片子有我漂亮么?”
        “人家会法术。”
        “不就是分身术么,我也会!”说完,一阵烟雾过后,几十个美女出现在韦春花面前。
        这时,门口的客人再人忍不住,一窝蜂冲进来,抢了美女就去开房。
        “好,你被录用了,你叫什么名字。”
        “我叫春三十娘。”

        春三十娘的分身比那小鬼头的更好,完事后会从房里走出来;不像那小鬼头的分身,太邪乎了。
        托两个伙计的福,这几天丽春院生意一直很好。不过,被春三十娘的分身服侍过的客人,有些染上了花柳;而小鬼头的分身,即便是服侍了有花柳的客人,也没事,因为服侍完后分身就不见了,连根毛都没有。渐渐的,客人不敢点春三十娘服务了。
        这时,有人指出,春三十娘的分身术是骗人的把戏,这人不是别人,正是我们智慧的化身——阿凡提。
        原来阿凡提每次被春三十娘的分身服侍,都会在她们身上做记号;终于有天,他发现服侍自己的分身上有以前做过的记号。
        铁证如山,春三十娘只好承认,她有二十九个孪生姐妹——她们分别是春大娘,春二娘,……,春二十九娘。

        那么,故事讲完了~

          如果韦春花是全局变量,旋涡鸣人是局部变量,那春三十娘跟她的姐妹们就是全局变量加数组——她们长得一模一样,能同时应付多人需求。

        全局变量加数组还能克服全局变量的一些弊端,比如,我们要在循环里加等待,那我们就不要使用循环整数A,而是定义一个整数变量数组Loop[],可以把循环数设为Loop[触发单位的自定义值],或Loop[触发玩家的索引],这样一样出错的概率就大大降低。

        因此,使用不了局部变量,用全局变量加数组也是个不错的选择~~

        需要指出的是,关于数组的尺寸,一般类型变量的数组,尺寸设置为0就可以了,使用时数组会自动增加其长度;而单位组跟玩家组类型的数组,则必须设置好尺寸,比如PiaokeZhong[]的尺寸设置为3,那PiaokeZhong[4]就是无效的;PiaokeZhong[3]也无效,因为数组的有效索引是从0开始的,所以真正有效的三个单位组是PiaokeZhong[0]、PiaokeZhong[1]、PiaokeZhong[2]。

4.王道

        即便采用全局变量加数组,也不能完美地模拟局部变量的功能,正如前面所说,春三十娘的分身还是会传播花柳;可是,我们无法在T里使用局部变量,那么,怎么完美地解决了。

        当你被问到谁是你心目中武功最高的人,你可能会想到他(她)——东方不败。为什么他(她)最厉害呢,因为他(她)既不是男人也不是女人,但同时又具备了两者的特性,阴阳调和,是天地间最可怕的生物。所以,人妖是王道啊,比如我国现在采取的一国两制。

        那么,如何将局部变量写进T里呢,呵呵,我们有Custom Script(自定义代码),也就是传说中的《葵花宝典》。

        举例如下:

Trigger Tree    Present: Zoxc @ wc3campaigns  |  Migration: Greedwind    |    展开 | 收缩 | 复制
piaoji
事件
单位 - 单位进入 丽春院
环境
((触发单位) 是一个嫖客) 等于 True (真)
动作
自定义:local unit piaoke = GetTriggerUnit()
自定义:local real x = GetUnitX(piaoke)
自定义:local real y = GetUnitY(piaoke)
自定义:local unit WeiChunhua = CreateUnit(Player(0),'JV00',x,y,0)
游戏 - 对 (所有玩家) 显示文本: 楼上楼下的~
游戏 - 对 (所有玩家) 显示文本: 姑娘们出来~
游戏 - 对 (所有玩家) 显示文本: 接客了!
自定义:call IssueTargetOrderBJ( piaoke, "XX", WeiChunhua )
等待 1800.00 游戏秒
自定义:set piaoke = null
自定义:call RemoveUnit(WeiChunhua)
自定义:set WeiChunhua = null


        如何,我们用个局部变量piaoke来保存触发单位,然后生成的单位WeiChunhua也用局部变量保存,如此一来,即便丽春院生意再红火,也不会出现人手不够的情形,也不会有人染上花柳。

        这里,需要注意下,含有local的自定义代码必须放在其它代码前面,否则会出错。

        那么,如何把一个含有全局变量的T,变成上面的“东方不败”呢,呵呵,很简单。

        我们先用T把这个触发写好:

Trigger Tree    Present: Zoxc @ wc3campaigns  |  Migration: Greedwind    |    展开 | 收缩 | 复制
piaoji

事件
单位 - 单位进入 丽春院
环境
((触发单位) 是一个嫖客) 等于 True (真)
动作
设置 piaoke = (触发单位)
设置 point = (单位 piaoke 的位置)
单位 - 创造 1 个妓女为了玩家 1(红色) 在 point 面对 0.00 度
设置 WeiChunhua = (最后创建的单位)
游戏 - 对 (所有玩家) 显示文本: 楼上楼下的
游戏 - 对 (所有玩家) 显示文本: 姑娘们出来
游戏 - 对 (所有玩家) 显示文本: 接客了!
单位 - 命令 piaoke  XX WeiChunhua
等待 1800.00 游戏秒
单位 - 把 WeiChunhua 从游戏中不留痕迹的删除
点 - 删除 point


        好了,我们开始人类改造手术吧(奸笑~)

        首先,我们把这个T转成J,我们可以看到,在动作函数里


jass:  Copy code
function Trig_piaoj_Actions takes nothing returns nothing
         set udg_piaoke = GetTriggerUnit()
         set udg_point = GetUnitLoc(udg_piaoke)
         call CreateNUnitsAtLoc( 1, 'JV00', Player(0), udg_point, 0.00 )
         set udg_WeiChunhua = GetLastCreatedUnit()
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1330" )
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1331" )
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1332" )
         call IssueTargetOrderBJ(udg_piaoke, "XX", udg_WeiChunhua )
         call PolledWait( 1800.00 )
         call RemoveUnit( udg_WeiChunhua )
         call RemoveLocation( udg_point )
endfunction

          现在,我们可以戴上手套,拿出剪刀了(继续奸笑)。

        我们的目的,是用局部变量替代全局变量;找了下,这段代码里有三个全局变量,udg_piaoke,udg_point,udg_WeiChunhua;为什么我们能很快找出全局变量呢,因为他们多长了个东西——“udg_”,好了,是时候阉割全局变量了让他们变人妖了~

剪掉udg_后,代码变成

jass:  Copy code

function Trig_piaoj_Actions takes nothing returns nothing
         set piaoke = GetTriggerUnit()
         set point = GetUnitLoc(piaoke)
         call CreateNUnitsAtLoc( 1, 'JV00', Player(0), point, 0.00 )
         set WeiChunhua = GetLastCreatedUnit()
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1330" )
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1331" )
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1332" )
         call IssueTargetOrderBJ(piaoke, "XX", WeiChunhua )
         call PolledWait( 1800.00 )
         call RemoveUnit(WeiChunhua )
         call RemoveLocation(point )
endfunction

        那么,手术结束了吗?当然没,因为局部变量是要先定义的,而且在使用完后,单位啊,点啊之类的变量要清空。


jass:  Copy code
function Trig_piaoj_Actions takes nothing returns nothing
         local unit piaoke                  
         local unit WeiChunhua
         local location point
         set piaoke = GetTriggerUnit()
         set point = GetUnitLoc(piaoke)
         call CreateNUnitsAtLoc( 1, "JV00", Player(0), point, 0.00 )
         set WeiChunhua = GetLastCreatedUnit()
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1330" )
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1331" )
         call DisplayTextToForce( GetPlayersAll(), "TRIGSTR_1332" )
         call IssueTargetOrderBJ(piaoke, "XX", WeiChunhua )
         call PolledWait( 1800.00 )
         call RemoveUnit(WeiChunhua )
         call RemoveLocation(point )
         set piaoke = null
         set WeiChunhua = null
         set point = null
endfunction

        手术成功,我们先把这段代码保存下来。

        最后,我们把这些代码,一行行用自定义代码加到T里,就成了这样子~

Trigger Tree    Present: Zoxc @ wc3campaigns  |  Migration: Greedwind    |    展开 | 收缩 | 复制
piaoji
事件
单位 - 单位进入丽春院
环境
((触发单位) 是一个嫖客) 等于 True (真)
动作
自定义:local unit piaoke
自定义:local unit WeiChunhua
自定义:local location point
自定义:set piaoke = GetTriggerUnit()
自定义:set point = GetUnitLoc(piaoke)
自定义:call CreateNUnitsAtLoc( 1, 'hfoo', Player(0), point, 0.00 )
自定义:set WeiChunhua = GetLastCreatedUnit()
游戏 - 对 (所有玩家) 显示文本: 楼上楼下的
游戏 - 对 (所有玩家) 显示文本: 姑娘们出来
游戏 - 对 (所有玩家) 显示文本: 接客了!
自定义:call IssueTargetOrderBJ(piaoke, "XX", WeiChunhua )
等待 1800.00 游戏秒
自定义:call RemoveUnit(WeiChunhua)
自定义:call RemovLocation(point)
自定义:set piaoke = null
自定义:set WeiChunhua = null
自定义:set point = null


    于是一个伟大的人妖诞生咯~

        可以看出,对于含有全局变量的一行T,我们实行阉割,然后装进自定义代码中,但对于其他的T,比如上面的“游戏 - 对 (所有玩家) 显示文本: 接客了!”、“等待 1800.00 游戏秒”,则可以原封不动保存下来。
        我一直认为做图,没必要学习JASS,T就已经绰绰有余;只需要了解点排泄方面的知识,以及会用两句Custom Script,就足够了。按刚才阉割全局变量的方法,我们可以轻松把一个技能变成可以多人同时使用。

        综述,使用Custom Script是解决全局变量与局部变量矛盾最好的方法。


我是看这个教程把全局变量 变成局部变量的~~~~~
回复

使用道具 举报

发表于 2008-10-28 23:07:02 | 显示全部楼层
...这个教程还是建议不要看,换一个吧
回复

使用道具 举报

发表于 2008-10-28 23:09:45 | 显示全部楼层
建议是,先【基础教程】里面的都看一下

如果觉得里面东西都掌握了

再看【其他教程】里面关于gamecache和return bug 的应用
回复

使用道具 举报

 楼主| 发表于 2008-10-28 23:09:59 | 显示全部楼层
那我去看哪个教程~~~~~GA电子书里就这个是教局部的了
回复

使用道具 举报

发表于 2008-10-28 23:12:24 | 显示全部楼层
就在那里面,目录不一样而已~~

最后呢,再看看其他资源里面的东西,相信你就能够自己解决大部分问题了
回复

使用道具 举报

发表于 2008-10-28 23:23:04 | 显示全部楼层
[codes=jass]//Global Variables
globals
    gamecache udg_GC
    trigger gg_trg_Dyidong
endglobals

//Custom Script
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 GameCache takes nothing returns gamecache
    if udg_GC == null then
        call FlushGameCache(InitGameCache("w3gc.w3v"))
        set udg_GC = InitGameCache("w3gc.w3v")
    endif
    return udg_GC
endfunction

//Trigger Codes
function Dyidong_Effect takes nothing returns nothing
    local trigger trg = GetTriggeringTrigger()
    local unit source = I2U(GetStoredInteger(GameCache(), I2S(H2I(trg)), "Source"))                                       
    local unit target = I2U(GetStoredInteger(GameCache(), I2S(H2I(trg)), "Target"))
    local real sx = GetUnitX(source)
    local real sy = GetUnitY(source)
    local real tx = GetUnitX(target)
    local real ty = GetUnitY(target)
    local real distance = SquareRoot((sx - tx) * (sx - tx) + (sy - ty) * (sy - ty))
    local real angle = Atan2(ty - sy, tx - sx)
    local real mindistance = 150
    if GetTriggerEventId() == EVENT_UNIT_SPELL_ENDCAST then
        call FlushStoredMission(GameCache(), I2S(H2I(trg)))
        call DestroyTrigger(trg)
    else
        set distance = distance - 5
        set angle = angle + bj_PI / 25
        if distance < mindistance then
            set distance = mindistance
        endif
        set tx = sx + distance * Cos(angle)
        set ty = sy + distance * Sin(angle)
        call SetUnitX(target, tx)
        call SetUnitY(target, ty)
    endif
    set trg = null
    set source = null
    set target = null        
endfunction

function Dyidong_Action takes nothing returns nothing
    local trigger trg = CreateTrigger()
    call StoreInteger(GameCache(), I2S(H2I(trg)), "Source", H2I(GetTriggerUnit()))
    call StoreInteger(GameCache(), I2S(H2I(trg)), "Target", H2I(GetSpellTargetUnit()))
    call TriggerRegisterTimerEvent(trg, 0.04, true)
    call TriggerRegisterUnitEvent(trg, GetTriggerUnit(), EVENT_UNIT_SPELL_ENDCAST)
    call TriggerAddAction(trg, function Dyidong_Effect)
    set trg = null
endfunction

function Dyidong_Condition takes nothing returns boolean
    return GetSpellAbilityId() == 'XXXX'    //XXXX is the id of the ability
endfunction

function InitTrig_Dyidong takes nothing returns nothing
    set gg_trg_Dyidong = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_Dyidong, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_Dyidong, Condition(function Dyidong_Condition))
    call TriggerAddAction(gg_trg_Dyidong, function Dyidong_Action)
endfunction[/codes]

以上为演示代码,演示就暂时不放上了,效果是每0.04秒收拢5单位距离,并逆时针旋转7.2度,最近距离为150

这个内容对于jass初学者来说应该算是比较难了,用到了return bug+gamecache,可能lz现在还理解不了
希望lz好好加油,从基础开始一步一步深入学习,争取自己写出来,实在不行的话至少要把我写的这些看懂看透哦~~
回复

使用道具 举报

 楼主| 发表于 2008-10-28 23:59:30 | 显示全部楼层
大大  可以把演示图发上来不~~~谢谢了~~我正在对着教程一行一行的看你写的~~
回复

使用道具 举报

发表于 2008-10-29 01:38:34 | 显示全部楼层
这段代码发上来和地图发上来基本上没有任何区别了,而且这段代码也并不是让你直接用的,只是希望你能在自学之后再去看懂它,并在这个基础上做出自己的作品

疑难区导航帖中有everguo大的jass培训班教程的链接,里面包含了你前面提到的那篇教程,lz可以去参考下
回复

使用道具 举报

 楼主| 发表于 2008-10-30 01:31:59 | 显示全部楼层
猪头大大~~~现在可以把技能给我查考了吧~~~5555 可以把这个注释完整掉吗~~~把技能给我~~~~~~

function Dyidong_Effect takes nothing returns nothing
      local trigger trg = GetTriggeringTrigger()    //获得当前触发器
      local unit source = I2U(GetStoredInteger(GameCache(), I2S(H2I(trg)), "Source"))   //从缓存中读出目标单位的点位置                                                        
      local unit target = I2U(GetStoredInteger(GameCache(), I2S(H2I(trg)), "Target"))   //从缓存中读出触发单位的点位置
      local real sx = GetUnitX(source)   //设置X点 = 目标单位X位置  
      local real sy = GetUnitY(source)   //设置y点 = 目标单位y位置
      local real tx = GetUnitX(target)   //设置X点 = 触发单位X位置
      local real ty = GetUnitY(target)   //设置y点 = 触发单位y位置
      local real distance = SquareRoot((sx - tx) * (sx - tx) + (sy - ty) * (sy - ty)) //设置点 = Xxxx
      local real angle = Atan2(ty - sy, tx - sx)  //设置角度
      local real mindistance = 150   //设置距离
      if GetTriggerEventId() == EVENT_UNIT_SPELL_ENDCAST then   //因该是运行某个动作 (这个我不清楚)
            call FlushStoredMission(GameCache(), I2S(H2I(trg))) //这个不清楚
            call DestroyTrigger(trg)  //摧毁触发器
      else
            set distance = distance - 5  //设置X,X的距离减5
            set angle = angle + bj_PI / 25 //设置角度-25
            if distance < mindistance then
                  set distance = mindistance
            endif
            set tx = sx + distance * Cos(angle)
            set ty = sy + distance * Sin(angle)
            call SetUnitX(target, tx)                                
            call SetUnitY(target, ty)
      endif
      set trg = null
      set source = null
      set target = null            
endfunction

function Dyidong_Action takes nothing returns nothing
      local trigger trg = CreateTrigger()
      call StoreInteger(GameCache(), I2S(H2I(trg)), "Source", H2I(GetTriggerUnit()))   //储存目标单位的点位置
      call StoreInteger(GameCache(), I2S(H2I(trg)), "Target", H2I(GetSpellTargetUnit()))  //储存目标单位的点位置
      call TriggerRegisterTimerEvent(trg, 0.04, true)  //设置计时器 为 0.04
      call TriggerRegisterUnitEvent(trg, GetTriggerUnit(), EVENT_UNIT_SPELL_ENDCAST) //事件
      call TriggerAddAction(trg, function Dyidong_Effect)  //开启触发器
      set trg = null
endfunction

function Dyidong_Condition takes nothing returns boolean
      return GetSpellAbilityId() == 'XXXX'      //XXXX is the id of the ability   //调用函数
endfunction

function InitTrig_Dyidong takes nothing returns nothing
      set gg_trg_Dyidong = CreateTrigger()
      call TriggerRegisterAnyUnitEventBJ(gg_trg_Dyidong, EVENT_PLAYER_UNIT_SPELL_EFFECT)
      call TriggerAddCondition(gg_trg_Dyidong, Condition(function Dyidong_Condition))
      call TriggerAddAction(gg_trg_Dyidong, function Dyidong_Action)
endfunction


这个触发大概是这个意思吧~~
回复

使用道具 举报

发表于 2008-10-30 01:38:45 | 显示全部楼层
指出一点lz误解之处

local real distance = SquareRoot((sx - tx) * (sx - tx) + (sy - ty) * (sy - ty)) //得到两者之间距离
local real angle = Atan2(ty - sy, tx - sx) //得到两者间角度
local real mindistance = 150  //设置最小距离
if GetTriggerEventId() == EVENT_UNIT_SPELL_ENDCAST then  //判断触发的事件
call FlushStoredMission(GameCache(), I2S(H2I(trg))) //销毁缓存内容
set angle = angle + bj_PI / 25 //设置角度增加180/25=7.2度
call TriggerRegisterTimerEvent(trg, 0.04, true)  //注册每0.04秒事件
call TriggerRegisterUnitEvent(trg, GetTriggerUnit(), EVENT_UNIT_SPELL_ENDCAST) //注册技能结束事件
call StoreInteger(GameCache(), I2S(H2I(trg)), "Source", H2I(GetTriggerUnit()))   //储存施法单位
call StoreInteger(GameCache(), I2S(H2I(trg)), "Target", H2I(GetSpellTargetUnit()))  //储存目标单位
call TriggerAddAction(trg, function Dyidong_Effect)  //为触发添加动作
return GetSpellAbilityId() == 'XXXX'      //判断释放的技能为XXXX,XXXX是你要的那个技能

其实理解了那么技能也就做出来了,你只要设置好全局变量,写好自定义脚本,把XXXX替换掉就可以了呀
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-21 10:34 , Processed in 0.091337 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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