Flash 游戏开发实战(二)

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

修改newSun函数

细心的读者可能会发现,教程一里的newSun函数有一个错误使得新生的阳光无法出现在游戏区域内的任意一个区块。这个错误可以通过修改x属性的值来修复:

sun.x=52+sunCol*65;(教程一里写成了sun.x=52+sunRow*65)

既然我们将要加入使得阳光平滑落下的代码,整个newSun函数可以改成这样:

private function newSun(e:TimerEvent):void {
        var sunRow:uint=Math.floor(Math.random()*5);
        var sunCol:uint=Math.floor(Math.random()*9);
        sun = new sunMc();
        sun.buttonMode=true;
        sunContainer.addChild(sun);
        sun.x=52+sunCol*65;
        sun.destinationY=130+sunRow*75;
        sun.y=-20;
        sun.addEventListener(MouseEvent.CLICK,sunClicked);
}

  

现在,阳光的y属性被初始化为-20使得阳光出现在我们看不见的地方,并且它有一个destinationY属性用来存储它的最终的y坐标。呆会让我们来看看如何使用这一属性。注意一下buttonMode属性,它能使得鼠标指针改变外形当鼠标滑过阳光时。

收集阳光来筹钱吧

首先,我们需要一个变量来存储玩家金钱的数量,然后我们需要一个文本框来显示它。
这些是我们需要导入的类:
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.text.TextField;

下面这些,是所用到的变量
private var gameField:Array;
private var flowersTimer:Timer=new Timer(5000);
private var sun:sunMc;
private var sunContainer:Sprite=new Sprite();
private var money:uint=0;
private var moneyText:TextField=new TextField;

money变量用来存储玩家的金钱,moneyText是一个动态文本。
现在,让我们来看一下整个代码并且讨论一下新特性。

package {
        import flash.display.Sprite;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.text.TextField;
        public class Main extends Sprite {
                private var gameField:Array;
                private var flowersTimer:Timer=new Timer(5000);
                private var sun:sunMc;
                private var sunContainer:Sprite=new Sprite();
                private var money:uint=0;
                private var moneyText:TextField=new TextField;
                public function Main():void {
                        setupField();
                        drawField();
                        fallingSuns();
                        addText();
                        addEventListener(Event.ENTER_FRAME,onEnterFrm);
                }
                private function addText():void {
                        addChild(moneyText);
                        updateMoney();
                        moneyText.textColor=0xFFFFFF;
                        moneyText.height=20;
                }
                private function updateMoney():void {
                        moneyText.text="Money: "+money.toString();
                }
                private function onEnterFrm(e:Event):void {
                        for (var i:uint=0; i<sunContainer.numChildren; i++) {
                                var fallingSun:sunMc=sunContainer.getChildAt(i) as sunMc;
                                if (fallingSun.y<fallingSun.destinationY) {
                                        fallingSun.y++;
                                } else {
                                        fallingSun.alpha-=0.01;
                                        if (fallingSun.alpha<0) {
                                                fallingSun.removeEventListener(MouseEvent.CLICK,sunClicked);
                                                sunContainer.removeChild(fallingSun);
                                        }
                                }
                        }
                }
                private function fallingSuns():void {
                        addChild(sunContainer);
                        flowersTimer.start();
                        flowersTimer.addEventListener(TimerEvent.TIMER, newSun);
                }
                private function newSun(e:TimerEvent):void {
                        var sunRow:uint=Math.floor(Math.random()*5);
                        var sunCol:uint=Math.floor(Math.random()*9);
                        sun = new sunMc();
                        sun.buttonMode=true;
                        sunContainer.addChild(sun);
                        sun.x=52+sunCol*65;
                        sun.destinationY=130+sunRow*75;
                        sun.y=-20;
                        sun.addEventListener(MouseEvent.CLICK,sunClicked);
                }
                private function sunClicked(e:MouseEvent):void {
                        e.currentTarget.removeEventListener(MouseEvent.CLICK,sunClicked);
                        money+=5;
                        updateMoney();
                        var sunToRemove:sunMc=e.currentTarget as sunMc;
                        sunContainer.removeChild(sunToRemove);
                }
                private function setupField():void {
                        gameField=new Array();
                        for (var i:uint=0; i<5; i++) {
                                gameField[i]=new Array();
                                for (var j:uint=0; j<9; j++) {
                                        gameField[i][j]=0;
                                }
                        }
                }
                private function drawField():void {
                        var fieldSprite:Sprite=new Sprite();
                        var randomGreen:Number;
                        addChild(fieldSprite);
                        fieldSprite.graphics.lineStyle(1,0xFFFFFF);
                        for (var i:uint=0; i<5; i++) {
                                for (var j:uint=0; j<9; j++) {
                                        randomGreen=(125+Math.floor(Math.random()*50))*256;
                                        fieldSprite.graphics.beginFill(randomGreen);
                                        fieldSprite.graphics.drawRect(25+65*j,80+75*i,65,75);
                                }
                        }
                }
        }
}

让我们来看一下这个代码中的一些新东西。

第19行:调用addText函数(第22到第27行),这个函数很简单,只是创建了一个动态文本框并且在第24行调用了updateMoney函数(第28到第30行)来显示当前玩家的金钱数量。

第20行:注册Event.ENTER_FRAME事件侦听器,使得每帧调用onEnterFrm函数(第31到第44行)。

第32行:for循环遍历sunContainer,得到sunContainer的子对象。每一束阳光要么是正在下落中,要么是已经落地。

正在下落的阳光它的y属性的值小于它的destinationY属性的值(第34行),这种情况下,阳光会继续下落通过增加y属性的值。

已落地的阳光不会再继续下落,在这种情况下,它开始渐渐消失(第37行,通过改变alpha属性)。一旦它完全透明了(第38行),它的鼠标事件侦听器就会被移除(第39行),并且它也会被移出显示列表(第40行)。

最后一个有改动的函数是sunClicked。现在,你每收集一束阳光就会赚到5个金币(第63行),并且更新动态文本框(第64行)。

下面是游戏效果:

收集阳光赚钱或者让它们落到地面后,看着它们消失吧。

购买你的第一株植物

要创造你的第一株植物,首先我们需要两个新的类:一个是plantMc,它代表了植物,另一个是selectorMc,它使得玩家看清楚植物将要被种到哪一个区块。
我们得增加5个新的变量:
private var plantContainer:Sprite=new Sprite();
private var plant:plantMc;
private var movingPlant:plantMc;
private var playerMoving:Boolean=false;
private var selector:selectorMc;
让我们来看下它们的意思:
plantContainer:一个可视对象,用来当植物的容器
plant:代表植物它本身
movingPlant:也是植物,当玩家买了植物之后,它会跟随鼠标移动
playerMoving:一个布尔型变量,用来记录玩家是否正在移动一株植物
selector:选择器
下面是最终源代码:

package {
        import flash.display.Sprite;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.text.TextField;
        public class Main extends Sprite {
                private var gameField:Array;
                private var flowersTimer:Timer=new Timer(5000);
                private var sun:sunMc;
                private var sunContainer:Sprite=new Sprite();
                private var money:uint=0;
                private var moneyText:TextField=new TextField  ;
                private var plantContainer:Sprite=new Sprite();
                private var plant:plantMc;
                private var movingPlant:plantMc;
                private var playerMoving:Boolean=false;
                private var selector:selectorMc;
                public function Main():void {
                        setupField();
                        drawField();
                        fallingSuns();
                        addText();
                        addPlants();
                        addEventListener(Event.ENTER_FRAME,onEnterFrm);
                }
                private function onPlantClicked(e:MouseEvent):void {
                        if (money>=10&&! playerMoving) {
                                money-=10;
                                updateMoney();
                                selector=new selectorMc();
                                selector.visible=false;
                                plantContainer.addChild(selector);
                                movingPlant=new plantMc() ;
                                plantContainer.addChild(movingPlant);
                                playerMoving=true;
                        }
                }
                private function addPlants():void {
                        addChild(plantContainer);
                        plant=new plantMc();
                        plantContainer.addChild(plant);
                        plant.buttonMode=true;
                        plant.x=90;
                        plant.y=40;
                        plant.addEventListener(MouseEvent.CLICK,onPlantClicked);
                }
                private function addText():void {
                        addChild(moneyText);
                        updateMoney();
                        moneyText.textColor=0xFFFFFF;
                        moneyText.height=20;
                }
                private function updateMoney():void {
                        moneyText.text="Money: "+money.toString();
                }
                private function onEnterFrm(e:Event):void {
                        for (var i:uint=0; i<sunContainer.numChildren; i++) {
                                var fallingSun:sunMc=sunContainer.getChildAt(i) as sunMc;
                                if (fallingSun.y<fallingSun.destinationY) {
                                        fallingSun.y++;
                                } else {
                                        fallingSun.alpha-=0.01;
                                        if (fallingSun.alpha<0) {
                                                fallingSun.removeEventListener(MouseEvent.CLICK,sunClicked);
                                                sunContainer.removeChild(fallingSun);
                                        }
                                }
                        }
                        if (playerMoving) {
                                movingPlant.x=mouseX;
                                movingPlant.y=mouseY;
                                var plantRow:int=Math.floor((mouseY-80)/75);
                                var plantCol:int=Math.floor((mouseX-25)/65);
                                if (plantRow>=0&&plantCol>=0&&plantRow<5&&plantCol<9) {
                                        selector.visible=true;
                                        selector.x=25+plantCol*65;
                                        selector.y=80+plantRow*75;
                                } else {
                                        selector.visible=false;
                                }
                        }
                }
                private function fallingSuns():void {
                        addChild(sunContainer);
                        flowersTimer.start();
                        flowersTimer.addEventListener(TimerEvent.TIMER, newSun);
                }
                private function newSun(e:TimerEvent):void {
                        var sunRow:uint=Math.floor(Math.random()*5);
                        var sunCol:uint=Math.floor(Math.random()*9);
                        sun = new sunMc();
                        sun.buttonMode=true;
                        sunContainer.addChild(sun);
                        sun.x=52+sunCol*65;
                        sun.destinationY=130+sunRow*75;
                        sun.y=-20;
                        sun.addEventListener(MouseEvent.CLICK,sunClicked);
                }
                private function sunClicked(e:MouseEvent):void {
                        e.currentTarget.removeEventListener(MouseEvent.CLICK,sunClicked);
                        money+=5;
                        updateMoney();
                        var sunToRemove:sunMc=e.currentTarget as sunMc;
                        sunContainer.removeChild(sunToRemove);
                }
                private function setupField():void {
                        gameField=new Array();
                        for (var i:uint=0; i<5; i++) {
                                gameField[i]=new Array();
                                for (var j:uint=0; j<9; j++) {
                                        gameField[i][j]=0;
                                }
                        }
                }
                private function drawField():void {
                        var fieldSprite:Sprite=new Sprite();
                        var randomGreen:Number;
                        addChild(fieldSprite);
                        fieldSprite.graphics.lineStyle(1,0xFFFFFF);
                        for (var i:uint=0; i<5; i++) {
                                for (var j:uint=0; j<9; j++) {
                                        randomGreen=(125+Math.floor(Math.random()*50))*256;
                                        fieldSprite.graphics.beginFill(randomGreen);
                                        fieldSprite.graphics.drawRect(25+65*j,80+75*i,65,75);
                                }
                        }
                }
        }
}

跟往常一样,让我们来看下新的代码:

第25行:调用addPlants函数(第40-48行),这将会增加植物选项条。现在,只有一种植物,它就是绿色的圆形(别忘了,我们玩的是“圆形大战方块”)。

第40-48行:addPlants函数把我们唯一能买到的植物加入到显示列表,并且给它注册一个鼠标事件侦听器onPlantClicked。这个侦听函数是代码的核心部分。

让我们来看看onPlantClicked函数是如何工作的:

第29行:当你有足够的钱时你才能买植物,并且不能是你已经买了一株植物,正找个地方放置它。现在,植物的价格是10个金币。

第30-31行:扣掉你买植物所花费的钱,并且更新文本框。

第32-34行:把选择器加入到显示列表,但此刻要使得它不可见。

第34-36行:把植物放到游戏区块中。

第37行:设置playerMoving的值为true,告诉程序我们正在移动一株植物,给它选择一个家。当playerMoving为真时会发生什么呢?在onEnterFrm函数里,一些事因此改变了。

第71-83行:这里是playerMoving为真时所发生的:当我们考虑在要哪个区块放置我们刚刚买到的植物时,我们所买的植物跟随鼠标移动(第74-75行)。如果我们的鼠标滑过一个区块(第76行),我们就使选择器可见,使得该区块高亮显示(第77-79行),否则,我们继续保持选择器不可见(第81行)。

下面是结果:

收集10个金币,然后购买一株植物,把它移向游戏区域。

时间: 2024-09-29 05:07:24

Flash 游戏开发实战(二)的相关文章

Flash游戏开发实战(一)

我不得不承认,我不是植物大战僵尸的骨灰玩家,所以,如果你发现这个系列的教程有什么地方错误的,请告诉我. 定义游戏的主要结构 植物大战僵给了我们很好的视觉和感觉上的享受.你得保护你的房子以免被吃脑的僵尸入侵,这相当的吸引人.总的来说,杀死僵尸是很有趣的.但是这视觉上的东西和游戏玩法无关,我们可以用屠夫大战管子工,鸽子大战骆驼,圆形大战方块来代替. 在这个系列的教程中,我们用圆形来代替植物,用方块来代替僵尸,伟大的圆形将会阻止邪恶的方块进入我们的基地.游戏区域可以被简化为一个区块游戏. 设想一下这种

unity3D游戏开发实战原创视频讲座系列10之《保卫战:异形入侵》游戏开发第一季

讲解目录 <保卫战:异形入侵>游戏开发    1 第一讲   游戏演示和资源的介绍    1 第二讲  "异形"怪物的实现    1 第三讲  "异形"怪物生命值的体现    9 第四讲  "异形"怪物死后处理    12 第五讲  玩家的制作    15 第六讲  玩家的行走控制(键盘)    16 第七讲  武器的切换(鼠标)     16 第八讲  摄像头的变化(鼠标)    19 第九讲  子弹预制体和特效的制作    20

Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现(不定期更新中~~~)

系列目录 Unity3D手机斗地主游戏开发实战(01)_发牌功能实现 Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现 一.大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和动画,并展示当前的手牌.这期我们继续实现接下来的功能--叫地主. 1.首先这两天,学习了DOTween,这是一个强大的Unity动画插件,大家可以参考:官方文档,个人感觉DOTween还是比较好用的. 好的,我们先来重构一下动画部分的代码(没有绝对牛逼的架构和设计,项目过程中不要不断的持续改进嘛

cocos2d 游戏开发实战

文章转自:http://uliweb.clkg.org/tutorial/read/40 6   cocos2d 游戏开发实战 6.1   创建cocos2d项目 6.2   cocos2d v3 "hello world" 6.2.1   显示一个飞船 6.3   精灵 6.4   開始 space viking 之旅 6.4.1   添加 sneakyinput 6.5   精灵的移动效果,旋转效果 6.6   定时器效果 6.7   启动 cocos2d,默认竖屏 6.8   检

[ios5 cocos2d游戏开发实战] 笔记3-FileUtils, notificationCenter

FileUtils //文件管理工具 FileUtils::getInstance() std::string getStringFromFile(const std::string& filename);//读取文件中的字符串 Data getDataFromFile(const std::string& filename);//获取文件数据 void setSearchPaths(const std::vector<std::string>& searchPaths

Cocos2d-x+3.x游戏开发实战pdf

下载地址:网盘下载 内容简介  · · · · · · <Cocos2d-x 3.x游戏开发实战>是一本介绍Cocos2d-x游戏引擎的实用图书,全面介绍了最新的Cocos2d-x 3.2游戏引擎各方面的知识. <Cocos2d-x 3.x游戏开发实战>从内容层次上可分为四个部分.第一部分介绍了游戏开发的基础知识.游戏引擎概念.Cocos2d-x的下载与安装,以及跨平台开发环境的搭建.第二部分介绍了Cocos2d-x中的核心类.动作.动画.3D特效.文字.字体.菜单.事件处理.UI

《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内容主要都是介绍如何在屏幕上显示图像,事实上除了图像之外,音乐的播放也可以被理解为一种显示的方式,本节将学习在Cocos2d-x中播放声音的方法. (1)在HelloWorld.h中对HelloWorld类进行如下定义: class HelloWorld : public Cocos2d::Layer { pu

《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像

Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目录下的项目ChapterThree03就展示了使用Cocos2d-x实现简单游戏开始界面的方法,主要就是通过精灵类来显示图像,其关键代码如范例3-5所示. [范例3-5 在Cocos2d-x中显示图像] Size size = Director::getInstance()->getVisibleS

HTML5游戏开发实战--注意点

1.WebSocket是HTML5标准的一部分,Web页面可以用它来持久连接到socket服务器上.该接口提供了浏览器与服务器之间的事件驱动型连接,这意味着客户端不必再每隔一个时间段就需要向服务器发送一次新的数据请求.当有数据需要更新时,服务器就可以直接推送数据更新给浏览器.该功能的好处之一就是玩家之间可以实时进行交互.当一个玩家做了些事,就会向服务器发送数据,服务器将广播一个事件给其他已连接的所有浏览器,让它们知道玩家做了什么.这样就使得制作HTML5网络游戏成为可能. 2.随着现代浏览器对H