教程七:如何刷兵

+

教程七:如何刷兵,如何删除出来的刷兵

此游戏只能同时拥有64个单位,确实少了点。以上内容是能编辑小规模战争mod。

但是学了此章后,你能把场面放大无数倍,可以制作出面对成百上千敌人的超级大场面。

可以制作绚丽的海滩登陆。

可以率领25辆99式坦克面对200辆M1坦克的超级坦克大对轰。

还可制作数十辆武装直升机飞过头顶的震撼效果!!!

可以制作出绚丽的桥头保卫战,村庄保卫战等等

在学习此章之前,我们先来了解下地区:,位置在右上角的system里面可以找到。

如图:

这个东西主要是用于:某单位进入该地区时发生什么事。

多用于刷兵,删除刷兵,触发任务完成等。

代码为:function onEnter(zoneName, unitName)

来个例子:

首先拖动的name命名为zone然后再拖一个兵并把该兵的name命名为han并设置为player.

放好后,点击标题栏的level.lua

输入以下代码:

function onEnter_zone_han(zoneName, unitName)

OFP:missionFailed();

end

意思是:当han这个单位进入zone这个地区时

触发总任务完成

效果:

当玩家操作han这个单位进去zone这个区域则弹出任务完成菜单,游戏胜利。

很简单吧。

好了现在我们对地区已经了解了。

现在我们就利用地区这个工具来制作刷兵。

在此之前我们先了解为什么要刷兵。

这里在罗嗦下这个编辑器只能支持64个单位在地图上,这明显限制的游戏的规模,但是我们可以在64个单位死后,再刷出新的兵,这样我就能把战斗做到无限大!不过注意一个地图上同一时间只能有64个单位,不然刷不新的兵来。

刷兵语句:OFP:activateEntitySet();

好我们来例子:

例1:意思是:

首先点击 右侧Create栏右边的Explorer

在 Entety Sey View 目录下面空白处点一下(防止建在根目录里) 再选择+ ADD Entity Set

增加一个Entity Set 我们这里他命名为E1.单击E1灰色目录图标打勾,

然后再右键E1选Exportable 最后图标就是一个黄色打勾的目录.

这样我们就建立了个实体。

然后拖动一组兵到地图上在属性界面里的modify里的Entity Set 里选择刚

才创建的E1。命名为bin1

现在这组兵事E1这个实体里的单位。

那么我们要实现刷兵就必须触发这个实体(E1这个实体里的单位在游戏一开始是不会出现的)

在地图上拖一个地区,再拖一个兵命名为han设置成player。点击level.lua输入以下代码:

function onEnter_zone_han(zoneName, unitName)

OFP:activateEntitySet("E1");

end

当han这个单位进入zone这个区域时

触发刷实体E1

那么我们知道刚才的bin1是在实体E1中,那么触发E1也就实现了bin1的出现。

效果:

当han进入zone这个地区时,bin1刷出来!

哈哈哈哈哈哈是不是超级简单。不过要注意刷出来的兵或者说实体E1里面的单位必须要有小队队长。不然会出错。(也就是不能是虚拟单位在实体里,什么是虚拟单位后面的章节会说)

好了我们再来学习删除刷兵。

代码为:OFP:destroyEntitySet();

为什么要删除刷兵?

那么一队敌人远离你1公里,这队敌人也没办法追上你,那么我就可以把这个小队删除,释放出内存给其他的单位!真正实现大规模的战斗。

我们继续以例1来讲解。

再拖动一个地区到地图上00命名为shanbingzone

现在地图上有两个地区00分别为zone和shanbingzone,一个han兵,一个bin1,和一个level.lua

我们点击level.lua

输入以下代码:

function onEnter_zone_han(zoneName, unitName)

shuabin1=OFP:activateEntitySet("E1");

end

function onEnter_shanbingzone_han(zoneName, unitName)

OFP:destroyEntitySet(shuabin1);

end

代码的意思是:

当han这个单位进入zone这个区域时

shuabin1=触发刷兵E1实体

当han这个单位进入shanbingzone这个地区时

触发删除shuabin1这个变量。

我们来讲解下:

shuabin1=OFP:activateEntitySet("E1");这段代码和例1有所不同,这里必须把OFP:activateEntitySet("E1")赋值给shuabin1才能执行后面的消除刷兵。Shuabin1这个变量可以取自己容易记的名字。

再看下面:

OFP:destroyEntitySet(shuabin1);为触发删除刷出来的兵。

看到了把后面括号里是(shuabin1)而不是E1。如果是E1的话则代码不能出现效果,切记.那么这里删除了shuabin1也就删除了E1这个实体也就删除了bin1这组兵。(注意格式(shuabin1)没有双引号)

效果:

当han进入zone时刷兵,当han进入shanbingzone时删除刚才所刷的兵.

呵呵 也很简单把

不外乎把刷兵的触发效果给他赋值个变量,在删除刷兵的时候只要删除这个变量就可以了。

休息下继续。。。。。。。。。。。。。。。。。。。。

但是细心的同学又发现了

上面这个例子,当han单位进入zone这个地区刷兵,然后进去shanbingzone这个地区删除刷出来的兵,但是当han再进入zone这个区域时又刷兵了,这明显不是我们设计的本意。

那么我们该如何只让zone这个区域只刷一次兵,以后再进入zone地区时不再刷兵呢。

我们就必须加入判断。

例3

来看代码:

function onMissionStart()

panduan1=0;

end

function onEnter_zone_han(zoneName, unitName)

if panduan1==0 then

shuabin1=OFP:activateEntitySet("E1");

panduan1=1;

end

end

function onEnter_shanbingzone_han(zoneName, unitName)

OFP:destroyEntitySet(shuabin1);

end

很好理解把

在游戏开始的时候设置个变量panduan1=0。

当han进入zone时,先判断panduan1是不是0后才刷兵。

当触发刷兵后让panduan=1,则以后再进入zone地区时因为panduan=1所以不会再刷兵了。

当然对于例3的功能还有更简单的办法:

function onEnter_zone_han(zoneName, unitName)

shuabin1=OFP:activateEntitySet("E1");

OFP:disableEvent("onEnter_zone_han") ;   --消除该触发器,也可以达到例3的效果,且更简单方便,不需要变量来判断。

end

function onEnter_shanbingzone_han(zoneName, unitName)

OFP:destroyEntitySet(shuabin1);

end

我们来个牛的例子

例4:

假设我们有实体E1和E2还有兵若干,地区4个分别为zone,zone1和shanbingzone,shanbingzong1玩家han.

代码为

function onMissionStart()

panduan1=0;

panduan2=0;

end

function onEnter_zone_han(zoneName, unitName)

if panduan1==0 then

shuabin1=OFP:activateEntitySet("E1");

panduan1=1;

end

end

function onEnter_zone1_han(zoneName, unitName)

if panduan2==0 then

shuabin2=OFP:activateEntitySet("E2");

panduan2=1;

end

end

function onEnter_shanbingzone_han(zoneName, unitName)

OFP:destroyEntitySet(shuabin1);

end

function onEnter_shanbingzone1_han(zoneName, unitName)

OFP:destroyEntitySet(shuabin2);

end

意思是:

当han进入zone时

触发刷E1

当han进入zone时

触发刷E2

当han进shanbingzone时

触发删除E1

当han进入shanbingzone1时

触发删除E2

以上代码刷兵区域只能刷1次兵

效果:略

值得注意的是一次刷兵判断时,变量只能用一次

function onEnter_zone_han(zoneName, unitName)

if panduan1==0 then

shuabin1=OFP:activateEntitySet("E1");

panduan1=1;

end

end

function onEnter_zone1_han(zoneName, unitName)

if panduan1==1 then ――用了同一个变量,错误

shuabin2=OFP:activateEntitySet("E2");

panduan1=2;――错误end

这样写是错误的,所以我们必须有panduan1=0;和panduan2=0;两个变量来判断刷兵。切记!!!!!

要做大规模战斗例4必须要学会。

本章说到这里结束了,希望大家多多练习,作出超级大战场来给我玩^_^

这章稍微有点难度,有什么困难可以联系我,大家一起讨论。