我们一起来游戏 (二)——(AS3零基础做AIR卡牌网游)

感谢大家的支持,后面会继续更新,请大家放心。整个系列更新将持续15~20天时间。不过最近有点小忙,更新频率可能不定,但一般不会超过两天。

   修改昨天的一个错误:
  不管用的是那个版本的Flash Builder 4.7,请无视第四步到第七步,不需要作此修改。原因是我把后面的一部分内容看错,提前发出来了,在这里向大家表示道歉,原帖正在修改中,给大家带来的误解尽情原谅。


  不说废话,昨天已经把我们需要的环境搭建好了,我们今天就开始来写代码吧!

一、代码结构规划

  如图所示,请手动建立这些包。



  app.game:游戏除初始化类以外的所有类;
  app.game.core:存放一下游戏的核心类;
  app.game.events:存放游戏所需要的事件类,这些类包括从AS3的Event原生继承下来的,也包括Starling的Event继承下来的;
  app.game.mvc:游戏MVC的核;
  app.game.mvc.controllers:游戏MVC中的控制器;
  app.game.mvc.models.data:游戏MVC中的模型之静态数据;
  app.game.mvc.models.env:游戏MVC中的模型之系统初始化数据;
  app.game.mvc.models.message:游戏MVC中的模型之与服务器交互的数据类;
  app.game.mvc.views:游戏MVC中的视图;
  app.game.uis:游戏里面所有UI存放的地方,这个地址将UI和View分开,可以很快速的更换UI的所有部分,View里面可以少量更改,或者不更改都不影响整个游戏;
  app.game.uis.controls:游戏里面自定义的控件;
  app.game.uis.controls.renderers:游戏里用的一些渲染器;
  app.game.utils:游戏工具包。

  这里其实还有一种分法,就是每一个功能模块下各有一个mvc包,这样的分发更适合中大型游戏,一个人有一个独立的模块这样去做。像我们的《暗黑》其实没有必要这样分,有点浪费,更显得凌乱。毕竟《暗黑》不是一个大游戏啊。

二、初始化

  我们先预设一下我们的游戏大小,背景颜色,和帧之类的东西。在Main类声明上面填上这么一句就OK了:

  1. [SWF(width = "480", height = "800", frameRate = "60", backgroundColor = "0x000000")]

  2. public class Main extends Sprite
  3. {
  4.     // ......
  5. }
复制代码
这句话就是说明,我们游戏的宽为480px,高800px,帧为60,背景为黑色,当然你可以随心所欲的更改。

  AS游戏有个很重要的点,就是我们所有的干活必须要等Adobe他们把我们的舞台(stage)初始化好。不然,你啥都别想干了。所以我们在Main里面干的第一件事情理论上来说就是检测stage是否存在的问题。如下面的代码所示:

  1. public function Main()
  2. {
  3.     stage ? initialize() : addEventListener(Event.ADDED_TO_STAGE, function(e:Event):void
  4.     {
  5.         e.target.removeEventListener(Event.ADDED_TO_STAGE, arguments.callee);
  6.         initialize();
  7.     });
  8. }
复制代码
初碰AS3的人童鞋们看见 stage ? initialize() : addEventListener(...) 这样的语句别害怕啊,其实写成这样,就明白了:

  1. public function Main()
  2. {
  3.     if (stage != null) // 这句也可以写成 if (stage) { ... }
  4.     {
  5.         initialize();
  6.     }
  7.     else
  8.     {
  9.         addEventListener(Event.ADDED_TO_STAGE, function(e:Event):void 
  10.             {
  11.                  e.target.removeEventListener(Event.ADDED_TO_STAGE, arguments.callee); 
  12.                  // arguments是function的一个内置对象,在AS里面一个function是一个Function实例,代表的意思是这个方法的参数
  13.                  // arguments.callee 说明方法参数在寻找调用的方法

  14.                  initialize();
  15.             }
  16.         );
  17.     }
  18. }
复制代码
友情提示一点:事件监听用完,如果不在复用,请及时删除掉,可以节省一点点的内存,从小地方做起,就不用后面费很大的功夫,做游戏优化了。

  开始执行initialize()方法了。好了,我们现在已经可以确保在stage上活动了,那么设置一下,stage的align和scaleMode,基本上所有的AS的游戏都是这两句:

  1. stage.align = StageAlign.TOP_LEFT; // 舞台位置定于左上角
  2. stage.scaleMode = StageScaleMode.NO_SCALE; // 舞台不缩放
复制代码
大家都想出名的,所以很多游戏刚开始的时候都会有一个图来显示公司的logo之类的,我们就不免俗了,也来这么一套。嘿嘿就帮大鸡蛋再出个名吧!就用Default.png文件(取自《暗黑》)。

  我们继续在initialize()方法里添加代码吧,如下所示:

  1. // ImageLoader 类在app.game.utils,提供图片加载的快速方法;
  2. // FileUtil 类在app.game.utils,提供快速加载文件方法
  3. // 这两个类的使用方法,请见类注释
  4. ImageLoader.load(FileUtil.reader(File.applicationDirectory.resolvePath("assets/images/default.png")),
  5.     {
  6.         "complete": function(data:*):void
  7.             {
  8.                  stage.addChildAt(new Bitmap(data.content.bitmapData.clone()), stage.numChildren - 1); // 确保图显示的时候在最下面一层

  9.                  startStarling();
  10.             }
  11.     }
  12. );
复制代码
这样图就显示出来了(在下载的代码中,图片加上了一些特效)。来继续玩,开始启动Starling,这个才是重点的。

  新建一个DiabloWorld类跟Main同级包下面,必须继承自starling.display.Sprite类,一定要注意父类,千万别继承自flash.display.Sprite类。由DiabloWorld来做游戏的Starling和StarlingMVC启动器。如果你已经了解了StarlingMVC,请为它提供ModelProvider,ViewProvider和ControllerProvider(请自行建立这3个类在app.game.mvc包下,需要继承com.creativebottle.starlingmvc.beans.BeanProvider)。这里不在详述StarlingMVC了。请看如下代码:

  1. public class DiabloWorld extends starling.display.Sprite // 注意继承的父类
  2. {
  3.     public function DiabloWorld()
  4.     {
  5.         stage ? initialize() : addEventListener(starling.events.Event.ADDED_TO_STAGE, function(e:Event):void // 注意使用的Event类的所在包
  6.             {
  7.                 e.target.removeEventListener(starling.events.Event.ADDED_TO_STAGE, arguments.callee);
  8.                 initialize();
  9.             }
  10.         );
  11.     }

  12.     private var _mvc:StarlingMVC;
  13.     private var _conf:StarlingMVCConfig; // MVC的配置信息

  14.     private function initialize():void
  15.     {
  16.         _conf = new StarlingMVCConfig();
  17.         _conf.viewPackages = ["app.game.uis"];  // 提供UI所在包给MVC核
  18.         _conf.eventPackages = ["app.game.events"]; // StarlingMVC需要做事件的严格检查,在运行时检查

  19.         _mvc = new StarlingMVC(this, _conf), 
  20.             [
  21.                 new ModelProvider(),        // 数据配置源
  22.                 new ViewProvider(),          //  视图配置源
  23.                 new ControllerProvider(),  // 控制器配置源
  24.                 new ViewManager(this)    //  注意这句,我们把根视图,也就是DiabloWorld实例交给StarlingMVC管理
  25.             ]
  26.         );
  27.     }
  28. }
复制代码
如此StarlingMVC已经完成了初始化使命,我们回到Main里面对这个进行调用,让它起作用。还记得上面演示代码中的startStarling()方法吗,对,就是它,我们在这个里面调用DiabloWorld。如代码所示:

  1. private var _starling:Starling;

  2. private function startStarling():void
  3. {
  4.     _starling = new Starling(DiabloWorld, stage, new Rectangle(0, 0, stage.nativeWindow.width, stage.nativeWindow.height));
  5.     _starling.stage3D.addEventListener(Event.CONTEXT3D_CREATE, function(event:Event):void 
  6.         {
  7.             _starling.showStats = false;
  8.             _starling.start(); // 到此我们的Starling和StarlingMVC就已经全部启动起来了
  9.         }
  10.     );

  11.     // 当窗口获得焦点时,starling启动
  12.     NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, function(e:Event):void { _starling.start(); });

  13.     // 当窗口失去焦点是,starling关闭
  14.     NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, function(e:Event):void { _starling.stop(); });
  15. }
复制代码

运行一下,我们想要的效果出来,今天就先到这里了。下面是今天说到的完整代码,如果有不明白的地方,可以直接回帖,私信,或者在QQ群中@北京-Z。


 diabloworld-desktop-air.zip (33.95 MB, 下载次数: 425)


9秒链接:www.9miao.com


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值