做一个像植物大战僵尸的Flash游戏3

 http://bbs.9ria.com/thread-81770-1-5.html

查看该系列的其它文章:
做一个像植物大战僵尸的Flash游戏1
做一个像植物大战僵尸的Flash游戏2
做一个像植物大战僵尸的Flash游戏3
做一个像植物大战僵尸的Flash游戏4
做一个像植物大战僵尸的Flash游戏5

现在我们来到了这个系列教程的第三步。在这部分中,我们我会安置所买的植物,并且让僵尸出场。

增加一个僵尸是相当的容易因为处理僵尸问题跟处理阳光问题一样。就像阳光出现在舞台的顶部之外,然后落下。僵尸出现在舞台右边之外,然后往左移动。然而他们之

间不会相互配合。

至于安置植物,我们必须确保当玩家拖动植物,然后按下鼠标时,植物将要被安置的区块必须没有其它植物并且在游戏区域内。然后,植物就被安置好了,选择器和侦听

器也随之被移除。接着,玩家继续收集阳光并且选择一种植物(现在只有一种)安置到游戏区域里。

我对代码进行了注释来帮助你明白代码都做了些什么。

  1. package {
  2.         import flash.display.Sprite;
  3.         import flash.utils.Timer;
  4.         import flash.events.TimerEvent;
  5.         import flash.events.MouseEvent;
  6.         import flash.events.Event;
  7.         import flash.text.TextField;
  8.         public class Main extends Sprite {
  9.                                //一个2维数组用来存储游戏区块
  10.                 private var gameField:Array;
  11.                                //计时器,使得阳光落下
  12.                 private var flowersTimer:Timer=new Timer(5000);
  13.                                //计时器,让僵尸出场
  14.                 private var zombieTimer:Timer=new Timer(5000);
  15.                                //所有阳光的容器
  16.                 private var sunContainer:Sprite=new Sprite();
  17.                                //所有植物的容器
  18.                 private var plantContainer:Sprite=new Sprite();
  19.                                //所有僵尸的容器
  20.                 private var zombieContainer:Sprite=new Sprite();
  21.                 //阳光
  22.                 private var sun:sunMc;
  23.                                //植物栏上的植物
  24.                 private var plant:plantMc;
  25.                                //玩家在游戏区域能够拖动的植物
  26.                 private var movingPlant:plantMc;
  27.                                //选择器(一个高亮的区块),告诉玩家他将把植物种在哪个区块
  28.                 private var selector:selectorMc;
  29.                                //玩家所拥有的金钱数量
  30.                 private var money:uint=0;
  31.                                //动态文本框,用来显示玩家的金钱
  32.                 private var moneyText:TextField=new TextField  ;
  33.                                //布尔型变量,标志玩家是否在移动一个植物
  34.                 private var playerMoving:Boolean=false;
  35.                 public function Main():void {
  36.                                               //初始化游戏区块
  37.                         setupField();
  38.                                               //画出游戏区块
  39.                         drawField();
  40.                                               //处理下落的阳光
  41.                         fallingSuns();
  42.                                               //添加所有文本(此刻只有金钱的数量)
  43.                         addText();
  44.                                               //增加植物的函数
  45.                         addPlants();
  46.                         //增加僵尸的函数
  47.                         addZombies();
  48.                         //注册侦听器,进入游戏循环
  49.                         addEventListener(Event.ENTER_FRAME,onEnterFrm);
  50.                 }
  51.                 private function setupField():void {
  52.                                               //创建一个5行9列的矩阵,并将矩阵内的每个值初始化为0
  53.                         gameField=new Array();
  54.                         for (var i:uint=0; i<5; i++) {
  55.                                 gameField[i]=new Array();
  56.                                 for (var j:uint=0; j<9; j++) {
  57.                                         gameField[i][j]=0;
  58.                                 }
  59.                         }
  60.                 }
  61.                 private function addText():void {
  62.                                               //增加一个动态文本框
  63.                         addChild(moneyText);
  64.                         updateMoney();
  65.                         moneyText.textColor=0xFFFFFF;
  66.                         moneyText.height=20;
  67.                 }
  68.                 private function updateMoney():void {
  69.                                               //把玩家所拥有的金钱数量写到文本框里
  70.                         moneyText.text="Money: "+money.toString();
  71.                 }
  72.                 private function drawField():void {
  73.                                               //画游戏区块,当你有自己的素材时,你可以重写这些代码
  74.                         var fieldSprite:Sprite=new Sprite();
  75.                         var randomGreen:Number;
  76.                         addChild(fieldSprite);
  77.                         fieldSprite.graphics.lineStyle(1,0xFFFFFF);
  78.                         for (var i:uint=0; i<5; i++) {
  79.                                 for (var j:uint=0; j<9; j++) {
  80.                                         randomGreen=(125+Math.floor(Math.random()*50))*256;
  81.                                         fieldSprite.graphics.beginFill(randomGreen);
  82.                                         fieldSprite.graphics.drawRect(25+65*j,80+75*i,65,75);
  83.                                 }
  84.                         }
  85.                 }
  86.                 private function addZombies():void {
  87.                                               //增加僵尸容器
  88.                         addChild(zombieContainer);
  89.                                               //启动计时器,使僵尸出场
  90.                         zombieTimer.start();
  91.                         //注册侦听器
  92.                         zombieTimer.addEventListener(TimerEvent.TIMER,newZombie);
  93.                 }
  94.                 private function newZombie(e:TimerEvent):void {
  95.                                               //创建一个僵尸
  96.                         var zombie:zombieMc=new zombieMc();
  97.                                               //把僵尸加入到显示列表
  98.                         zombieContainer.addChild(zombie);
  99.                                               //生成随机行数,用于放置僵尸
  100.                         var row:uint=Math.floor(Math.random()*5);
  101.                                               //把僵尸放在屏幕的右边
  102.                         zombie.x=660;
  103.                         zombie.y=row*75+115;
  104.                 }
  105.                 private function fallingSuns():void {
  106.                                               //增加阳光容器
  107.                         addChild(sunContainer);
  108.                                               //启动计时器,使得阳光落下
  109.                         flowersTimer.start();
  110.                         //注册Timer事件,触发事件侦听函数
  111.                         flowersTimer.addEventListener(TimerEvent.TIMER, newSun);
  112.                 }
  113.                 private function newSun(e:TimerEvent):void {
  114.                                               //为新生的阳光选择目标位置,包括行号和列号
  115.                         var sunRow:uint=Math.floor(Math.random()*5);
  116.                         var sunCol:uint=Math.floor(Math.random()*9);
  117.                                               //创建阳光
  118.                         sun = new sunMc();
  119.                                               //当鼠标滑过阳光时,改变鼠标的形状
  120.                         sun.buttonMode=true;
  121.                                               //把阳光加入到显示列表
  122.                         sunContainer.addChild(sun);
  123.                                               //把阳光放在合适的位置
  124.                         sun.x=52+sunCol*65;
  125.                                               //定义阳光destinationY属性
  126.                         sun.destinationY=130+sunRow*75;
  127.                                               //把阳光放在舞台顶部的上方
  128.                         sun.y=-20;
  129.                                               //给阳光注册鼠标点击事件
  130.                         sun.addEventListener(MouseEvent.CLICK,sunClicked);
  131.                 }
  132.                 private function sunClicked(e:MouseEvent):void {
  133.                                               //移除鼠标事件侦听
  134.                         e.currentTarget.removeEventListener(MouseEvent.CLICK,sunClicked);
  135.                                               //让玩家赚到5个金币
  136.                         money+=5;
  137.                                               //更新动态文本
  138.                         updateMoney();
  139.                                               //获得我们必须移除的阳光
  140.                         var sunToRemove:sunMc=e.currentTarget as sunMc;
  141.                                               //移除该阳光
  142.                         sunContainer.removeChild(sunToRemove);
  143.                 }
  144.                 private function addPlants():void {
  145.                                               //增加植物容器
  146.                         addChild(plantContainer);
  147.                                               //创建一个新的植物
  148.                         plant=new plantMc();
  149.                                               //把新植物加入到显示列表
  150.                         plantContainer.addChild(plant);
  151.                                               //使鼠标改变形状,当它滑过新植物时
  152.                         plant.buttonMode=true;
  153.                                               //放置植物
  154.                         plant.x=90;
  155.                         plant.y=40;
  156.                                               //给新植物注册鼠标点击事件
  157.                         plant.addEventListener(MouseEvent.CLICK,onPlantClicked);
  158.                 }
  159.                 private function onPlantClicked(e:MouseEvent):void {
  160.                                               //检查玩家是否有足够的钱(当前是10)来购买植物,并且是否正在拖动一个植物
  161.                         if (money>=10&&! playerMoving) {
  162.                                                               //付款
  163.                                 money-=10;
  164.                                                              //更新动态文本
  165.                                 updateMoney();
  166.                                                              //创建一个新的选择器
  167.                                 selector=new selectorMc();
  168.                                                              //使选择器不可见
  169.                                 selector.visible=false;
  170.                                                              //把选择器加入到显示列表
  171.                                 plantContainer.addChild(selector);
  172.                                                              //构建一个新的供玩家拖动的植物
  173.                                 movingPlant=new plantMc();
  174.                                                              //给该植物注册一个鼠标点击事件
  175.                                 movingPlant.addEventListener(MouseEvent.CLICK,placePlant);
  176.                                                              //把该植物加入到显示列表
  177.                                 plantContainer.addChild(movingPlant);
  178.                                                              //告诉脚本正在移动一株植物
  179.                                 playerMoving=true;
  180.                         }
  181.                 }
  182.                 private function placePlant(e:MouseEvent):void {
  183.                                               //根据鼠标的位置来判断植物将要被种植在哪个区块
  184.                         var plantRow:int=Math.floor((mouseY-80)/75);
  185.                         var plantCol:int=Math.floor((mouseX-25)/65);
  186.                                              //检查该区块是否位于游戏区域内,并且该区块没有其它植物存在
  187.                         if (plantRow>=0&&plantCol>=0&&plantRow<5&&plantCol<9&&gameField[plantRow][plantCol]==0) {
  188.                                                               //构建一株植物,用来种植
  189.                                 var placedPlant:plantMc=new plantMc();
  190.                                                              //把该植物加入到显示列表
  191.                                 plantContainer.addChild(placedPlant);
  192.                                                              //放置该植物
  193.                                 placedPlant.x=plantCol*65+57;
  194.                                 placedPlant.y=plantRow*75+115;
  195.                                                              //告诉脚本玩家停止移动植物了
  196.                                 playerMoving=false;
  197.                                                              //移除供玩家拖动的植物的事件侦听
  198.                                 movingPlant.removeEventListener(MouseEvent.CLICK,placePlant);
  199.                                                              //把选择器从显示列表移除
  200.                                 plantContainer.removeChild(selector);
  201.                                                              //把供玩家拖动的植物移出显示列表
  202.                                 plantContainer.removeChild(movingPlant);
  203.                                                              //更新游戏区域信息
  204.                                 gameField[plantRow][plantCol]=1;
  205.                         }
  206.                 }
  207.                 private function onEnterFrm(e:Event):void {
  208.                                               //循环,遍历所有的僵尸
  209.                         for (var i:uint=0; i<zombieContainer.numChildren; i++) {
  210.                                 var movingZombie:zombieMc=zombieContainer.getChildAt(i) as zombieMc;
  211.                                                               //把所有的僵尸向左移动二分之一个像素
  212.                                 movingZombie.x-=0.5;
  213.                         }
  214.                                               //循环,遍历所有的阳光
  215.                         for (i=0; i<sunContainer.numChildren; i++) {
  216.                                 var fallingSun:sunMc=sunContainer.getChildAt(i) as sunMc;
  217.                                                               //如果阳光仍然在下落,它还没到达目的地
  218.                                 if (fallingSun.y<fallingSun.destinationY) {
  219.                                                                              //把阳光往下移一个像素
  220.                                         fallingSun.y++;
  221.                                                                              //如果阳光不在下落了
  222.                                 } else {
  223.                                                                              //使阳光逐渐消失
  224.                                         fallingSun.alpha-=0.01;
  225.                                                                              //如果阳光完全消失了
  226.                                         if (fallingSun.alpha<0) {
  227.                                                                                             //移除该阳光的事件侦听
  228.                                                 fallingSun.removeEventListener(MouseEvent.CLICK,sunClicked);
  229.                                                                                             //把该束阳光移出显示列表
  230.                                                 sunContainer.removeChild(fallingSun);
  231.                                         }
  232.                                 }
  233.                         }
  234.                                               //如果玩家正在移动一株植物
  235.                         if (playerMoving) {
  236.                                                               //使植物跟随鼠标
  237.                                 movingPlant.x=mouseX;
  238.                                 movingPlant.y=mouseY;
  239.                                                               //判断当前鼠标滑过哪一个区块
  240.                                 var plantRow:int=Math.floor((mouseY-80)/75);
  241.                                 var plantCol:int=Math.floor((mouseX-25)/65);
  242.                                                               //如果这个区块在游戏区域内
  243.                                 if (plantRow>=0&&plantCol>=0&&plantRow<5&&plantCol<9) {
  244.                                                                              //使选择器可见
  245.                                         selector.visible=true;
  246.                                                                              //把选择器放在被选择的区块上
  247.                                         selector.x=25+plantCol*65;
  248.                                         selector.y=80+plantRow*75;
  249.                                 } else {
  250.                                                                              //使选择器不可见
  251.                                         selector.visible=false;
  252.                                 }
  253.                         }
  254.                 }
  255.         }
  256. }
复制代码
下面是结果:


收集阳光并且安置植物当僵尸到达时。
下载源代码。下一次,我们将会与僵尸作战!


译者注:
有人问,为什么不面象对象呢?为什么把代码全部写到一个类里,这多少不容易扩展和维护啊。
恩。这个问题你得问原作者了。因为我这只是翻译。
但是,我倒是可以理解。原作者这么写,但是他把所有主要的东西都写出来了。当你要具体把这个游戏完整的做出来的时候,你得靠自己来设计,来架构。显然原作者是目的并不是教授游戏设计,游戏架构的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值