在介绍这个问题之前我们首先给大家介绍一下关于各个问题之中的基础,让我们在进行这些设置的时候能够对症下药。之后我们在进行设置的时候就能够找到对应的那些问题,这样我们才能够在问题出现的时候找到根源,所以大家就不要觉得我们说的有点麻烦,毕竟这方面的相关信息我们必须要知道得越详细越好。虽然内容有点多不过我想介绍得详细一些对大家帮助更大,所以接下来大家可以往下看了其中的内容应该对大家有帮助。
Q:什么是触发?(Trigger),是如何工作的?
触发(Trigger)-根据字面意思可以理解为:事件A发生后会直接或者间接的导致事件B发生的过程~~
关于触发的工作原理,举例如下:
动物踩上地雷,地雷就BOOMMMMMMM!:)~~
以上这就是一个触发,踩地雷是事件A我们称它为事件(EVENT)~~而地雷爆炸则对应事件B,我们称他为行为(ACTION)~~大家还可能考虑到,如果踩上地雷的不是人,而是质量很小的昆虫,则不可能发生爆炸,于是我们引入一个概念,就是条件(CONDITON)~~它决定了事件发生后是不是会导致连带的结果,即行为的实施~~
一个触发分为三个状态:就绪状态、工作状态、屏蔽状态。其基本状态是就绪状态。
就绪状态:处于就绪状态的触发可以接收其相应的事件,只要事件发生,则此触发建立一个单独的进程进入工作状态,这个接收事件转入工作状态的过程称为响应(RESPONSE)~~
工作状态:从就绪到工作,首先进行条件(CONDITON)检测,如果通过就开始行为的实施,从检测到实施完毕的整个过程为工作状态(无论是否通过检测)。需要注意的是,一个处于工作状态的触发是一个单独的进程~~一个触发可以同时或者异步响应N次。
屏蔽状态:处于屏蔽状态的触发不能响应任何事件,但是可以通过调用行为进行调用,调用后直接进入工作状态。在调用的时候可以选择是否跳过条件检测。
注]:同一个触发中的多个事件之间是OR关系,满足其中之一则触发响应;多个条件之间为AND关系,全部满足才通过检测;而多个行为的执行是按照顺序进行从上到下的处理。
Q:触发器的里各语句的位置有影响么/能换么?
不能换。Trigger的执行顺序是从上到下依次执行的。
不过Category的先后顺序则无关紧要。
Q:玩家的初始金钱和木材在那里改?
在地图初始化的触发里选择SetProperty.就可以更改金钱和木材了。
Q:如何更改英雄取得经验的比例?
ACTION-HERO-HEROEXPERIENCERATE,设成多少百分比看自己的情况决定咯。
Q:怎么去掉单位身上的那些默认按钮啊?~~比如攻击~~集结点什么什么的~~
通常用UNIT-REMOVEABILITY可以用来去掉一些按钮~~
REMOVEUNKNOWN(Aatk)可以去掉攻击~~
REMOVEUNKNOWN(Amov)可以去掉移动/巡逻/停止~~
REMOVEUNKNOWN(Aral)可以去掉集结点
…………
Q:Letterbox和Cinematic有什么区别啊?似乎都是打开影片模式哦
Letterbox不会改变可视度~~没有被探索的地方也同样不会显现~~Cinematic反之~~
Q:怎么可以实现物品栏里每一个格子只能放一类物品,且同类道具只能放有一个呢?
这个问题会涉及到变量的使用还有TRIGGER。
首先你需要创建一个变量数组(VARARRAY),命名为IF,类型为布尔(BOOLEAN),容量为7(因为下标是从0开始的,所以要对应6个道具栏一般就设置为7比较好操作)。
然后在ITEMEDITOR里面为不同类型的道具设定相同的等级,比如武器就是L1,头盔就是L2,等等。
最后就是写TEIGGER了:
E-单位拣到道具
C-
A-
+暂时关闭此触发
+如果以道具等级为下标的变量IF值为假,则
-把物品栏的第N格道具丢弃,N的值为拣到的道具等级
-把刚拣到的道具放到第N格
-把刚才丢弃的道具放置到第M格,M的的值为此道具等级
-设置以道具等级为下标的变量IF值为真,则
+否则如果以道具等级为下标的变量IF值为真,则
-丢弃这个被捡道具
+打开此触发
这个是捡道具的步骤,同样的你需要写一个丢弃道具的TRIGGER,内容就是将以丢弃的道具等级为下标的IF设置为假。
Q:怎么做一个自动刷兵的效果呢?
一般是要定时刷新的~~所以EVENT用PERIODICTIMEEVENT(周期性时间事件)~~间隔时间自己决定~~
刷兵总得有个限制~~否则一直刷下去你打的完吗?所以在CONDITION中~~用INTEGERCOMPRAISON-UNIT-COUNTUNITINUNITGROUP(计算组内单位的数量,具体组的设定自己解决……)来比较你希望的一个数量~~如果小于这个数量~~则执行下面的ACTIONS~
出兵最简单~~ACTION-UNIT-CREATEUNIT~~种类、所属自己选~~位置就放在你要刷的地方~~一般是你要求刷出兵的建筑附近~~
PS:以上就是最基本的刷兵了,至于其他的,例如什么时候开始刷,什么时候停止刷,EVENT自己决定吧,用ACTION-TRIGGER-TURNON/OFFTRIGGER来开关触发器。
Q:在对战地图中,杀死对方的兵是不会获得金钱的,如何在战役中,可以获得金钱?
在TRIGGEREDITOR里面用Player-TurnPlayerFlagON/OFF开启金钱奖励~~
在UNITEDITOR里面用Stats-BountyAwarded-来修改某杀死某单位后的金钱数量~~
Q:怎么才能设计一个简单的对话为主的动画呢?
首先打开剧场模式ACTION-CINEMATIC-CINEMATICMODEON
然后用ACTION-CINEMATIC-TRANSMISSIONFROMUNIT选择说话的单位、对话及时间等
完了别忘了关闭剧场模式TURNCINEMATICMODEOFF
PS:不开剧场模式一样可以使用TRANSMISSIONFROMUNIT显示对话,要记得在初始化地图时打开普通场景下的字幕显示,ACTION-CINAMATIC-SUBTITLEDISPLAYOVERRIDEON
Q:怎么才能设计出用ESC跳过的电影?
建议打开官方的地图学习咯~~
首先建立一个BOOLEAN变量CIN_FLAG=FALSE~~这个的作用是表示你是不是按下了ESC期望跳过~~
然后在你写的影片TRIGGER中~~每一句后面都增加一句"如果CIN_FALSE==TRUE则略过后面的ACTIONS且调用中断处理TRIGGER"~~也就是说~~如果记录是否跳过的变量表示为真~~则可以略过后面所有的ACTIONS~~
接着创建一个TRIGGER~~
EVENT-按下ESC键
ACTIONS-SETCIN_FLAG=TRUE~~这个就是让你在按下ESC后把变量表示为真~~这样就可以在上面的步骤中略过了~~
最后建立一个TRIGGER作为中断处理部分~~提供上面说道的那个调用~~内容就是影片结束后的状态~~比如什么单位最后在什么位置~~
Q:如何做选英雄的TRIGGER?
以下是最基本的英雄选择方法。
先做些准备工作,在地图上放一个选人用的小精灵,再在适当位置放上一个力量之环(CIRCLEOFPOWER)作为标识,在上面放上待选英雄,然后在力量之环所在位置画上一个区域(REGION)。
-建立TRIGGER-
EVENT-UNITENTERREGIONREGION就选你建立的那个REGION
CONDITION-UNIT(TYPE)COMPARISON-ENTERINGUNITEQUALTO小精灵条件判断,判断进入该区域的单位是不是小精灵(或者也可以用UNITTYPECOMPARISON来判断进入区域的单位类型是不是小精灵UNITTYPEOFENTERINGUNIT)
POSITION就用你希望出现在的地方(一般你应该建立一个REGION表示的起始点,就是这个啦)
然后KILLENTERINGUNIT(杀死进入的单位,你要的是英雄而不是小精灵,杀死前你可以HIDEUNIT以隐藏死亡动作,或者干脆REMOVE掉)
以上完成的就是最基本的选英雄的TRIGGER了,当然每多一个英雄你就得多做一个TRIGGER,并修改相应的CREATEUNIT的类型。对于那些只能选一次英雄的方法嘛,只要在ACTION中加上TURNOFFTHISTRIGGER(关闭该触发)就可以了~~
Q:如何制作随机掉落物品?
很多人问刷出来的怪怎么掉宝,以下是一种简单的基本的方法。
EVENT为UNITDIE当然是要怪死了才掉宝的嘛
CONDITION怎么说呢,一般来说RPG地图里只要是敌人都有机会掉宝,那就用PLAYERCOMPARISON-OWNEROFDYINGUNIT来判断。
同时可以利用INTEGERCOMPARISON-MATH-RANDOMNUMBERBETWEENATOB(A和B之间的随机数)是否等于(大于/小于)某值来做掉宝的几率。
ACTION用CREATEITEM,ITEMTYPE可以选RANDOMITEM-TYPE,然后选择等级(0-10级,可以根据某些规则来决定掉的是几级的宝,具体自己考虑吧,-1表示所有等级的宝物)POSITION就是POSITIONOFDYINGUNIT(死亡单位的位置)
以上可以完成最简单的随机掉宝,具体大家可以慢慢考虑呵呵。
Q:SUBSTRING函数有什么用啊?
SUBSTRING是截取字符用的~~如在下面一个赋值过程中:
SetStoreEquitDate[StoreEquitDateLOG]=(Substring(‘XXXXXXXX’)15)
(Substring()15)表示取字符串‘XXXXXXXX’中第1到第5位之间的字符串~~
Q:如何让开起后,起始位置不会出现主城和工人?
进入TriggerEditor,找到MeleeInitialization,如果没改过的话应该如下:
MeleeInitialization
Events
......Mapinitialization
Actions
......MeleeGame-Usemeleetimeofday(forallplayers)
使一开始的时间是早上6:00(如果删掉就会从00:00开始)
......MeleeGame-LimitHeroesto1perHero-type(forallplayers)让所有玩家不能生產重覆的英雄
......MeleeGame-GivetrainedHeroesaScrollofTownPortal(forallplayers)让第一个生產出来的英雄有传送卷轴
......MeleeGame-Setstartingresources(forallplayers)让所有玩家一开始有一定的Gold和Lumber
......MeleeGame-Removecreepsandcrittersfromusedstartlocations(forallplayers)如果某起始位置有玩家,就删除附近的Creep
......MeleeGame-Createstartingunits(forallplayers)產生主城和工人于玩家的起始位置
......MeleeGame-RunmeleeAIs(forcomputerplayers)让电脑玩家有AI
......MeleeGame-Enforcevictory/defeatconditions(forallplayers)使用一般的胜利/失败设定(毁掉对方所有建筑者胜)
将蓝色的那一条删掉即可
Q:如何製作一个群体Sleep技能?
Sleep在製作时就被销定為单体技能,因此想这麼做不是AE或者MOD可以解决的,必须使用Trigger来帮忙。以下為可行方法的其中之一:
1、将Sleep复製贴上,改名為GroupSleep-Sleep(举例,请自己决定一个适当的名字)。把manacost改為0、range改為99999(全地图)、改成单位技能(Isaheroability=false)
2、製作一单位SleepCaster,model改成none、技能加入刚才做的GroupSleep-Sleep及Invulnerable(Netural)。
3、将Sleep技能改名為GroupSleep
4、写Trigger:
GroupSleepOrder
......Events
............Unit-AunitIsissuedanordertargetinganobject
//当一个单位接收到一个指定物件的指令
......Conditions
............(Issuedorder)Equalto(Order(sleep))
//指令為sleep
......Actions
............SetGroupSleep_MajorTarget=(Targetunitofissuedorder)
//将指令指定的单位存在GroupSleep_MajorTarget这个变数中
GroupSleep
....Events
........Unit-AunitStartstheeffectofanability
//当一个单位使得一项技能开始生效
....Conditions
........(Abilitybeingcast)EqualtoGroupSleep
//使用的技能為GroupSleep
....Actions
........UnitGroup-Pickeveryunitin(Unitswithin300.00of(PositionofGroupSleep_MajorTarget))anddo(Actions)
//选取GroupSleep_MajorTarget这个单位附近300范围的所有单位并执行LoopAction内的所有动作
...........Loop-Actions
................Unit-Create1SleepCasterfor(Ownerof(Triggeringunit))at(Positionof(Triggeringunit))facing0.00degrees
//產生一个单位于施法者(触发的单位)旁边,设定所有者為拥有施法者的玩家
................Unit-Adda2.00secondGenericexpirationtimerto(Lastcreatedunit)
//设定刚刚產生的单位生命时间為2.00(长度自己决定,足够施放AMS即可)................Unit-Order(Lastcreatedunit)toUndeadDreadlord-Sleep(Pickedunit)
//命令刚刚產生的单位对选到的单位使用自身技能中Order為sleep的技能 这样就能做出一个范围300的群体催眠术咯!
Q:假设在一张RPG地图中给每一位玩家一个工人让玩家选英雄
Event
.....Unit-Aunitenters
Action
......Unit-Create1forTriggingPlayeratcenterof
facing......
为什麼单位进入该Region时没有反应?
设定错误。由于引发事件的是单位,而不是玩家,所以TriggingPlayer无法表明到底是哪一个玩家。正确的设定方式如下:
Event
......Unit-Aunitenters
Action
......Unit-Create1for(Ownerof(TriggingUnit))atcenteroffacing......
Q:请问如何加入随机效果?
在设定Trigger时,用If/Then/Else做设定,例如:
PaladinSkill:
Events
......Unit-AunitIsattacked
//一个单位遭受攻击
Conditions
......(Unit-typeof(Attackingunit))EqualtoPaladin
//攻击者為PaladinActions
......If(AllConditionsareTrue)thendo(ThenActions)elsedo(ElseActions)
............If-Conditions
..................(Randomintegernumberbetween1and10)Equalto1
//如果1-10中随机选到的数字為1
............Then-Actions
..................Unit-Kill(Triggeringunit)
------1/10
//杀死引起触发的单位(遭受攻击的单位,用AttackedUnit也可以)
............Else-Actions
..................If(AllConditionsareTrue)thendo(ThenActions)elsedo
(ElseActions)------9/10
........................If-Conditions
..............................(Randomintegernumberbetween1and9)Equalto1
//如果1-9中随机选到的数字為1
........................Then-Actions
..............................Unit-Setlifeof(Triggeringunit)to((Lifeof(Triggeringunit))/2.00)-----1/9*9/10=1/10
//将引起触发的单位生命值设為(触发单位生命值/2.00)
........................Else-Actions
这么一来,当Paladin攻击敌人时,就会有1/10的机会瞬间杀死对方,1/10的机会使目标的生命值减半。其他的依此类推。这是目前最简单有效的方法,更好的方法大概只能用JASS写了。
Q:如何获得一个技能的目标点?
用TARGETPOINTOFABILITYBEINGCAST就能取到。
Q:我想用play某个单位的walkanimation来让该单位在原地跑,结果进入一看不行,这个动作不是持续的,请问我该怎么办?
用Jass:
callSetUnitAnimationByIndex(UnitIdAnimationIndex)
用这个可以让单位一直保持某个动作的状态不变。
但是并不是所有动作都能被保持的
E:简单地说一下GAMECACHE的使用
GAMECACHE~~字面意思就是缓存~~用于开辟一个内存空间来保存用户希望保留的数据(最后需要将CACHE保存到硬盘上)~~
主要作用是将地图A的一些数据保留到地图B中~~比如战役中英雄的等级或者道具技能什么什么的~~
GAMECACHE是用TRIGGEREDITOR来操作的~~下面说说相关ACTIONS的含义~
1]创建一个缓存~~想要使用缓存~~当然要先创建啦~~
GameCache-CreateagamecachefromMapName.w3v
这就是一个创建CACHE语句~~后面的MapName.w3v是你创建的CACHE的名字~~:)~~
2]创建以后~~就可以用他来保存资料了~~
GameCache-StoreUnitasLableofCategoryin(Lastcreatedgamecache)
这是一个保存单位的语句~~在Unit处选好需要保存的单位~~填写好标识(Lable)和分类(Category)~~最后选择将单位保存到哪个CACHE里面~~其中标识和分类是可以随意填写的~~:)~~
类似的~~还有下面一些类型的数据可以保存到CACHE里面~~使用方法同上!
GameCache-StoreRealasLableofCategoryin(Lastcreatedgamecache)
GameCache-StoreIntegerasLableofCategoryin(Lastcreatedgamecache)
GameCache-StoreBooleanasLableofCategoryin(Lastcreatedgamecache)
GameCache-StoreStringasLableofCategoryin(Lastcreatedgamecache)
(UNIT:单位/REAL:实数/INTEGER:整数/BOOLEAN:布尔/STRING:字符串)
保存玩需要的数据后不要忘记保存CACHE本身~~
GameCache-Save(Lastcreatedgamecache)
上面说的是保存数据~~但是怎么取出数据呢?~~
首先在任何可以使用你想取出的数据类型的地方都可以通过GAMECACHE-LOADXXXXXXCALUE来取出数据~~
另外~~
GameCache-RestorelableofCategoryfrom(Lastcreatedgamecache)forPlayer1(Red)at(Centerof(Playablemaparea))facing0.00
GameCache-RestorelableofCategoryfrom(Lastcreatedgamecache)forPlayer1(Red)at(Centerof(Playablemaparea))facing(Positionof(Triggeringunit))
这个语句是专门用于取出一个被保存的单位且放置在地图上的~~
最后~~如果想清除CACHE中的数据可以使用下面两个语句~~
GameCache-Clear(Lastcreatedgamecache)
清除所有数据~~
GameCache-ClearalllabelsofCategoryin(Lastcreatedgamecache)
清除某一类的数据~~
Q:嗯,如何动态改变中立商店/酒馆里卖的东西呢?
NeutralBuilding-Add物品/单位to(商店/酒馆)with初始存货数instockandamaxstockof最大存货数
把贩售物存入一个数组,用trigger随机生成数组索引,可以做到真正的”人流不息“的酒馆。又如根据玩家进行的状态,如获得的物品,在商店生成同等级的物品(TM中间的市场一样)等~
记得商店/酒馆必须有相关的贩售技能(废话-_-)
Q:如何让一个召唤生物不能被选中但能被攻击呢?
给一个单位添加"Aloc"技能就可以使它不能被选取就好象不死小强的终极技能Locustswarm召唤出的小小猩强一样~~
但是这个单位也同时失去了碰撞大小就是任何人都摸不到他拉(像鬼魂般穿身而过).这时配合"Chaos"就可完美解决!
做两个相同的单位一个为真身一个为替身.再自定一个Chaos技能DataNewUnitType填单位的真身
把"Aloc"自定的"Chaos"添加给她这时候Chaos立即起作用替身单位变为真身Aloc的"不被选取"作用保留而该单位也可同时承受攻击了!
比如你想做召唤单位Actions就是
Custom:callUnitAddAbilityBJ('Aloc'GetSummonedUnit())
Custom:callUnitAddAbilityBJ('S001'GetSummonedUnit())
('S001'是你自定chaos技能的代码)
就这么简单!
这个"Aloc"+"Chaos"的组合是wc3c的一位mapper发现的用在雇佣兵上真是妙!不用单心混战中错点到他们了~~
Q:如何让自定义英雄和普通英雄一样有建造限制呢?
首先,在平衡常数中将您的自定义英雄添加到“科技-等价物-英雄”列表里面去,这样的话就能保证每升一级主基地只能造一个了。
然后还要添加一条Trigger:
Player-Limittrainingofxxxto1forPlayern(其中“xxx”为该自定义英雄的单位类型)
这样您的英雄就只能造一个了
Q:如何让死掉的树复活呢?
很简单的,用Destructible-Resurrect即可。
以上就是我们关于触发器和一些其他问题的一些介绍,所以我们在面对这些设置的时候首先就需要把以上的这些问题搞明白,这样对症下药的话我想鞥狗给大家节省很多时间,当然一些额问题出现得比较特殊,所以我们还需要把那些比较特殊的问题也记录一下。之后我们对触发器的设置就有更多的解决办法,当然还有jass的一些问题我们也可以在以上找到将解决的办法。
Q:什么是触发?(Trigger),是如何工作的?
触发(Trigger)-根据字面意思可以理解为:事件A发生后会直接或者间接的导致事件B发生的过程~~
关于触发的工作原理,举例如下:
动物踩上地雷,地雷就BOOMMMMMMM!:)~~
以上这就是一个触发,踩地雷是事件A我们称它为事件(EVENT)~~而地雷爆炸则对应事件B,我们称他为行为(ACTION)~~大家还可能考虑到,如果踩上地雷的不是人,而是质量很小的昆虫,则不可能发生爆炸,于是我们引入一个概念,就是条件(CONDITON)~~它决定了事件发生后是不是会导致连带的结果,即行为的实施~~
一个触发分为三个状态:就绪状态、工作状态、屏蔽状态。其基本状态是就绪状态。
就绪状态:处于就绪状态的触发可以接收其相应的事件,只要事件发生,则此触发建立一个单独的进程进入工作状态,这个接收事件转入工作状态的过程称为响应(RESPONSE)~~
工作状态:从就绪到工作,首先进行条件(CONDITON)检测,如果通过就开始行为的实施,从检测到实施完毕的整个过程为工作状态(无论是否通过检测)。需要注意的是,一个处于工作状态的触发是一个单独的进程~~一个触发可以同时或者异步响应N次。
屏蔽状态:处于屏蔽状态的触发不能响应任何事件,但是可以通过调用行为进行调用,调用后直接进入工作状态。在调用的时候可以选择是否跳过条件检测。
注]:同一个触发中的多个事件之间是OR关系,满足其中之一则触发响应;多个条件之间为AND关系,全部满足才通过检测;而多个行为的执行是按照顺序进行从上到下的处理。
Q:触发器的里各语句的位置有影响么/能换么?
不能换。Trigger的执行顺序是从上到下依次执行的。
不过Category的先后顺序则无关紧要。
Q:玩家的初始金钱和木材在那里改?
在地图初始化的触发里选择SetProperty.就可以更改金钱和木材了。
Q:如何更改英雄取得经验的比例?
ACTION-HERO-HEROEXPERIENCERATE,设成多少百分比看自己的情况决定咯。
Q:怎么去掉单位身上的那些默认按钮啊?~~比如攻击~~集结点什么什么的~~
通常用UNIT-REMOVEABILITY可以用来去掉一些按钮~~
REMOVEUNKNOWN(Aatk)可以去掉攻击~~
REMOVEUNKNOWN(Amov)可以去掉移动/巡逻/停止~~
REMOVEUNKNOWN(Aral)可以去掉集结点
…………
Q:Letterbox和Cinematic有什么区别啊?似乎都是打开影片模式哦
Letterbox不会改变可视度~~没有被探索的地方也同样不会显现~~Cinematic反之~~
Q:怎么可以实现物品栏里每一个格子只能放一类物品,且同类道具只能放有一个呢?
这个问题会涉及到变量的使用还有TRIGGER。
首先你需要创建一个变量数组(VARARRAY),命名为IF,类型为布尔(BOOLEAN),容量为7(因为下标是从0开始的,所以要对应6个道具栏一般就设置为7比较好操作)。
然后在ITEMEDITOR里面为不同类型的道具设定相同的等级,比如武器就是L1,头盔就是L2,等等。
最后就是写TEIGGER了:
E-单位拣到道具
C-
A-
+暂时关闭此触发
+如果以道具等级为下标的变量IF值为假,则
-把物品栏的第N格道具丢弃,N的值为拣到的道具等级
-把刚拣到的道具放到第N格
-把刚才丢弃的道具放置到第M格,M的的值为此道具等级
-设置以道具等级为下标的变量IF值为真,则
+否则如果以道具等级为下标的变量IF值为真,则
-丢弃这个被捡道具
+打开此触发
这个是捡道具的步骤,同样的你需要写一个丢弃道具的TRIGGER,内容就是将以丢弃的道具等级为下标的IF设置为假。
Q:怎么做一个自动刷兵的效果呢?
一般是要定时刷新的~~所以EVENT用PERIODICTIMEEVENT(周期性时间事件)~~间隔时间自己决定~~
刷兵总得有个限制~~否则一直刷下去你打的完吗?所以在CONDITION中~~用INTEGERCOMPRAISON-UNIT-COUNTUNITINUNITGROUP(计算组内单位的数量,具体组的设定自己解决……)来比较你希望的一个数量~~如果小于这个数量~~则执行下面的ACTIONS~
出兵最简单~~ACTION-UNIT-CREATEUNIT~~种类、所属自己选~~位置就放在你要刷的地方~~一般是你要求刷出兵的建筑附近~~
PS:以上就是最基本的刷兵了,至于其他的,例如什么时候开始刷,什么时候停止刷,EVENT自己决定吧,用ACTION-TRIGGER-TURNON/OFFTRIGGER来开关触发器。
Q:在对战地图中,杀死对方的兵是不会获得金钱的,如何在战役中,可以获得金钱?
在TRIGGEREDITOR里面用Player-TurnPlayerFlagON/OFF开启金钱奖励~~
在UNITEDITOR里面用Stats-BountyAwarded-来修改某杀死某单位后的金钱数量~~
Q:怎么才能设计一个简单的对话为主的动画呢?
首先打开剧场模式ACTION-CINEMATIC-CINEMATICMODEON
然后用ACTION-CINEMATIC-TRANSMISSIONFROMUNIT选择说话的单位、对话及时间等
完了别忘了关闭剧场模式TURNCINEMATICMODEOFF
PS:不开剧场模式一样可以使用TRANSMISSIONFROMUNIT显示对话,要记得在初始化地图时打开普通场景下的字幕显示,ACTION-CINAMATIC-SUBTITLEDISPLAYOVERRIDEON
Q:怎么才能设计出用ESC跳过的电影?
建议打开官方的地图学习咯~~
首先建立一个BOOLEAN变量CIN_FLAG=FALSE~~这个的作用是表示你是不是按下了ESC期望跳过~~
然后在你写的影片TRIGGER中~~每一句后面都增加一句"如果CIN_FALSE==TRUE则略过后面的ACTIONS且调用中断处理TRIGGER"~~也就是说~~如果记录是否跳过的变量表示为真~~则可以略过后面所有的ACTIONS~~
接着创建一个TRIGGER~~
EVENT-按下ESC键
ACTIONS-SETCIN_FLAG=TRUE~~这个就是让你在按下ESC后把变量表示为真~~这样就可以在上面的步骤中略过了~~
最后建立一个TRIGGER作为中断处理部分~~提供上面说道的那个调用~~内容就是影片结束后的状态~~比如什么单位最后在什么位置~~
Q:如何做选英雄的TRIGGER?
以下是最基本的英雄选择方法。
先做些准备工作,在地图上放一个选人用的小精灵,再在适当位置放上一个力量之环(CIRCLEOFPOWER)作为标识,在上面放上待选英雄,然后在力量之环所在位置画上一个区域(REGION)。
-建立TRIGGER-
EVENT-UNITENTERREGIONREGION就选你建立的那个REGION
CONDITION-UNIT(TYPE)COMPARISON-ENTERINGUNITEQUALTO小精灵条件判断,判断进入该区域的单位是不是小精灵(或者也可以用UNITTYPECOMPARISON来判断进入区域的单位类型是不是小精灵UNITTYPEOFENTERINGUNIT)
POSITION就用你希望出现在的地方(一般你应该建立一个REGION表示的起始点,就是这个啦)
然后KILLENTERINGUNIT(杀死进入的单位,你要的是英雄而不是小精灵,杀死前你可以HIDEUNIT以隐藏死亡动作,或者干脆REMOVE掉)
以上完成的就是最基本的选英雄的TRIGGER了,当然每多一个英雄你就得多做一个TRIGGER,并修改相应的CREATEUNIT的类型。对于那些只能选一次英雄的方法嘛,只要在ACTION中加上TURNOFFTHISTRIGGER(关闭该触发)就可以了~~
Q:如何制作随机掉落物品?
很多人问刷出来的怪怎么掉宝,以下是一种简单的基本的方法。
EVENT为UNITDIE当然是要怪死了才掉宝的嘛
CONDITION怎么说呢,一般来说RPG地图里只要是敌人都有机会掉宝,那就用PLAYERCOMPARISON-OWNEROFDYINGUNIT来判断。
同时可以利用INTEGERCOMPARISON-MATH-RANDOMNUMBERBETWEENATOB(A和B之间的随机数)是否等于(大于/小于)某值来做掉宝的几率。
ACTION用CREATEITEM,ITEMTYPE可以选RANDOMITEM-TYPE,然后选择等级(0-10级,可以根据某些规则来决定掉的是几级的宝,具体自己考虑吧,-1表示所有等级的宝物)POSITION就是POSITIONOFDYINGUNIT(死亡单位的位置)
以上可以完成最简单的随机掉宝,具体大家可以慢慢考虑呵呵。
Q:SUBSTRING函数有什么用啊?
SUBSTRING是截取字符用的~~如在下面一个赋值过程中:
SetStoreEquitDate[StoreEquitDateLOG]=(Substring(‘XXXXXXXX’)15)
(Substring()15)表示取字符串‘XXXXXXXX’中第1到第5位之间的字符串~~
Q:如何让开起后,起始位置不会出现主城和工人?
进入TriggerEditor,找到MeleeInitialization,如果没改过的话应该如下:
MeleeInitialization
Events
......Mapinitialization
Actions
......MeleeGame-Usemeleetimeofday(forallplayers)
使一开始的时间是早上6:00(如果删掉就会从00:00开始)
......MeleeGame-LimitHeroesto1perHero-type(forallplayers)让所有玩家不能生產重覆的英雄
......MeleeGame-GivetrainedHeroesaScrollofTownPortal(forallplayers)让第一个生產出来的英雄有传送卷轴
......MeleeGame-Setstartingresources(forallplayers)让所有玩家一开始有一定的Gold和Lumber
......MeleeGame-Removecreepsandcrittersfromusedstartlocations(forallplayers)如果某起始位置有玩家,就删除附近的Creep
......MeleeGame-Createstartingunits(forallplayers)產生主城和工人于玩家的起始位置
......MeleeGame-RunmeleeAIs(forcomputerplayers)让电脑玩家有AI
......MeleeGame-Enforcevictory/defeatconditions(forallplayers)使用一般的胜利/失败设定(毁掉对方所有建筑者胜)
将蓝色的那一条删掉即可
Q:如何製作一个群体Sleep技能?
Sleep在製作时就被销定為单体技能,因此想这麼做不是AE或者MOD可以解决的,必须使用Trigger来帮忙。以下為可行方法的其中之一:
1、将Sleep复製贴上,改名為GroupSleep-Sleep(举例,请自己决定一个适当的名字)。把manacost改為0、range改為99999(全地图)、改成单位技能(Isaheroability=false)
2、製作一单位SleepCaster,model改成none、技能加入刚才做的GroupSleep-Sleep及Invulnerable(Netural)。
3、将Sleep技能改名為GroupSleep
4、写Trigger:
GroupSleepOrder
......Events
............Unit-AunitIsissuedanordertargetinganobject
//当一个单位接收到一个指定物件的指令
......Conditions
............(Issuedorder)Equalto(Order(sleep))
//指令為sleep
......Actions
............SetGroupSleep_MajorTarget=(Targetunitofissuedorder)
//将指令指定的单位存在GroupSleep_MajorTarget这个变数中
GroupSleep
....Events
........Unit-AunitStartstheeffectofanability
//当一个单位使得一项技能开始生效
....Conditions
........(Abilitybeingcast)EqualtoGroupSleep
//使用的技能為GroupSleep
....Actions
........UnitGroup-Pickeveryunitin(Unitswithin300.00of(PositionofGroupSleep_MajorTarget))anddo(Actions)
//选取GroupSleep_MajorTarget这个单位附近300范围的所有单位并执行LoopAction内的所有动作
...........Loop-Actions
................Unit-Create1SleepCasterfor(Ownerof(Triggeringunit))at(Positionof(Triggeringunit))facing0.00degrees
//產生一个单位于施法者(触发的单位)旁边,设定所有者為拥有施法者的玩家
................Unit-Adda2.00secondGenericexpirationtimerto(Lastcreatedunit)
//设定刚刚產生的单位生命时间為2.00(长度自己决定,足够施放AMS即可)................Unit-Order(Lastcreatedunit)toUndeadDreadlord-Sleep(Pickedunit)
//命令刚刚產生的单位对选到的单位使用自身技能中Order為sleep的技能 这样就能做出一个范围300的群体催眠术咯!
Q:假设在一张RPG地图中给每一位玩家一个工人让玩家选英雄
Event
.....Unit-Aunitenters
Action
......Unit-Create1forTriggingPlayeratcenterof
facing......
为什麼单位进入该Region时没有反应?
设定错误。由于引发事件的是单位,而不是玩家,所以TriggingPlayer无法表明到底是哪一个玩家。正确的设定方式如下:
Event
......Unit-Aunitenters
Action
......Unit-Create1for(Ownerof(TriggingUnit))atcenteroffacing......
Q:请问如何加入随机效果?
在设定Trigger时,用If/Then/Else做设定,例如:
PaladinSkill:
Events
......Unit-AunitIsattacked
//一个单位遭受攻击
Conditions
......(Unit-typeof(Attackingunit))EqualtoPaladin
//攻击者為PaladinActions
......If(AllConditionsareTrue)thendo(ThenActions)elsedo(ElseActions)
............If-Conditions
..................(Randomintegernumberbetween1and10)Equalto1
//如果1-10中随机选到的数字為1
............Then-Actions
..................Unit-Kill(Triggeringunit)
------1/10
//杀死引起触发的单位(遭受攻击的单位,用AttackedUnit也可以)
............Else-Actions
..................If(AllConditionsareTrue)thendo(ThenActions)elsedo
(ElseActions)------9/10
........................If-Conditions
..............................(Randomintegernumberbetween1and9)Equalto1
//如果1-9中随机选到的数字為1
........................Then-Actions
..............................Unit-Setlifeof(Triggeringunit)to((Lifeof(Triggeringunit))/2.00)-----1/9*9/10=1/10
//将引起触发的单位生命值设為(触发单位生命值/2.00)
........................Else-Actions
这么一来,当Paladin攻击敌人时,就会有1/10的机会瞬间杀死对方,1/10的机会使目标的生命值减半。其他的依此类推。这是目前最简单有效的方法,更好的方法大概只能用JASS写了。
Q:如何获得一个技能的目标点?
用TARGETPOINTOFABILITYBEINGCAST就能取到。
Q:我想用play某个单位的walkanimation来让该单位在原地跑,结果进入一看不行,这个动作不是持续的,请问我该怎么办?
用Jass:
callSetUnitAnimationByIndex(UnitIdAnimationIndex)
用这个可以让单位一直保持某个动作的状态不变。
但是并不是所有动作都能被保持的
E:简单地说一下GAMECACHE的使用
GAMECACHE~~字面意思就是缓存~~用于开辟一个内存空间来保存用户希望保留的数据(最后需要将CACHE保存到硬盘上)~~
主要作用是将地图A的一些数据保留到地图B中~~比如战役中英雄的等级或者道具技能什么什么的~~
GAMECACHE是用TRIGGEREDITOR来操作的~~下面说说相关ACTIONS的含义~
1]创建一个缓存~~想要使用缓存~~当然要先创建啦~~
GameCache-CreateagamecachefromMapName.w3v
这就是一个创建CACHE语句~~后面的MapName.w3v是你创建的CACHE的名字~~:)~~
2]创建以后~~就可以用他来保存资料了~~
GameCache-StoreUnitasLableofCategoryin(Lastcreatedgamecache)
这是一个保存单位的语句~~在Unit处选好需要保存的单位~~填写好标识(Lable)和分类(Category)~~最后选择将单位保存到哪个CACHE里面~~其中标识和分类是可以随意填写的~~:)~~
类似的~~还有下面一些类型的数据可以保存到CACHE里面~~使用方法同上!
GameCache-StoreRealasLableofCategoryin(Lastcreatedgamecache)
GameCache-StoreIntegerasLableofCategoryin(Lastcreatedgamecache)
GameCache-StoreBooleanasLableofCategoryin(Lastcreatedgamecache)
GameCache-StoreStringasLableofCategoryin(Lastcreatedgamecache)
(UNIT:单位/REAL:实数/INTEGER:整数/BOOLEAN:布尔/STRING:字符串)
保存玩需要的数据后不要忘记保存CACHE本身~~
GameCache-Save(Lastcreatedgamecache)
上面说的是保存数据~~但是怎么取出数据呢?~~
首先在任何可以使用你想取出的数据类型的地方都可以通过GAMECACHE-LOADXXXXXXCALUE来取出数据~~
另外~~
GameCache-RestorelableofCategoryfrom(Lastcreatedgamecache)forPlayer1(Red)at(Centerof(Playablemaparea))facing0.00
GameCache-RestorelableofCategoryfrom(Lastcreatedgamecache)forPlayer1(Red)at(Centerof(Playablemaparea))facing(Positionof(Triggeringunit))
这个语句是专门用于取出一个被保存的单位且放置在地图上的~~
最后~~如果想清除CACHE中的数据可以使用下面两个语句~~
GameCache-Clear(Lastcreatedgamecache)
清除所有数据~~
GameCache-ClearalllabelsofCategoryin(Lastcreatedgamecache)
清除某一类的数据~~
Q:嗯,如何动态改变中立商店/酒馆里卖的东西呢?
NeutralBuilding-Add物品/单位to(商店/酒馆)with初始存货数instockandamaxstockof最大存货数
把贩售物存入一个数组,用trigger随机生成数组索引,可以做到真正的”人流不息“的酒馆。又如根据玩家进行的状态,如获得的物品,在商店生成同等级的物品(TM中间的市场一样)等~
记得商店/酒馆必须有相关的贩售技能(废话-_-)
Q:如何让一个召唤生物不能被选中但能被攻击呢?
给一个单位添加"Aloc"技能就可以使它不能被选取就好象不死小强的终极技能Locustswarm召唤出的小小猩强一样~~
但是这个单位也同时失去了碰撞大小就是任何人都摸不到他拉(像鬼魂般穿身而过).这时配合"Chaos"就可完美解决!
做两个相同的单位一个为真身一个为替身.再自定一个Chaos技能DataNewUnitType填单位的真身
把"Aloc"自定的"Chaos"添加给她这时候Chaos立即起作用替身单位变为真身Aloc的"不被选取"作用保留而该单位也可同时承受攻击了!
比如你想做召唤单位Actions就是
Custom:callUnitAddAbilityBJ('Aloc'GetSummonedUnit())
Custom:callUnitAddAbilityBJ('S001'GetSummonedUnit())
('S001'是你自定chaos技能的代码)
就这么简单!
这个"Aloc"+"Chaos"的组合是wc3c的一位mapper发现的用在雇佣兵上真是妙!不用单心混战中错点到他们了~~
Q:如何让自定义英雄和普通英雄一样有建造限制呢?
首先,在平衡常数中将您的自定义英雄添加到“科技-等价物-英雄”列表里面去,这样的话就能保证每升一级主基地只能造一个了。
然后还要添加一条Trigger:
Player-Limittrainingofxxxto1forPlayern(其中“xxx”为该自定义英雄的单位类型)
这样您的英雄就只能造一个了
Q:如何让死掉的树复活呢?
很简单的,用Destructible-Resurrect即可。
以上就是我们关于触发器和一些其他问题的一些介绍,所以我们在面对这些设置的时候首先就需要把以上的这些问题搞明白,这样对症下药的话我想鞥狗给大家节省很多时间,当然一些额问题出现得比较特殊,所以我们还需要把那些比较特殊的问题也记录一下。之后我们对触发器的设置就有更多的解决办法,当然还有jass的一些问题我们也可以在以上找到将解决的办法。

