平台上的敌人
如果你需要在平台上面放一个巡逻的敌人,就像这样:
只需要写几行就行了。敌人可以来回巡逻,碰到边缘的时候会自动折回。这个需要敌人检测下一个落脚点方块的通行性:
getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove+1, ob); if (!ob.downleft and !ob.downright) {
注意一下这里的一个很重要的数字:1。 (ob.y+ob.speed*ob.yMove+1)加1是为了检查英雄脚下面的方块。还有要注意的是只有当downleft和downright都是true的时候,才能继续向前走,否则就掉头走。
下载本例的源文件
教给敌人一些窍门
碰到障碍物可以改变方向,而不是简单的回头走。
让我们修改一下enemyBrain函数。以前是简单的将ob.xMove和ob.yMove取相反数,现在我们给他一个随机的新方向:
ob.xMove = random(3)-1; if (ob.xMove) { ob.yMove = 0; } else { ob.yMove = random(2)*2-1; }
一旦敌人接触障碍物,xMove就会得到一个随机的数值(-1,0或1,random(3)会返回0,1或2)。如果生成的xMove值是0,我们就设置yMove为1或-1。 random(2) : 0 或 1 random(2)*2 : 0 或 2 random(2)*2-1 : -1 或 1 如果生成的xMove值是1,那么就把yMove值设置成0,然后重新生成xMove值。
下载本例的源文件
这样就好多了,但是如果我们还可以优化一下,我们应该避免与原来相同或相反的方向。
代码:
} else { if (ob.xMove == 0) { ob.xMove = random(2)*2-1; ob.yMove = 0; getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove, ob); if (!ob.downleft or !ob.upleft or !ob.downright or !ob.upright) { ob.xMove = -ob.xMove; } } else { ob.xMove = 0; ob.yMove = random(2)*2-1; getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove, ob); if (!ob.downleft or !ob.upleft or !ob.downright or !ob.upright) { ob.yMove = -ob.yMove; } } }
这回我们先检查当前的方向。例如,如果原先是垂直移动(xMove==0)那么我们让xMove为1或-1,然后让yMove为0。但是如果敌人在地图的拐角处,他的新方向可能会让他再一次撞上墙。这就是为什么我们要调用getCorners函数来检测障碍物,如果有障碍物,掉头走。
下载本例的源文件
Ok,这回敌人更加聪明了一些,因为玩家不能预知他遇到障碍物后的行走方向。但是你也注意到了,这个傻小子只会去撞墙然后改变方向。如果你的地图中有大范围的空白区域,玩家很难保证敌人能经过那里。最好的例子是一个大房子,英雄站在中间,那么敌人永远也抓不到他。
我们赋予敌人自动转向的能力,即便他没有遇到障碍物。
我们在他的原型中添加一个turning属性来表征转向的能力。
turning表示的是敌人每行走一步时转向的可能性。0代表永远不会转向,100表示每步都要转向(你可别千万这么做)。
更改一下if判断
if (ob.downleft and ob.upleft and ob.downright and ob.upright and random(100)>ob.turning) {
如果random(100)的值小于ob.turning,就换一个新的方向,就算本来能够继续往前走。
下载本例的源文件
出处:蓝色理想
责任编辑:qhwa
上一页 愚蠢的敌人 下一页 射击
◎进入论坛Flash专栏版块参加讨论
|