不知道大家有没有玩过“魔兽世界”,70级副本有一个叫“黑暗之门”,就是守护麦迪文直到打开黑暗之门,很经典的防守副本,我也准备做一个类似的防守地图,当然,不要去指望会很好玩……主要还是为了演示。
黑暗之门的刷兵方式是这样的:随机在N个区域的其中一个产生传送门,然后会有一个传送门守卫出来在门的旁边,传送门一定时间会召唤一些小怪前往麦迪文的位置,杀死守卫就会关闭传送门,然后一定时间内会在另一个地方产生传送门,每六批一个BOSS,一共十八批。
这里我们需要有一些地图设定元素:小兵的类型(普通兵九种,随着进度而变化-出现更高级的兵种),守护者3种(每五批切换一名,第六批为BOSS),BOSS也是3种,还有我们需要设定计时器。使用了一些变量,如下:
单位类型变量组Foot[9] =保存小兵类型
单位类型变量组Boss[6] =保存守护者和BOSS
计时器变量Calculagraph =传送门计时器
计时器窗品变量Calculagraph_windows =传送门计时器窗口
地区变量组attack_area[6] = 六个出现传送门的地区
数值变量组attack_numerical[1] = 用于记录随机地区变量数
attack_mumerical[2] = 用于记录传送门现有数量
attack_mumerical[3] = 用于记录传送门总数量
单位变量组Carrydoor[6] = 保存传送门
计时器变量hero_Calculagraph =英雄复活计时器
计时器窗口变量组 hero_Calculagraph_windows[5] = 英雄复活计时器窗口
我们先来定义单位类型变量,这里有个很有趣的设定:
所有小兵全部取决于同等级的随机野生单位,大家都知道野生单位是固定等级分类的,这样我们每次在玩图的时候没有改变难度的情况下却可以每次都可能遇到不同的怪。BOSS采用各个英雄,必要的话会在触发中添加一些属性,当然在具体做图的时候可以事先设定好各个怪物的属性;还有六个传送门出现的区域也保存在变量中了。
接着我们说刷兵,刷兵一般是两个部分组成,一个是创造,一个是进攻。
单位 - Create (1 x (Number of players)) Foot[1] for 玩家 12 (棕色) at (Position of Carrydoor[(Integer A)]) facing 默认的建筑朝向 degrees
//创造1*玩家数的单位类型为单位变量Foot[1]的单位给玩家12,并出现在单位变量Carrydoor(循环数A)的位置,面朝默认建筑方向。
可以看到这里用到了一个乘法语句,这个是整数的一个运算方式:
其实我们以后也会经常用到这种方式做一些精确的计算,当然,这个只是最简单的四则运算,还有其他复杂的算法,另外如果是字符串变量的话,同样可以用这个进行串连,比如显示出英雄的名字+英雄的等级。
还有用到变量Foot[1],在前面已经介绍过,给单位变量Foot[1]进行赋值为随机的等级1的野生单位,所以这个变量可能是任何一种等级1的野生单位,当然在具体做图的时候最好可以具体定义自己设定的单位,方便控制,后面是创造的单位是给予玩家12(你的敌方)的。至于出现地点,可以是地区的中心,也可以是随机点,我这里选择的是传送门出现的地点,还有一个触发将是创造传送门的,然后用这个变量保存创造的传送门,这个等下会介绍到。
单位组 - Pick every unit in (Units owned by 玩家 12 (棕色)) and do (单位 - Order (Picked unit) to 攻击-移动到 (Center of Home <情报>))
//选取玩家12的所有单位攻击移动到Home地区(前面设定的,玩家基地)
这个是最常见也最实用的单位进攻方式,单位组的选取其实是采用玫举方式的,就是每一个单位做一个动作,但如果直接使用这样的语句会因为一次执行动作的单位过多(超过12支)而不能全部控制,因此一般都是将这个触发分开写:
这样写的好处是肯定每个单位都会执行到,而且我们知道因为是每个单位都做一次动作,所以我们还可以在中间加入一些对单位控制的动作,比如计数器,比如你加一个数值变量的赋值语句N=N+1在执行动作里面,那么最后输出的N就是选取的所有单位了,而且选取还可以附加条件,比如选取的单位是一个英雄为真,那么就只会选取英雄单位。
本演示具体的刷兵方式其实是从传送门的开始的,因为前面提到每次刷出的单位是在传送门的位置,所以我们现在先来看看传送门创造的触发。传送门创造其实和其它地图中的刷怪系统没什么区别,所以我们也需要有一个计时器来告诉我们传送门什么时候会出现,如图:
这个触发的事件是每经过35秒,通过计时器来运行传送门创造的触发器。
倒数计数器 - Create a timer window for Calculagraph with title 下一个传送门开启
//创造一个名为Calculagraph(变量)倒数计数器,标题是“下一个传送门开启”
倒数计数器 - Start Calculagraph as a 一次射击 timer that will expire in 30.00 seconds
//倒数计数器Calculagraph开始计时,次数为一次,时间为30秒。
Set Calculagraph_windows = (Last created timer window)
//设置倒数计时器窗口变量为最后创造的倒数计时器
玩家组 - Pick every player in (All players) and do (倒数计数器 - 显示 Calculagraph_windows for (Picked player))
//选取所有玩家显示数计数器窗口Calculagraph_windows。
Wait 29.00 seconds
倒数计时器 - Destroy Calculagraph_windows
//等待29秒删除倒数计时器窗口Calculagraph_windows
这就是创造和使用倒数计时器的简单流程,每一个计数器的窗口创建了必须要有一个结束的语句,另外如果还有其它计数器存在的话,就要使用变量了,这个演示中还有英雄复活的计数器,因此我使用变量。
计时结束以后,有几种方式可以用,一就是通过事件Timer Expires来判断计时器到期事件,这里需要用到变量,我没有使用这个事件,
所以采用wait(等待语句来判断时间,为了避免BUG,时间为计时器-1),然后直接执行下面的动作。将attack_mumerical[3]赋值为attack_mumerical[3]+1,这个变量的作用是记录传送门出现的总次数,在设计中已经申明过,每六批为一个循环,所以我这里有三个循环,通过判断attack_mumerical[3]变量来确定执行哪一部分的触发器。
下面是IF 判断语句,第一个触发是如果attack_mumerical[3]小于或等于6,就执行触发器Create Carrydoor 1,下面的两个语句类同,区别在于一个是7<attack_mumerical[3]<12,一个是13<attack_mumerical[3]<18,分别执行Create Carrydoor 2和Create Carrydoor 3。