找回密码
 点一下
查看: 7079|回复: 18

T的局域化与变量传递研究演示技能——近战抵抗护盾

[复制链接]
发表于 2009-3-11 09:18:01 | 显示全部楼层 |阅读模式
1.gif
不要忽略了那个一闪的护盾效果!

可以看到,这个技能的效果并不复杂,

就是当圣骑士被近战单位攻击时,会几率击飞攻击单位

并且消耗魔法。同时,会在攻击单位和圣骑士之间出现一个护盾特效(举盾)

恩,这个技能并不复杂,但是完全用T(自定义代码也不使用)制作却很难

主要的难度在于两重局域化:对于击退的局域化(可以击退多个单位)和对于整个技能的局域化(多个英雄使用这个技能)

另外因为直接使用等待0.01秒作为击退循环间隔的效果特别不好(间隔太长,出现诡异的效果)

所以我们就需要单独出一个击退效果的T,而且这个T还要局域化(无变量冲突)

另外就是为了多个英雄能同时使用这个技能,我们需要将传递局域变量(不是真正的,只是不会冲突的变量)到击退的T

这个用J的话一般都是Return Bug+GameCache绑定计时器来制作的(猜测)

恩恩,反正完全用T做很难吧……

以上废话,可以不看

[trigger]
startreg
    事件
        时间 - 当游戏逝去 0.00 秒
    条件
    动作
        循环动作[I]从 1 到 12, do (玩家 - 禁用 魔法书  对 (玩家 I))
        单位组 - 选取 ((可用地图区域) 内的所有单位) 内所有单位 (触发器 - 为 attacked <预设> 添加事件: (单位 - (选取单位) 接受伤害))
[/trigger]
[trigger]
reg
    事件
        单位 - 任意单位进入 (可用地图区域)
    条件
    ((进入的单位) 的类型) 不等于 计时马甲
    动作
        触发器 - 为 attacked <预设> 添加事件: (单位 - (进入的单位) 接受伤害)
[/trigger]
[trigger]
skillonandoff
    事件
        单位 - 任意单位 发布无目标指令
    条件
        Or - 任意条件成立
            条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldon
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldoff
    动作
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldon
            Then - 动作
                单位 - 添加 魔法书  给 (发布命令的单位)
            Else - 动作
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldoff
            Then - 动作
                单位 - 删除 魔法书  从 (发布命令的单位)
                单位 - 删除 近战抵抗护盾  从 (发布命令的单位)
            Else - 动作
[/trigger]
[trigger]
attacked
    事件
    条件
        (单位所受伤害) 等于 1.00
        (随机实数,最小值: 0.00 最大值: 100.00) 小于或等于 (20.00 x (转换 (近战抵抗护盾  的等级对 (伤害来源)) 为实数))
    动作
        单位 - 设置 (触发单位) 的生命值为 ((生命值 对于 (触发单位)) + 1.00)
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                ((伤害来源) 拥有 近战抵抗护盾 ) 等于 TRUE
            Then - 动作
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        (魔法值 对于 (伤害来源)) 大于或等于 Needmana
                    Then - 动作
                        Set UnitA[(((当前触发) 的触发动作运行次数) mod 8000)] = (伤害来源)
                        Set UnitB[(((当前触发) 的触发动作运行次数) mod 8000)] = (触发单位)
                        Set Point_A = ((伤害来源) 的位置)
                        Set Point_B = ((触发单位) 的位置)
                        Set Point_C = (从 Point_A 开始,距离 50.00 ,方向为 (Point_A 到 Point_B 的角度) 度的位移处)
                        单位 - 设置 (伤害来源) 的魔法值为 ((魔法值 对于 (伤害来源)) - Needmana)
                        如果 ((魔法值 对于 (伤害来源)) 小于 Needmana) 成立,则运行 (单位 - 对 (伤害来源) 发布 中立 娜迦海巫 - 关闭魔法盾 命令) 否则运行 (不做任何动作)
                        单位 - 创建 1 个 计时马甲 给 ((伤害来源) 的所有者) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
                        单位 - 设置 (最后创建的单位) 的自定义值为 (((当前触发) 的触发动作运行次数) mod 8000)
                        单位 - 设置 (最后创建的单位) 的魔法值为 (Movelength / Movespeed)
                        单位 - 设置 Movetime 秒 普通 类型的生命周期对 (最后创建的单位)
                        触发器 - 为 timer <预设> 添加事件: (单位 - (最后创建的单位) 死亡)
                        单位 - 创建 1 个 特效马甲 给 ((伤害来源) 的所有者) 在 Point_C ,面向角度为 (Point_A 到 Point_B 的角度) 度
                        单位 - 设置 0.30 秒 普通 类型的生命周期对 (最后创建的单位)
                        点 - 清除 Point_A
                        点 - 清除 Point_B
                        点 - 清除 Point_C
                    Else - 动作
                        单位 - 对 (伤害来源) 发布 中立 娜迦海巫 - 关闭魔法盾 命令
            Else - 动作
                单位 - 删除 魔法书  从 (伤害来源)
                单位 - 删除 近战抵抗护盾  从 (伤害来源)
[/trigger]
[trigger]
timer
    事件
    条件
        ((死亡单位) 的类型) 等于 计时马甲
    动作
        Set PointA = (UnitA[((死亡单位) 的自定义值)] 的位置)
        Set PointB = (UnitB[((死亡单位) 的自定义值)] 的位置)
        Set PointC = (从 PointB 开始,距离 Movespeed ,方向为 (PointA 到 PointB 的角度) 度的位移处)
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (PointA 和 PointC 之间的距离) 小于或等于 Movelength
                (PointC 处的 可通行地面 通行状态为关闭) 不等于 TRUE
                (魔法值 对于 (死亡单位)) 大于或等于 1.00
            Then - 动作
                单位 - 设置 UnitB[((死亡单位) 的自定义值)] 的X坐标为 (PointC 的X轴坐标)
                单位 - 设置 UnitB[((死亡单位) 的自定义值)] 的Y坐标为 (PointC 的Y轴坐标)
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        ((PointA 和 PointC 之间的距离) + Movespeed) 小于或等于 Movelength
                    Then - 动作
                        单位 - 创建 1 个 计时马甲 给 ((死亡单位) 的所有者) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
                        单位 - 设置 (最后创建的单位) 的自定义值为 ((死亡单位) 的自定义值)
                        单位 - 设置 (最后创建的单位) 的魔法值为 ((魔法值 对于 (死亡单位)) - 1.00)
                        单位 - 设置 Movetime 秒 普通 类型的生命周期对 (最后创建的单位)
                        触发器 - 为 timer <预设> 添加事件: (单位 - (最后创建的单位) 死亡)
                    Else - 动作
            Else - 动作
        点 - 清除 PointA
        点 - 清除 PointB
        点 - 清除 PointC

[/trigger]
如果你仔细看了上面的T或者发上来的技能的话,你会发现我是用单位的生命周期来代替计时器的

关于生命周期的精确度请看这个测试
时间测试.w3x (18 KB, 下载次数: 119)
效果如图
未命名.JPG
上面是执行100次0.01秒生命周期的总共时间

从此我们可以看出使用生命周期在精确度上是不必计时器差多少的

只是在运行中消耗更多的资源,好处是可以绑定很多的东西!

整个技能的局域化简单来说是用事件响应来局域化,

通过事件响应连接到(就是相关索引,如单位的自定义值是单位到整数的连接)的整数来传递数组序号以传递参数

而制作的技能。

唉,费这么大劲才制作这么简单的技能……

顺便广告下:

最近的考试完善后会将新写的T的进阶教程发上来,另外稍后还有个对于T范围内的局域化和参数传递的研究发上来

最后是这个技能
http://www.islga.org/bbs/read.php?tid=25587
这里有新的修改版

近战抵抗护盾.w3x

24 KB, 下载次数: 700

点评

挺好  发表于 2015-8-4 20:39

评分

参与人数 4威望 +43 收起 理由
血戮魔动冰 + 1 不错~~
crazyforyou + 31
hydralisk + 1 感觉不错 努力吧
sxlrose + 10 优秀文章

查看全部评分

发表于 2009-3-11 15:05:59 | 显示全部楼层
在我心中算是精品贴子了
回复

使用道具 举报

 楼主| 发表于 2009-3-12 10:19:47 | 显示全部楼层
为什么呢?
回复

使用道具 举报

 楼主| 发表于 2009-3-14 17:15:55 | 显示全部楼层
这样的被无视沉下去了……
回复

使用道具 举报

发表于 2009-3-14 17:23:29 | 显示全部楼层
呵呵~~而且1威望也没加~~
帮你告诉路人了~~
回复

使用道具 举报

发表于 2009-3-14 17:34:40 | 显示全部楼层
这个东西占用自定义值是不好的。。
看似没有使用等待,实际上可以这么做
local unit u=马甲单位//声明一个本地变量u
local unit hu=击退单位//声明一个本地变量hu
命令u移动到p点
给u添加生命n秒
loop//标记循环开始
等待0.1秒
移动hu到u的位置
exitwhen(u的当前生命<=0)//退出条件
endloop//标记循环结束
回复

使用道具 举报

发表于 2009-3-14 17:40:12 | 显示全部楼层
等待…………有Bug,强烈抗议!!
还有,就是如果这样使用马甲的话…………3个技能一起放……,估计机器就瘫了
主要原因就是,不断地创建新单位…………
而且reg应该加个:
条件:单位不是马甲吧
……要不然…………
效率好低下!!!
回复

使用道具 举报

发表于 2009-3-14 17:43:57 | 显示全部楼层
没条件。。。而且这个等待并不影响最终的效果。。。
回复

使用道具 举报

 楼主| 发表于 2009-3-14 18:51:34 | 显示全部楼层
引用第5楼eff于2009-03-14 17:34发表的  :
这个东西占用自定义值是不好的。。
看似没有使用等待,实际上可以这么做
local unit u=马甲单位//声明一个本地变量u
local unit hu=击退单位//声明一个本地变量hu
命令u移动到p点
.......
因为这个贴子主要是为了演示一下T的局域化和参数传递
恩,如eff大大这样做的话
岂不是乱套了?


PS:自己测试了下
如果很多个同时使用的话
确实很卡
不过我也是可以想到的
我也说了,这个就是以效率为代价的
恩恩血戮魔动冰说的很对
reg那个确实应该加条件
不过如果不用单位的生命周期
我用什么来达到T的精确等待+局域化参数传递呢?


附件改了
回复

使用道具 举报

发表于 2009-3-14 18:53:07 | 显示全部楼层
我竟然没看到如此的帖子 抱歉
回复

使用道具 举报

发表于 2009-3-16 17:15:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2009-3-16 20:18:07 | 显示全部楼层
不,我是沈阳的……
签名是你的地址……
回复

使用道具 举报

发表于 2009-3-17 03:22:49 | 显示全部楼层
t之间的参数传递一般就用计时器就好,高效,要么就用本地变量+等待,简单。
传递参数本来blz就没给ui做这么个功能,所以。。能用点简单的j就用吧,不要非追求全ui_T的。
回复

使用道具 举报

发表于 2009-3-17 03:24:45 | 显示全部楼层
如果用j写就是直接包个叫做“击退”的函数
触发事件是
英雄单位被攻击
动作是
计算角度
计算目标击退地点
击退目标

没了。。。
回复

使用道具 举报

 楼主| 发表于 2009-3-17 09:03:53 | 显示全部楼层
回复

使用道具 举报

发表于 2015-8-3 23:24:44 | 显示全部楼层
666666666666666666666666666666666666666666666666
回复

使用道具 举报

发表于 2016-9-23 08:34:44 | 显示全部楼层
可以,这么长的触发,除了666我已经说不出什么了
回复

使用道具 举报

发表于 2017-9-12 20:16:08 | 显示全部楼层
我竟然没看到如此的帖子 抱歉
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 18:17 , Processed in 0.193715 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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