当前位置 : 主页>技术研究>魔兽技术>

有关魔兽中触发器和jass的问题详细介绍

来源: 作者: 点击:
在介绍这个问题之前我们首先给大家介绍一下关于各个问题之中的基础,让我们在进行这些设置的时候能够对症下药。之后我们在进行设置的时候就能够找到对应的那些问题,这样我们才能够在问题出现的时候找到根源,所以大家就不要觉得我们说的有点麻烦,毕竟这方面的相关信息我们必须要知道得越详细越好。虽然内容有点多不过我想介绍得详细一些对大家帮助更大,所以接下来大家可以往下看了其中的内容应该对大家有帮助。




Q:什么是触发?(Trigger),是如何工作的?

触发(Trigger) - 根据字面意思可以理解为: 事件A 发生后会直接或者间接的导致 事件B 发生的过程~~
关于触发的工作原理,举例如下:
动物踩上地雷,地雷就BOOMMMMMMM!:)~~
以上这就是一个触发,踩地雷 是 事件A ,我们称它为 事件(EVENT)~~而 地雷爆炸 则对应 事件B ,我们称他为 行为(ACTION)~~大家还可能考虑到,如果踩上地雷的不是人,而是质量很小的昆虫,则不可能发生爆炸,于是我们引入一个概念,就是 条件(CONDITON)~~它决定了 事件 发生后是不是会导致连带的结果,即 行为 的实施~~
一个触发分为三个状态:就绪状态、工作状态、屏蔽状态。其基本状态是 就绪状态。
就绪状态:处于就绪状态的触发可以接收其相应的 事件,只要 事件 发生,则此触发建立一个单独的进程进入工作状态,这个接收事件转入工作状态的过程称为 响应(RESPONSE)~~
工作状态:从就绪到工作,首先进行 条件(CONDITON)检测 ,如果通过就开始 行为的实施 ,从检测到实施完毕的整个过程为工作状态(无论是否通过检测)。需要注意的是,一个处于工作状态的触发是一个单独的进程~~一个触发可以同时或者异步响应 N次 。
屏蔽状态:处于屏蔽状态的触发不能 响应 任何事件,但是可以通过 调用行为 进行调用,调用后直接进入 工作状态。在调用的时候可以选择是否跳过 条件检测。
注]:同一个触发中的多个 事件 之间是 OR 关系,满足其中之一则触发响应;多个 条件 之间为 AND 关系,全部满足才通过检测;而多个 行为 的执行是按照顺序进行从上到下的处理。


Q:触发器的里各语句的位置有影响么/能换么?

不能换。Trigger 的执行顺序是从上到下依次执行的。
不过 Category 的先后顺序则无关紧要。


Q:玩家的初始金钱和木材在那里改?

在地图初始化的触发里选择 Set Property .就可以更改金钱和木材了。


Q:如何更改英雄取得经验的比例?

ACTION - HERO - HERO EXPERIENCE RATE,设成多少百分比看自己的情况决定咯。


Q:怎么去掉单位身上的那些默认按钮啊?~~比如攻击~~集结点什么什么的~~

通常用 UNIT - REMOVE ABILITY 可以用来去掉一些按钮~~
REMOVE UNKNOWN (Aatk) 可以去掉攻击~~
REMOVE UNKNOWN (Amov) 可以去掉移动/巡逻/停止~~
REMOVE UNKNOWN (Aral) 可以去掉集结点
…………


Q:Letterbox 和 Cinematic 有什么区别啊?似乎都是打开影片模式哦

Letterbox 不会改变可视度~~没有被探索的地方也同样不会显现~~Cinematic 反之~~


Q:怎么可以实现物品栏里每一个格子只能放一类物品,且同类道具只能放有一个呢?


这个问题会涉及到变量的使用还有 TRIGGER 。
首先你需要创建一个变量数组(VAR ARRAY),命名为 IF,类型为 布尔(BOOLEAN),容量为 7(因为下标是从0开始的,所以要对应6个道具栏一般就设置为7比较好操作)。
然后在 ITEM EDITOR 里面为不同类型的道具设定相同的等级,比如武器就是 L1,头盔就是 L2,等等。
最后就是写 TEIGGER 了:
E - 单位拣到道具
C -
A -
+暂时关闭此触发
+如果以道具等级为下标的变量 IF 值为假,则
- 把物品栏的第 N 格道具丢弃,N 的值为拣到的道具等级
- 把刚拣到的道具放到第 N 格
- 把刚才丢弃的道具放置到第 M 格,M 的的值为此道具等级
- 设置以道具等级为下标的变量 IF 值为真,则
+否则如果以道具等级为下标的变量 IF 值为真,则
- 丢弃这个被捡道具
+打开此触发
这个是捡道具的步骤,同样的你需要写一个丢弃道具的 TRIGGER ,内容就是将 以丢弃的道具等级为下标的 IF 设置为假。


Q:怎么做一个自动刷兵的效果呢?
一般是要定时刷新的~~所以EVENT用PERIODIC TIME EVENT(周期性时间事件)~~间隔时间自己决定~~
刷兵总得有个限制~~否则一直刷下去你打的完吗?所以在CONDITION中~~用INTEGER COMPRAISON - UNIT - COUNT UNIT IN UNIT GROUP(计算组内单位的数量,具体组的设定自己解决……)来比较你希望的一个数量~~如果小于这个数量~~则执行下面的 ACTIONS ~
出兵最简单~~ ACTION - UNIT - CREATE UNIT~~种类、所属自己选~~位置就放在你要刷的地方~~一般是你要求刷出兵的建筑附近~~
PS:以上就是最基本的刷兵了,至于其他的,例如什么时候开始刷,什么时候停止刷,EVENT自己决定吧,用ACTION - TRIGGER - TURN ON/OFF TRIGGER来开关触发器。
Q:在对战地图中,杀死对方的兵是不会获得金钱的,如何在战役中,可以获得金钱?
在 TRIGGER EDITOR 里面用 Player - Turn Player Flag ON/OFF 开启金钱奖励~~
在 UNIT EDITOR 里面用 Stats - Bounty Awarded - 来修改某杀死某单位后的金钱数量~~
Q:怎么才能设计一个简单的对话为主的动画呢?
首先打开剧场模式 ACTION - CINEMATIC - CINEMATIC MODE ON
然后用 ACTION - CINEMATIC - TRANSMISSION FROM UNIT 选择说话的单位、对话及时间等
完了别忘了关闭剧场模式 TURN CINEMATIC MODE OFF
PS:不开剧场模式一样可以使用TRANSMISSION FROM UNIT显示对话,要记得在初始化地图时打开普通场景下的字幕显示,ACTION - CINAMATIC - SUBTITLE DISPLAY OVERRIDE ON
Q:怎么才能设计出用 ESC 跳过的电影?
建议打开官方的地图学习咯~~
首先建立一个 BOOLEAN 变量 CIN_FLAG = FALSE ~~这个的作用是表示你是不是按下了 ESC 期望跳过~~
然后在你写的影片 TRIGGER 中~~每一句后面都增加一句 "如果 CIN_FALSE == TRUE 则 略过后面的 ACTIONS 且 调用 中断处理 TRIGGER" ~~也就是说~~如果记录是否跳过的变量表示为真~~则可以略过后面所有的 ACTIONS ~~
接着创建一个 TRIGGER ~~
EVENT - 按下 ESC 键
ACTIONS - SET CIN_FLAG = TRUE ~~这个就是让你在按下 ESC 后把变量表示为真~~这样就可以在上面的步骤中略过了~~
最后建立一个 TRIGGER 作为中断处理部分~~提供上面说道的那个调用~~内容就是影片结束后的状态~~比如什么单位最后在什么位置~~
Q:如何做选英雄的TRIGGER?
以下是最基本的英雄选择方法。
先做些准备工作,在地图上放一个选人用的小精灵,再在适当位置放上一个力量之环(CIRCLE OF POWER)作为标识,在上面放上待选英雄,然 后在力量之环所在位置画上一个区域(REGION)。
-建立TRIGGER-
EVENT - UNIT ENTER REGION REGION就选你建立的那个REGION
CONDITION - UNIT(TYPE) COMPARISON - ENTERING UNIT EQUAL TO 小精灵 条件判断,判断进入该区域的单位是不是小精灵(或者也可以用 UNIT TYPE COMPARISON来判断进入区域的单位类型是不是小精灵 UNIT TYPE OF ENTERING UNIT)
POSITION就用你希望出现在的地方(一般你应该建立一个REGION表示的起始点,就是这个啦)
然后KILL ENTERING UNIT(杀死进入的单位,你要的是英雄而不是小精灵,杀死前你可以HIDE UNIT以隐藏死亡动作,或者干脆REMOVE掉)
以上完成的就是最基本的选英雄的TRIGGER了,当然每多一个英雄你就得多做一个TRIGGER,并修改相应的CREATE UNIT的类型。对于那些只能选 一次英雄的方法嘛,只要在ACTION中加上TURN OFF THIS TRIGGER(关闭该触发)就可以了~~
Q:如何制作随机掉落物品?
很多人问刷出来的怪怎么掉宝,以下是一种简单的基本的方法。
EVENT 为 UNIT DIE 当然是要怪死了才掉宝的嘛
CONDITION 怎么说呢,一般来说RPG地图里只要是敌人都有机会掉宝,那就用PLAYER COMPARISON - OWNER OF DYING UNIT 来判断。
同时可以利用INTEGER COMPARISON - MATH - RANDOM NUMBER BETWEEN A TO B(A和B之间的随机数)是否等于(大于/小于)某值来做掉宝的几率。
ACTION 用 CREATE ITEM ,ITEM TYPE可以选RANDOM ITEM-TYPE,然后选择等级(0-10级,可以根据某些规则来决定掉的是几级的宝,具体自己考虑吧,-1表示所有等级的宝物) POSITION就是POSITION OF DYING UNIT(死亡单位的位置)
以上可以完成最简单的随机掉宝,具体大家可以慢慢考虑呵呵。



Q:SUBSTRING函数 有什么用啊?

SUBSTRING是截取字符用的~~如在下面一个赋值过程中:
Set StoreEquitDate[StoreEquitDateLOG] = (Substring(‘XXXXXXXX’), 1, 5)
(Substring(), 1, 5) 表示取字符串‘XXXXXXXX’中第1到第5位之间的字符串~~
Q:如何让开起后,起始位置不会出现主城和工人?

进入Trigger Editor,找到Melee Initialization,如果没改过的话应该如下:  
Melee Initialization


Events


......Map initialization


Actions


......Melee Game - Use melee time of day (for all players)


使一开始的时间是早上6:00(如果删掉就会从00:00开始)


......Melee Game - Limit Heroes to 1 per Hero-type (for all players) 让所有玩家不能生產重覆的英雄


......Melee Game - Give trained Heroes a Scroll of Town Portal (for all players) 让第一个生產出来的英雄有传送卷轴


......Melee Game - Set starting resources (for all players) 让所有玩家一开始有一定的Gold和Lumber


......Melee Game - Remove creeps and critters from used start locations (for all players) 如果某起始位置有玩家,就删除附近的Creep


......Melee Game - Create starting units (for all players) 產生主城和工人于玩家的起始位置
......Melee Game - Run melee AI s (for computer players) 让电脑玩家有AI


......Melee Game - Enforce victory/defeat conditions (for all players) 使用一般的胜利/失败设定(毁掉对方所有建筑者胜) 


将蓝色的那一条删掉即可  


Q:如何製作一个群体Sleep技能?

Sleep在製作时就被销定為单体技能,因此想这麼做不是AE或者MOD可以解决的,必须使用Trigger来帮忙。以下為可行方法的其中之一:  


1、将Sleep复製贴上,改名為Group Sleep - Sleep(举例,请自己决定一个适当的名字)。 把mana cost改為0、range改為99999(全地图)、改成单位技能(Is a hero ability = false)  


2、製作一单位Sleep Caster,model改成none、技能加入刚才做的Group Sleep - Sleep及Invulnerable (Netural)。  


3、将Sleep技能改名為Group Sleep  


4、写Trigger:  


Group Sleep Order


......Events


............Unit - A unit Is issued an order targeting an object


//当一个单位接收到一个指定物件的指令


......Conditions


............(Issued order) Equal to (Order(sleep))

//指令為sleep


......Actions


............Set GroupSleep_MajorTarget = (Target unit of issued order)


//将指令指定的单位存在GroupSleep_MajorTarget这个变数中 


Group Sleep


....Events


........Unit - A unit Starts the effect of an ability


//当一个单位使得一项技能开始生效
....Conditions
........(Ability being cast) Equal to Group Sleep
//使用的技能為Group Sleep
....Actions
........Unit Group - Pick every unit in (Units within 300.00 of (Position of GroupSleep_MajorTarget)) and do (Actions)
//选取GroupSleep_MajorTarget这个单位附近300范围的所有单位并执行Loop Action内的所有动作
...........Loop - Actions
................Unit - Create 1 Sleep Caster for (Owner of (Triggering unit)) at (Position of (Triggering unit)) facing 0.00 degrees     
//產生一个单位于施法者(触发的单位)旁边,设定所有者為拥有施法者的玩家
................Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
//设定刚刚產生的单位生命时间為2.00(长度自己决定,足够施放AMS即可) ................Unit - Order (Last created unit) to Undead Dreadlord - Sleep (Picked unit)


//命令刚刚產生的单位对选到的单位使用自身技能中Order為sleep的技能   这样就能做出一个范围300的群体催眠术咯!

Q:假设在一张 RPG 地图中, 给每一位玩家一个工人, 让玩家选英雄
Event
.....Unit - A unit enters
Action
......Unit - Create 1 for Trigging Player at center of
facing ......  
为什麼单位进入该Region时没有反应?  
设定错误。由于引发事件的是单位,而不是玩家,所以 Trigging Player 无法表明到底是哪一个玩家。正确的设定方式如下:  
Event


......Unit - A unit enters


Action


......Unit - Create 1 for (Owner of (Trigging Unit)) at center of facing ......    


Q:请问如何加入随机效果?  

在设定Trigger时,用If/Then/Else做设定,例如:  


PaladinSkill:


Events


......Unit - A unit Is attacked


//一个单位遭受攻击


Conditions


......(Unit-type of (Attacking unit)) Equal to Paladin


//攻击者為Paladin Actions


......If (All Conditions are True) then do (Then Actions) else do (Else Actions)


............If - Conditions


..................(Random integer number between 1 and 10) Equal to 1


//如果1-10中随机选到的数字為1


............Then - Actions


..................Unit - Kill (Triggering unit)



------1/10


//杀死引起触发的单位(遭受攻击的单位,用Attacked Unit也可以)
............Else - Actions


..................If (All Conditions are True) then do (Then Actions) else do


(Else Actions) ------9/10


........................If - Conditions


..............................(Random integer number between 1 and 9) Equal to 1


//如果1-9中随机选到的数字為1


........................Then - Actions


..............................Unit - Set life of (Triggering unit) to ((Life of (Triggering unit)) / 2.00) -----1/9*9/10= 1/10


//将引起触发的单位生命值设為(触发单位生命值 / 2.00)
........................Else - Actions    
 
这么一来,当Paladin攻击敌人时,就会有1/10的机会瞬间杀死对方,1/10的机会使目标的生命值减半。其他的依此类推。这是目前最简单有效的方法,更好的方法大概只能用JASS写了。


Q:如何获得一个技能的目标点?  

用 TARGET POINT OF ABILITY BEING CAST 就能取到。
Q:我想用 play 某个单位的 walk animation 来让该单位在原地跑,结果进入一看不行,这个动作不是持续的,请问我该怎么办?  

用 Jass :


call SetUnitAnimationByIndex( UnitId, AnimationIndex)


用这个可以让单位一直保持某个动作的状态不变。


但是并不是所有动作都能被保持的


E:简单地说一下 GAME CACHE 的使用

GAME CACHE ~~字面意思就是 缓存 ~~用于开辟一个内存空间来保存用户希望 保留 的数据(最后需要将 CACHE 保存到 硬盘上)~~
主要作用是将 地图A 的一些数据保留到 地图B 中~~比如战役中英雄的等级或者道具技能什么什么的~~


GAME CACHE 是用 TRIGGER EDITOR 来操作的~~下面说说相关 ACTIONS 的含义~


1]创建一个缓存~~想要使用缓存~~当然要先创建啦~~
Game Cache - Create a game cache from MapName.w3v
这就是一个创建 CACHE 语句~~后面的 MapName.w3v 是你创建的 CACHE 的名字~~:)~~


2]创建以后~~就可以用他来保存资料了~~
Game Cache - Store Unit as Lable of Category in (Last created game cache)
这是一个 保存单位 的语句~~在 Unit 处选好需要保存的单位~~填写好 标识(Lable) 和 分类(Category) ~~最后 选择将 单位保存到 哪个 CACHE 里面~~其中 标识 和 分类是可以随意填写的~~:)~~


类似的~~还有下面一些类型的数据可以保存到 CACHE 里面~~使用方法同上!
Game Cache - Store Real as Lable of Category in (Last created game cache)
Game Cache - Store Integer as Lable of Category in (Last created game cache)
Game Cache - Store Boolean as Lable of Category in (Last created game cache)
Game Cache - Store String as Lable of Category in (Last created game cache)


(UNIT:单位 / REAL:实数 / INTEGER:整数 / BOOLEAN:布尔 / STRING:字符串)


保存玩需要的数据后不要忘记保存 CACHE 本身~~
Game Cache - Save (Last created game cache)


上面说的是保存数据~~但是怎么取出数据呢?~~
首先在任何可以使用 你想取出的数据类型 的地方都可以通过 GAME CACHE - LOAD XXXXXX CALUE 来取出数据~~


另外~~
Game Cache - Restore lable of Category from (Last created game cache) for Player 1 (Red) at (Center of (Playable map area)) facing 0.00
Game Cache - Restore lable of Category from (Last created game cache) for Player 1 (Red) at (Center of (Playable map area)) facing (Position of (Triggering unit))
这个语句是专门用于 取出一个被保存的单位且放置在地图上的~~


最后~~如果想清除 CACHE 中的数据可以使用下面两个语句~~
Game Cache - Clear (Last created game cache)
清除所有数据~~
Game Cache - Clear all labels of Category in (Last created game cache)
清除某一类的数据~~


Q:嗯,如何动态改变中立商店/酒馆里卖的东西呢?

Neutral Building - Add 物品/单位 to (商店/酒馆) with 初始存货数 in stock and a max stock of 最大存货数


把贩售物存入一个数组,用trigger随机生成数组索引,可以做到真正的”人流不息“的酒馆。又如根据玩家进行的状态,如获得的物品,在商店生成同等级的物品(TM中间的市场一样)等~
记得商店/酒馆必须有相关的贩售技能(废话-_-)


Q:如何让一个召唤生物不能被选中但能被攻击呢?

给一个单位添加 "Aloc" 技能, 就可以使它不能被选取, 就好象不死小强的终极技能Locust swarm召唤出的小小小飞强一样~~
但是, 这个单位也同时失去了碰撞大小, 就是任何人都摸不到他拉, (像鬼魂般穿身而过). 这时配合"Chaos"就可完美解决!
做两个相同的单位, 一个为真身, 一个为替身. 再自定一个Chaos技能, Data New Unit Type填单位的真身
把"Aloc", 自定的"Chaos"添加给她, 这时候Chaos立即起作用, 替身单位变为真身, Aloc的"不被选取"作用保留, 而该单位也可同时承受攻击了!
比如你想做召唤单位, Actions就是


Custom : call UnitAddAbilityBJ( 'Aloc', GetSummonedUnit() )
Custom : call UnitAddAbilityBJ( 'S001', GetSummonedUnit() )
('S001'是你自定chaos技能的代码)

就这么简单!
这个"Aloc" + "Chaos"的组合是wc3c的一位mapper发现的, 用在雇佣兵上真是妙! 不用单心混战中错点到他们了~~

Q:如何让自定义英雄和普通英雄一样有建造限制呢?

首先,在平衡常数中将您的自定义英雄添加到“科技 - 等价物 - 英雄”列表里面去,这样的话就能保证每升一级主基地只能造一个了。
然后还要添加一条 Trigger :
Player - Limit training of xxx to 1 for Player n (其中“ xxx ”为该自定义英雄的单位类型)
这样您的英雄就只能造一个了
Q:如何让死掉的树复活呢?
很简单的,用 Destructible - Resurrect 即可。
以上就是我们关于触发器和一些其他问题的一些介绍,所以我们在面对这些设置的时候首先就需要把以上的这些问题搞明白,这样对症下药的话我想鞥狗给大家节省很多时间,当然一些额问题出现得比较特殊,所以我们还需要把那些比较特殊的问题也记录一下。之后我们对触发器的设置就有更多的解决办法,当然还有jass的一些问题我们也可以在以上找到将解决的办法。
栏目列表