|
本帖最后由 openfirefly 于 2013-10-29 11:49 编辑
感谢大家的支持,后面会继续更新,请大家放心。整个系列更新将持续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了:- [SWF(width = "480", height = "800", frameRate = "60", backgroundColor = "0x000000")]public class Main extends Sprite{ // ......}
复制代码
这句话就是说明,我们游戏的宽为480px,高800px,帧为60,背景为黑色,当然你可以随心所欲的更改。
AS游戏有个很重要的点,就是我们所有的干活必须要等Adobe他们把我们的舞台(stage)初始化好。不然,你啥都别想干了。所以我们在Main里面干的第一件事情理论上来说就是检测stage是否存在的问题。如下面的代码所示:- public function Main(){ stage ? initialize() : addEventListener(Event.ADDED_TO_STAGE, function(e:Event):void { e.target.removeEventListener(Event.ADDED_TO_STAGE, arguments.callee); initialize(); });}
复制代码
初碰AS3的人童鞋们看见 stage ? initialize() : addEventListener(...) 这样的语句别害怕啊,其实写成这样,就明白了:- public function Main(){ if (stage != null) // 这句也可以写成 if (stage) { ... } { initialize(); } else { addEventListener(Event.ADDED_TO_STAGE, function(e:Event):void { e.target.removeEventListener(Event.ADDED_TO_STAGE, arguments.callee); // arguments是function的一个内置对象,在AS里面一个function是一个Function实例,代表的意思是这个方法的参数 // arguments.callee 说明方法参数在寻找调用的方法 initialize(); } ); }}
复制代码
友情提示一点:事件监听用完,如果不在复用,请及时删除掉,可以节省一点点的内存,从小地方做起,就不用后面费很大的功夫,做游戏优化了。
开始执行initialize()方法了。好了,我们现在已经可以确保在stage上活动了,那么设置一下,stage的align和scaleMode,基本上所有的AS的游戏都是这两句:- stage.align = StageAlign.TOP_LEFT; // 舞台位置定于左上角stage.scaleMode = StageScaleMode.NO_SCALE; // 舞台不缩放
复制代码
大家都想出名的,所以很多游戏刚开始的时候都会有一个图来显示公司的logo之类的,我们就不免俗了,也来这么一套。嘿嘿就帮大鸡蛋再出个名吧!就用Default.png文件(取自《暗黑》)。
我们继续在initialize()方法里添加代码吧,如下所示:- // ImageLoader 类在app.game.utils,提供图片加载的快速方法;// FileUtil 类在app.game.utils,提供快速加载文件方法// 这两个类的使用方法,请见类注释ImageLoader.load(FileUtil.reader(File.applicationDirectory.resolvePath("assets/images/default.png")), { "complete": function(data:*):void { stage.addChildAt(new Bitmap(data.content.bitmapData.clone()), stage.numChildren - 1); // 确保图显示的时候在最下面一层 startStarling(); } });
复制代码
这样图就显示出来了(在下载的代码中,图片加上了一些特效)。来继续玩,开始启动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了。请看如下代码:- public class DiabloWorld extends starling.display.Sprite // 注意继承的父类{ public function DiabloWorld() { stage ? initialize() : addEventListener(starling.events.Event.ADDED_TO_STAGE, function(e:Event):void // 注意使用的Event类的所在包 { e.target.removeEventListener(starling.events.Event.ADDED_TO_STAGE, arguments.callee); initialize(); } ); } private var _mvc:StarlingMVC; private var _conf:StarlingMVCConfig; // MVC的配置信息 private function initialize():void { _conf = new StarlingMVCConfig(); _conf.viewPackages = ["app.game.uis"]; // 提供UI所在包给MVC核 _conf.eventPackages = ["app.game.events"]; // StarlingMVC需要做事件的严格检查,在运行时检查 _mvc = new StarlingMVC(this, _conf), [ new ModelProvider(), // 数据配置源 new ViewProvider(), // 视图配置源 new ControllerProvider(), // 控制器配置源 new ViewManager(this) // 注意这句,我们把根视图,也就是DiabloWorld实例交给StarlingMVC管理 ] ); }}
复制代码
如此StarlingMVC已经完成了初始化使命,我们回到Main里面对这个进行调用,让它起作用。还记得上面演示代码中的startStarling()方法吗,对,就是它,我们在这个里面调用DiabloWorld。如代码所示:- private var _starling:Starling;private function startStarling():void{ _starling = new Starling(DiabloWorld, stage, new Rectangle(0, 0, stage.nativeWindow.width, stage.nativeWindow.height)); _starling.stage3D.addEventListener(Event.CONTEXT3D_CREATE, function(event:Event):void { _starling.showStats = false; _starling.start(); // 到此我们的Starling和StarlingMVC就已经全部启动起来了 } ); // 当窗口获得焦点时,starling启动 NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, function(e:Event):void { _starling.start(); }); // 当窗口失去焦点是,starling关闭 NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, function(e:Event):void { _starling.stop(); });}
复制代码
运行一下,我们想要的效果出来,今天就先到这里了。下面是今天说到的完整代码,如果有不明白的地方,可以直接回帖,私信,或者在QQ群中@北京-Z。
|
|