http://bbs.9ria.com/thread-80527-1-6.html

这个教程是我翻译的。。不是我原创的。。原来是发表在新闻资讯版块,后来被移到了游戏编程版块,所以关于原作者的一些信息等都没了。。。

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

我不得不承认,我不是植物大战僵尸的骨灰玩家,所以,如果你发现这个系列的教程有什么地方错误的,请告诉我。

定义游戏的主要结构

植物大战僵给了我们很好的视觉和感觉上的享受。你得保护你的房子以免被吃脑的僵尸入侵,这相当的吸引人。总的来说,杀死僵尸是很有趣的。但是这视觉上的东西和游戏玩法无关,我们可以用屠夫大战管子工,鸽子大战骆驼,圆形大战方块来代替。

在这个系列的教程中,我们用圆形来代替植物,用方块来代替僵尸,伟大的圆形将会阻止邪恶的方块进入我们的基地。游戏区域可以被简化为一个区块游戏。

设想一下这种局面:

然后尽量把它想象成这样:

我们所拥有的是一个位于(2,2)的植物,它会尽力阻止走在第二行(从第0行开始,下同)的僵尸,并且另一个僵尸正在沿着第三行接近我们的基地,还有一个正从第四列落下的阳光。不可能有另外一个植物位于(2,2),并且不可能出现一个僵尸走在第二行与第三行之间。

创建游戏区域

正如你在上图看到的那样,这个游戏的区域是一个5行9列的矩阵。因此,第一件要做的事就是定义一个数组。我设想你的fla文件有一个文档类为Main。下面是Main.as的内容:

  1. package {
  2. import flash.display.Sprite;
  3. public class Main extends Sprite {
  4. private var gameField:Array;
  5. public function Main():void {
  6. setupField();
  7. }
  8. private function setupField():void {
  9. gameField=new Array();
  10. for (var i:uint=0; i<5; i++) {
  11. gameField[i]=new Array();
  12. for (var j:uint=0; j<9; j++) {
  13. gameField[i][j]=0;
  14. }
  15. }
  16. }
  17. }
  18. }

复制代码

这样,gameField数组就是一个5*9的矩阵了。

画出游戏区域

下面的代码对于测试来说足够了,至少我们会画出一个游戏区域来。

  1. package {
  2. import flash.display.Sprite;
  3. public class Main extends Sprite {
  4. private var gameField:Array;
  5. public function Main():void {
  6. setupField();
  7. drawField();
  8. }
  9. private function setupField():void {
  10. gameField=new Array();
  11. for (var i:uint=0; i<5; i++) {
  12. gameField[i]=new Array();
  13. for (var j:uint=0; j<9; j++) {
  14. gameField[i][j]=0;
  15. }
  16. }
  17. }
  18. private function drawField():void {
  19. var fieldSprite:Sprite=new Sprite();
  20. var randomGreen:Number;
  21. addChild(fieldSprite);
  22. fieldSprite.graphics.lineStyle(1,0xFFFFFF);
  23. for (var i:uint=0; i<5; i++) {
  24. for (var j:uint=0; j<9; j++) {
  25. randomGreen=(125+Math.floor(Math.random()*50))*256;
  26. fieldSprite.graphics.beginFill(randomGreen);
  27. fieldSprite.graphics.drawRect(25+65*j,80+75*i,65,75);
  28. }
  29. }
  30. }
  31. }
  32. }

复制代码

drawField函数所做的事情都能够在setupField函数里实现,但是我想让他们分离,我得让一个函数只处理一件事。唯一有趣的一行代码是第25行的是在#007D00和#00AE00之间生成随机颜色。

这就是我们的游戏区域了。如果你想要让区块体面点。请。。。自便。

捕获阳光

阳光是植物大战僵尸里的货币。他们从天上掉下来,落到某一区块上。捡起这些阳光,你才能购买植物。

我用到了timer事件使得每五秒落下一束阳光,如果你对timer还不熟悉的话,请搜索。

现在,阳光还不会从天上掉下来,而是直接出现在某一随机的区块中。此时此刻,我还不知道是否两束阳光可以同时落到同一区块中。在这个例子里,他们是可以的,但是如果原版的植物大战僵尸里不允许这样的话,请告诉我。

当一束阳光落到地上的时候,它能够被玩家捡起。一个鼠标事件侦听器处理这整个任务。下面是代码:

  1. package {
  2. import flash.display.Sprite;
  3. import flash.utils.Timer;
  4. import flash.events.TimerEvent;
  5. import flash.events.MouseEvent;
  6. public class Main extends Sprite {
  7. private var gameField:Array;
  8. private var flowersTimer:Timer=new Timer(5000);
  9. private var sun:sunMc;
  10. private var sunContainer:Sprite=new Sprite();
  11. public function Main():void {
  12. setupField();
  13. drawField();
  14. fallingSuns();
  15. }
  16. private function fallingSuns():void {
  17. addChild(sunContainer);
  18. flowersTimer.start();
  19. flowersTimer.addEventListener(TimerEvent.TIMER, newSun);
  20. }
  21. private function newSun(e:TimerEvent):void {
  22. var sunRow:uint=Math.floor(Math.random()*5);
  23. var sunCol:uint=Math.floor(Math.random()*9);
  24. sun = new sunMc();
  25. sunContainer.addChild(sun);
  26. sun.x=52+sunRow*65;
  27. sun.y=130+sunRow*75;
  28. sun.addEventListener(MouseEvent.CLICK,sunClicked);
  29. }
  30. private function sunClicked(e:MouseEvent):void {
  31. e.currentTarget.removeEventListener(MouseEvent.CLICK,sunClicked);
  32. var sunToRemove:sunMc=e.currentTarget as sunMc;
  33. sunContainer.removeChild(sunToRemove);
  34. }
  35. private function setupField():void {
  36. gameField=new Array();
  37. for (var i:uint=0; i<5; i++) {
  38. gameField[i]=new Array();
  39. for (var j:uint=0; j<9; j++) {
  40. gameField[i][j]=0;
  41. }
  42. }
  43. }
  44. private function drawField():void {
  45. var fieldSprite:Sprite=new Sprite();
  46. var randomGreen:Number;
  47. addChild(fieldSprite);
  48. fieldSprite.graphics.lineStyle(1,0xFFFFFF);
  49. for (var i:uint=0; i<5; i++) {
  50. for (var j:uint=0; j<9; j++) {
  51. randomGreen=(125+Math.floor(Math.random()*50))*256;
  52. fieldSprite.graphics.beginFill(randomGreen);
  53. fieldSprite.graphics.drawRect(25+65*j,80+75*i,65,75);
  54. }
  55. }
  56. }
  57. }
  58. }

复制代码

下面简要概述一下用到的函数:
drawField:画出游戏区域
fallingSuns:开始制造阳光,使他们坠落
newSun:创建新的阳光
setupField:生成区块数组
sunClicked:当玩家点击阳光时调用
下面是效果:

用鼠标捡起阳光吧。
下载该例子的源代码。下一次,我们将会加入使阳光平滑落下的动画,并且我们将会买到我们的第一个植物。

做一个像植物大战僵尸的Flash游戏1相关推荐

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

    现在我们来到了这个系列教程的第三步.在这部分中,我们我会安置所买的植物,并且让僵尸出场. 增加一个僵尸是相当的容易因为处理僵尸问题跟处理阳光问题一样.就像阳光出现在舞台的顶部之外,然后落下.僵尸出现在 ...

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

    第二个教程了,是时候去筹钱买一个植物了. 我们必需修改一个在教程一中的代码,就是让阳光只是简简单单地出现在某一区块中,并且在一段时间内,若没有被捡起,它就消失了.我们得让阳光平滑的落下. 修改newS ...

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

    现在,我们来到了这个教程的第5个阶段. 在这个阶段,我们会修改一个漏洞,这个漏洞允许植物开火只要有僵尸与植物处于同一行,不论僵尸是在植物的左边还是右边.同时我们也会增加僵尸攻击植物的功能. 首先,让我 ...

  4. 用cocos2dx做一个简单的单机捕鱼达人游戏(1)

    用cocos2dx做一个简单的单机捕鱼达人游戏(1) 我使用了cocos2dx 3.9版本和vs2017来开发 今天先做游戏开始界面 开始界面很简单,一个背景图,一个logo,3个button(三种登 ...

  5. 可以帮我做一个python的3D飞机小游戏吗

    当然可以!我很乐意帮助你做一个 Python 的 3D 飞机小游戏. 如果你是 Python 初学者,我建议你先了解一些 Python 的基础知识,包括变量.数据类型.流程控制语句.函数等.这些知识都 ...

  6. 用c++做一个简单的打飞机小游戏(详细说明与注释)

    用c++做一个简单的打飞机小游戏(详细说明与注释) 说明: 代码长度5k多,行数200多行. 不仅没有压行,反而为了条理清晰一点所以很多中间加空换行,把很多可以写在一起的分割成了几个函数. 为了不会忘 ...

  7. 推荐一个不错的魔兽的flash游戏

    推荐一个不错的魔兽的flash游戏,看看大家能玩多少分? http://novelconcepts.co.uk/FlashElementTD/ http://www.wowddr.com/

  8. 可与植物大战僵尸媲美的游戏——土豆怪兽-汉化版(含攻略)

    可与植物大战僵尸媲美的游戏--土豆怪兽-汉化版(含攻略) 如果你喜欢植物大战僵尸,相信你也会喜欢Yongd今天要介绍的这个游戏--土豆怪兽,如果你已经玩过或正在玩这个游戏,飘过吧. 土豆怪兽是一款类似 ...

  9. 用文件保存游戏服务器数据恢复,玩植物大战僵尸等单机游戏时,存档丢失了怎么数据恢复?...

    相信很多人在玩例如植物大战僵尸.使命召唤等游戏时,都遇到到因为游戏奔溃,导致之前的存档丢失的情况.那么这种情况下,这些存档能够找回吗?首先我们要知道,存档在电脑上找不到,并不意味着这些存档的数据消失了 ...

最新文章

  1. 学习笔记Kafka(四)—— Kafka安装配置(3)—— Kafka多代理配置及常用操作
  2. caffe学习(一):开发环境搭建,编译caffe(win10)
  3. 树莓派 st-link master使用ST-LINK V2下载STM32程序 支持F0 F1 F2 等
  4. 通过NetMassDownloader批量下载和使用微软.NET框架源代码
  5. easylog 使用_Easyloggingpp的使用
  6. MYSQL BENCHMARK函数的使用
  7. 信息学奥赛一本通(1181:整数奇偶排序)——快速排序
  8. CDI services--Decorators(装饰器)
  9. php 类static引用函数吗,php中在变量和函数前加static关键字之后的区别
  10. C学习笔记-makefile
  11. 年审是当月还是当天_汽车年检提前检车的日期是按原始的还是按检车当月的?...
  12. Visro 应用的前端模板工具介绍 -JsRender
  13. Ansys命令流(按字母排列)
  14. linux 查看硬盘健康,linux硬盘检测健康状态
  15. 三个div怎么分别靠左、居中、靠右显示
  16. java实现1 12 123 1234 12345 123456 输出
  17. jQuery weui Select组件显示指定值
  18. jQuery.bind() 函数详解
  19. java关闭窗口按钮_java swing 使用按钮关闭窗口
  20. 深度分析这一年「AI大咖」,最重要的跳槽原因是……

热门文章

  1. 警报!AIGC狂飙,小心你的银行信息被偷窥
  2. 中文之星掌上狂拼手机输入法 网页制作软件
  3. 如何在 Flickr 上找到又酷,又有趣,且版权自由的照片?
  4. log4j(一)——什么是Log4j以及Log4j的体系结构
  5. bind添加SRV记录说明
  6. 手把手的教你在windows上安装cygwin教程以及验证是否安装成功
  7. 单片机节日彩灯实训报告_单片机数字钟实训报告
  8. 《网络编程》关于 UNIX网络编程 卷1 的 unp.h 和源码编译问题
  9. 2.PMAC硬件-一个运动控制系统的实例
  10. 关于HTML中圆角的实现