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

简单触发器帮助文档,更新伤害显示系统[暂停更新]

[复制链接]
发表于 2009-2-17 13:25:17 | 显示全部楼层 |阅读模式
近日心血来潮,突然想写一下触发器的教程,其实应该不叫教程,应该叫帮助文档,类API之类的.
今天就写一下试试.本人习惯由问题入手,所以将会以问答形式入手进行讲解.
由于本人第一次写类似的东西,写的不好请多包涵

1. 问:什么是触发器?
    触发器英文称之其为Trigger,缩写T.所以触发器既是T,T即是触发器.

2.问:在WE中如何打开触发器?
    快捷键为F4,如果想使用鼠标点击.如下图
    OpenTrigger.jpg

3. 问:触发器是如何运作的?
    触发器由3个部分组成.即事件,条件,动作3部分.
    其运行的流程为:发生了XX事件,且符合XX条件,那么我就执行XX动作.
    例:
      事件: 任意单位发动技能效果
      条件: 释放技能等于风暴之锤
      动作: 对触发单位所有者发动信息"你使用了风暴之锤"

    那么当你使用一个单位发动风暴之锤时,将在你的屏幕上显示"你使用了风暴之锤"这段话
    可以说逻辑非常清晰,不难吧.

4: 问:我打开了触发器,为什么触发器里面的字是英文的?
    你没有安装UI,请下载一个中文UI进行安装.安装后触发器中的字将变成中文.
    初学者推荐使用老狼UI,下载地址请点击这里.
    将压缩包中的UI和Units文件夹解压到魔兽争霸的根目录下,即WAR3.exe的同级目录下.
    然后进入UI文件夹点击All.bat,等待DOS界面消失后即可打开WE.
    详细问题可阅读压缩包内ReadMe.txt文档

5. 问: 我如何创建一个触发?
    在触发器面板中使用快捷键Crtl+T,使用鼠标创建如下图
    NewTrigger.jpg
    也可以,右键点击任意触发,或类别文件夹在弹出菜单中选择新建触发,如下图
    NewTrigger2.jpg

6. 问:我如何创建一个事件,条件,动作?
    新事件Crtl+E 新条件Crtl+D 新动作Ctrl+R,使用鼠标创建如下图
    NewAction.jpg
    鼠标右键单击触发,事件,条件,动作任意节点,在弹出菜单中新建,如下图
    NewAction2.jpg   

好了,现在已经说了最基础的东西了,你可以试着写下一个最简单触发,也是世界上最有名简单小程序--"Hello World"
你可以创建一个如下的触发器
小提示:该事件在 "时间" 分类中 该动作在 "游戏"分类中 都是默认第一个很容易找
[trigger]
Hello World
    事件
        时间 - 游戏开始 1.00 秒
    条件
    动作
        游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: Hello World
[/trigger]
进入游戏后,你看见左下方显示出"Hello World"的信息了吗?
如果显示了,那么恭喜你,迈出了学习触发的第一步.
如果没有成功,那么加把劲吧.
可能有个别心急的初学者喊着,我想学刷兵,我想弄出XX地图里面的XX技能.
有些有一定基础的WEER 也许会埋怨过于的本教程过于简单
当然这只是开始嘛.
如果有哪个问道你如上相关的问题,而你由忙不清楚,那么可以干净利落的甩出该帖的链接,让他自己看去,这就是本帖最终目标.....
希望本帖能帮助到那些刚刚起步,没有任何编程经验的朋友们.
饿死了 吃饭去

评分

参与人数 4威望 +7 收起 理由
KickedByOthers + 1
zhuzeitou + 2
kw + 1
xiaojiao + 3 不错

查看全部评分

 楼主| 发表于 2009-2-17 17:45:56 | 显示全部楼层
下面直接开始讲事件
一. 事件特征

          1个触发器可以有多少个事件呢?答案是近乎"无限",当然是有上限的,不过具体是多少不知道,一般不用担心这个问题.因为无数前辈的伤害显示系统就是用动态注册(增加)一个触发事件来实现的,为什么要这样做呢?看看下面你就明白了.所有的事件都会执行触发内的条件判断,通过后执行动作.

二. 单位事件
单位事件有很多,分别为
   
    [li]指定单位事件[/li][li]玩家单位事件[/li][li]任意单位事件[/li][li]单位进入区域[/li][li]单位离开矩形区域[/li][li]单位进入不规则区域[/li][li]单位离开不规则区域[/li][li]单位进入不规则区域(指定条件)[/li][li]单位离开不规则区域(指定条件)[/li][li]接近指定单位[/li][li]生命值变化[/li][li]魔法值变化[/li]

     下面申明一下,触发器这个设计源于设计模式中的监听者模式,即生成一个监听器,监听某个事件的发生,从而针对发生这个事件的相关信息进行操作的编程思想.大家只要略有了解就行,不必深究,这个不是主题.下面将用到"监听"一词,在此说明而已.

     由于指定单位和玩家单位以及任意单位事件有极大的相似性,下面将进行综合一起进行讲解.

         指定单位事件顾名思义是为一个指定的单位注册事件,他只管一个单位.除了这个单位以外的单位它是无法监听到的.
    如果我想监听一个玩家的所有单位该怎么办呢?当然就有了玩家单位事件.
    如果我做想做出不管是任意单位死亡了 我都发送提示信息该用什么事件呢? 为所有的玩家都注册玩家单位事件吗?
    正是如此,但是事件不就很多了吗?重复操作不就很麻烦吗? 没错,也正是由于如此,才有了任意单位事件.其实任意单位事件就是帮玩家1-16都注册了玩家单位事件,任意单位事件是16玩家单位事件的重复注册

                             指定单位事件 玩家单位事件
    死亡                          有                   有
    开始腐化                  有                   有
    改变所有者              有                   有
    接受伤害                  有                   无
    提升等级                  有                   有
    学习技能                  有                   有
    变得可重生              有                   有
    使用物品                  有                   有
    获得物品                  有                   有
    丢弃物品                  有                   有
    出售物品                  有                   有
    出售物品(从商店)   有                   有
    抵押物品(到商店)   有                   有
    被攻击                      有                   有
    被营救                      有                   有
    被选择                      有                   无
    被取消选择              有                   无
    召唤一个单位          有                   无
    被召唤                      无                   有
    准备释放一个技能 有                   有  
    开始释放一个技能 有                   有
    停止释放技能          有                   有
    发动技能效果          有                   有
    释放技能结束          有                   有
    被运输机装载          有                   有
    注意到攻击目标      有                   无
    获取到攻击范围      有                   无
    开始训练单位          有                   有
    取消训练单位          有                   有
    完成训练单位          有                   有
    开始复活英雄          有                   有
    取消复活英雄          有                   有
    完成复活英雄          有                   有
    开始建筑升级          有                   有
    取消建筑升级          有                   有
    完成建筑升级          有                   有
    开始被建造              无                   有
    取消被建造              无                   有
    完成被建造              无                   有
    开始研究科技          有                   有
    取消研究科技          有                   有
    完成研究科技          有                   有
    发动指定物体目标指令 有           有
    发动指定点目标指令 有               有
    发动无目标指令     有                    有

     共计46个详细事件,因为任意单位事件实际就是玩家单位事件的拓展 所以不在此列出
看到这么多你晕了不, 9成的人会晕掉 因此这个只是个参考而已
抓几个主要的说:
     1.接受伤害事件,下面这个是我当初的故事(当故事看就行,希望过去的经历给予初学的各位帮助,请主要理解如何在一个触发器为其他触发器添加事件,因为今天主要讲事件):
    我们发现这个事件只有指定单位分类才有,玩家单位分类是没有的.但是如果我们做一个伤害显示系统,想把每一个单位受到伤害显示出来应该怎么办呢?很简单,那么我们要为每一个单位注册一个事件.没错,这并不是开玩笑,我们要为所有的单位注册接受伤害事件.那么我们如何为每一个单位注册事件呢?
    那么我们来确定我们要做的事情,我们要做的事情是为地图中的单位注册接受伤害事件.我们首先把这个事情给做了.我们把地图上的所有单位都注册一遍这个事件不就行了吗?但是如果我们实现了刷兵系统,那么这种不确定性便出现了,地图上会不断的出现小兵.那么我们便要不断为新出现的小兵注册接受伤害.那么我们就要每隔一段时间,就重新注册一遍地图上每个单位的事件.这样问题似乎一切都解决了.
         既然思路有了,那么我们开工吧.
    首先,我们的触发器会每隔一段事件就会运行一次. 那么需要一个什么样的事件呢? 新建一个事件,在事件分类中我们很显眼的看见一个分类
    "时间",非常幸运的我们发现一个"计时器周期" ,每隔XX秒触发一次. 那么事件我们搞定了.
         然后便是动态的注册事件了. 我们要新建一个什么呢? 一个事件? 不,我们新建一个动作. 你可能会问,不是注册事件吗?为什么新建一个动作?
         你觉得"注册事件"本身不就是一个动作吗?我曾经也觉得不是,但是被某人痛批一顿后,我错了,我找.动作那么多,我怎么知道是哪个动作?那么请擦亮眼睛看看,动作分类里是不是有一个查找分类,东西多了怎么找啊?版主说搜索啊,那么我就说查找吧. 输入"注册"啥也没有找到,郁闷....输入"事件".额.."触发器-添加事件" 还就只有这么一个.踏破铁鞋无觅处,得来总要废功夫.
          为"SHANGHAI"添加事件,指定单位事件-接受伤害 ??单位接受伤害事件 ??单位到底是什么单位呢? 应该是地图上所有的单位,额,晕,怎么选地图上所有的单位呢?冒着被痛批的危险我又去问了..感谢上帝,没被批,估计这个问题问的有含金量.
    答案是用单位组选取地图上所有的单位.然后逐一注册事件. 继续查找"单位组"..我改 ..我改 ..在不断的修改下我的终于弄了出来.
    RegeditEvent.jpg
          才这么两行,弄了我半天.
          接下来可以弄伤害显示了.怎么显示呢,用游戏-发送消息.额 太... 游戏里面都是显示在被攻击头顶的 我继续查找"文字",漂浮文字那是跃然入眼啊.还能在指定单位的头部位置,说白了这个就是做伤害系统的.一次次疯狂测试偏移坐标后,终于弄出来了.怎么文字死死的不动.....我再问,在一句"自己看漂浮文字分类去"后,在那摸啊."漂浮文字-设置速率",总算被我找到了. 1:1800 飞得没影啊... 我调..0.1好了吧.. 飘了瓢了...怎么不消失啊... 一直飞..俄罗斯方块难道..我设置设置生命周期我看你还飞.晕还飞..难道还要设置禁止永久显示? 巨寒... 好了..终于啊 成功了.. 激动啊...
    FloatText.jpg
          自此大功告成,多少天后看见网上某人发出伤害显示系统,人家那个比我还简约,效率还高好多,一个单位进入区域就把我那个计时器加单位组重复做很多次无用功的弄没了,还不说省了好多次枚举.把计时器加单位组的触发器替换成如下触发
    RegeditEvent2.jpg

          严重申明:通过反反复复的研究,最终形成的伤害显示系统并不是上面说得那样 ,演示更新在8楼/size]

2 .技能相关事件:
      
    [li]单位准备释放技能:会在单位准备释放技能时触发,[/li][li]开始释放技能:会在单位开始释放技能时触发,时间差为技能施法时间结束,但技能效果发动之前的一刹那,此时技能并没有成功释放,魔法值也没有减去.[/li][li]发动技能效果:技能发动成功,魔法值也减去的时刻会触发[/li][li]停止释放技能:释放某些持续技能,如暴风雪.持续6秒的技能,在6秒以内被主动打断(如:发布停止命令)或被动打断(如:被风暴之锤砸中了)时会被触发[/li][li]释放技能结束:顾名思意啊.此时无法获得技能目标和技能目标点等触发数据.[/li]

3.指令相关事件:

        指令知识需要自我实践和积累,包括使用技能 物品 发动移动,停止,建造,采集等等都会触发这类事件 可以参照单位-发布命令(无目标)(单位目标)(点目标)中的指令 进行学习

4.补充说明:

        指定单位事件是无法获得触发玩家的,而触发

    单位进入区域事件,单位离开区域事件,单位进入不规则区域事件,单位离开不规则区域事件,单位进入不规则区域事件(指定条件),单位离开不规则区域事件(指定条件).本质上是2个事件即单位进入不规则区域事件(指定条件),单位离开不规则区域事件(指定条件).

        可以说都是任意单位进入指定区域事件,不规则区域包括矩形区域和单元点,矩形区域由各位用WE中的"区域面板"自己画,不规则区域由动作中的"区域(不规则)"分类中使用"矩形区域"和"单元点"进行拼凑形成.不规则区域事件都要在其他事件为触发添加.

    接近单位事件,生命值变化和魔法值变化都是指定单位事件,可以在事件中直接使用地图上已放置单位来注册事件.动态构建的话,请使用动作"触发器-添加事件".使用触发单位获得相关单位.
三. 玩家事件
  需要一个一个玩家注册,我就不知道他为什么不给一个任意玩家事件给我们用.

    [li]玩家聊天信息事件,通常使用来做各种命令[/li]
    [li]按下ESC键,通常使用来做跳过电影,或者触发某些特殊事件而使用.[/li]
    [li]选择单位事件,通常用来做双击选择英雄,因为比较麻烦.只有有一定水平的人才使用,说实话,用酒馆买不知道多好.[/li]
    [li]玩家键盘事件,可以捕捉到上,下,左,右4个键的按下和释放事件,国外地图常用来选择英雄,国内外也常常用此来模拟各类第一第三人称的游戏,不过系统制作比较麻烦,新手不要考虑.[/li]
    [li]玩家属性事件,可以捕捉到黄金,木头,人口,维修费用,得分等等.TD常用一个玩家的当前人口数量等于0的事件来控制刷兵.新手参考.[/li]
    [li]联盟状态设置事件,有做竞技类对战图之类的意向,可以看看.[/li]
    [li]联盟状态设置事件(指定项目):同上[/li]
    [li]胜利离开事件:用得不多[/li]
    [li]失败离开事件:用得不多[/li]
    [li]离开事件:该事件不管以何种形式离开,包括掉线,主动退出,被打败等等.一般结合动作"游戏-对玩家显示信息文本"来显示XX玩家离开游戏的触发[/li]

四. 其他事件

    [li]对话框事件和对话框按钮相关事件,由于牵涉到变量,暂时不说[/li]
    [li]可破坏物死亡事件,老狼UI中注释得很清楚没什么可以说明的. [/li]
    [li]  可追踪物事件,说实话,没见几个人用过,感兴趣可以自己实践. [/li]
    [li]  时间事件,都跟计时器有相当大的关系.说道计时器时会说明. [/li]
    [li]物品事件,就一个..不难 但是是指定物品事件.基本都要动态注册事件. [/li]
    [li]游戏事件,除了游戏时间改变就是魔兽中间上方那个钟的时间用得比较多,和实数变化偶尔会用,其他事件的因为限制较多用得不多.[/li]

学习WE记住看老狼给的注释,可以少走很多弯路.如下路
Zhushi.jpg
UnitEvent.jpg
回复

使用道具 举报

发表于 2009-2-17 18:10:02 | 显示全部楼层
伤害显示直接在兵刷出来的时候注册就可以了 不必要再添加一个多余的触发器或者枚举
回复

使用道具 举报

发表于 2009-2-17 20:22:46 | 显示全部楼层
如果是正常地图
开启地图就显示的话
伤害显示一共应该两个注册事件
一个是0秒时选取地图内所有单位注册
另外就是单位进入地图区域注册
这样就够了
回复

使用道具 举报

发表于 2009-2-17 23:18:29 | 显示全部楼层
每秒都注册伤害事件到后期不得卡死.......而且最好过一段时间删除触发重新注册一下。
回复

使用道具 举报

 楼主| 发表于 2009-2-18 00:24:14 | 显示全部楼层
昏迷, 估计都没看内容.  我说的事情是当初的时候, 而且我说人家那个好,我说以前是事情,是想说明做一个触发前先有想法,逐步制作,完成制作,寻求优化代码的这个一个过程.
2楼说每次刷兵都在自己的触发里注册,那你召唤呢,复活技能呢 太不完善了
回复

使用道具 举报

发表于 2009-2-18 00:27:52 | 显示全部楼层
引用第4楼louter于2009-02-17 23:18发表的  :
每秒都注册伤害事件到后期不得卡死.......而且最好过一段时间删除触发重新注册一下。

每秒注册………………
这样不出事情就见鬼了,重复事件接连不断,而且卡也估计卡死了………………
动态注册也不是这么动态来的吧………………

一般的动态注册,是先选取地图上全部单位注册一遍,然后捕捉到单位进入地图区域事件时为触发单位注册就好了,就像lz后面写的那样

话说,lz把触发图替换掉吧~~
回复

使用道具 举报

发表于 2009-2-18 13:00:51 | 显示全部楼层
引用第5楼hunluan89于2009-02-18 00:24发表的  :
昏迷, 估计都没看内容.  我说的事情是当初的时候, 而且我说人家那个好,我说以前是事情,是想说明做一个触发前先有想法,逐步制作,完成制作,寻求优化代码的这个一个过程.
1楼说每次刷兵都在自己的触发里注册,那你召唤呢,复活技能呢 太不完善了
所以才用进入地图来注册
LZ的教程跟我那个技能基础教程差不多
都是为了服务新人的
所以最好还是先把正确答案写出来
否则容易误导的
回复

使用道具 举报

 楼主| 发表于 2009-2-18 22:17:25 | 显示全部楼层
2楼那个伤害显示系统是估计是有点误导新人了
那个只是说明一个想法实现的流程,希望大家做触发时多用到自己的想法和手,这样才能为自己累积到经验和技术
以下这个是正确完整的伤害显示系统
触发一:用于对在游戏初始化时就已存在于地图上的单位进行注册"接受伤害事件"
[trigger]
DefaultDamageRegedit
    事件
        时间 - 游戏开始 0.00 秒
    条件
    动作
        自定义代码: set bj_wantDestroyGroup=true
        单位组 - 选取 ((完整地图区域) 内的所有单位) 内所有单位做动作
            Loop - 动作
                触发器 - 为 DamageDisplay <预设> 添加事件: (单位 - (选取单位) 接受伤害)
        触发器 - 删除 DefaultDamageRegedit <预设>
[/trigger]
触发二:用于动态注册不断新出现在地图中的单位的"接受伤害事件"
[trigger]
RegeditDamageEvent
    事件
        单位 - 单位进入 (完整地图区域)
    条件
    动作
        触发器 - 为 (DamageDisplay(预设)) 添加事件: (单位 - (进入的单位) 接受伤害)
[/trigger]
触发三:使用漂浮文字制作伤害显示效果
[trigger]
DamageDisplay
    事件
    条件
    动作
        漂浮文字 - 创建漂浮文字:(转换 (单位所受伤害) 为字符串) 在 (触发单位) 头顶Z轴偏移 -5.00 处,字体大小: 9.00 ,颜色值:(100.00%, 100.00%, 100.00%) ,透明度: 0.00%
        漂浮文字 - 设置 最后创建的漂浮文字 [R] 的X轴速率: 0.00 ,Y轴速率: 0.10
        漂浮文字 - 设置 (最后创建的漂浮文字) : 禁用 永久显示.
        漂浮文字 - 设置 (最后创建的漂浮文字) 的生命周期为 3.00 秒
[/trigger]

下面是地图演示,可以直接移植,自己学会才是自己的
俗话说授之以鱼不如授之以渔 我说 要之一鱼不如要之一渔
演示中解释了一些问题,可以自己看看:

出现了疏漏,导致新刷出来的兵不能显示伤害.现已更正,由于准备出去工作了,可能会暂时停止更新

伤害显示系统.w3x

22 KB, 下载次数: 148

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 08:27 , Processed in 0.096816 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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