游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2613|回复: 1

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

[复制链接]

119

主题

119

帖子

694

积分

版主

Rank: 7Rank: 7Rank: 7

积分
694
发表于 2013-10-29 11:21:48 | 显示全部楼层 |阅读模式
本帖最后由 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了:
    1. [SWF(width = "480", height = "800", frameRate = "60", backgroundColor = "0x000000")]public class Main extends Sprite{    // ......}
    复制代码


这句话就是说明,我们游戏的宽为480px,高800px,帧为60,背景为黑色,当然你可以随心所欲的更改。

  AS游戏有个很重要的点,就是我们所有的干活必须要等Adobe他们把我们的舞台(stage)初始化好。不然,你啥都别想干了。所以我们在Main里面干的第一件事情理论上来说就是检测stage是否存在的问题。如下面的代码所示:
    1. 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(...) 这样的语句别害怕啊,其实写成这样,就明白了:
    1. 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的游戏都是这两句:
    1. stage.align = StageAlign.TOP_LEFT; // 舞台位置定于左上角stage.scaleMode = StageScaleMode.NO_SCALE; // 舞台不缩放
    复制代码


大家都想出名的,所以很多游戏刚开始的时候都会有一个图来显示公司的logo之类的,我们就不免俗了,也来这么一套。嘿嘿就帮大鸡蛋再出个名吧!就用Default.png文件(取自《暗黑》)。

  我们继续在initialize()方法里添加代码吧,如下所示:
    1. // 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了。请看如下代码:
    1. 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。如代码所示:
    1. 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。
游客,如果您要查看本帖隐藏内容请回复





0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2014-9-11 09:06:07 | 显示全部楼层
谢谢分享。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-4-25 18:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表