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

jiumiao3 发布于 2013/10/29 11:38
阅读 636
收藏 1
抱歉啊,本来周末要出东西的,结果有事,提前把星期一的事情弄完了,so星期一闲下来了,那么今天大放送一下,连写三章。大家回神了,继续我们的游戏了!上一章我们已经把飞溅屏(Splashscreen)搞定了,这章我们说说一些辅助的东西。

一、Globals(全局参数类)

Globals是一个标准的单例模式出来的东西(当然如果用常量类也是可以的,看个人喜好吧),像单例这个东西到底是有哪种形式,大家自己看情况而定,只要能实现功能就行。这里用的如代码示例:
  1. public final class Globals
    {
        private static var _instance:Globals;
    
        public static function get instance():Globals // 类静态属性方式,我个人比较喜欢这样,也可以用方法的形式
        {
            _instance ||= new Globals();
    
            // 这句可以看出是这样的写法
            // if (_instance == null)
            // {
            //       _instance = new Globals();
            //  }
           
            return _instance;
        }
    
        public function Globals()
        {
             if (_instance != null) // 确保_instance对象唯一,如果再出现new Globals()的情况就报错。
                 throw new Error('The "Globals" is a singleton class.');
        }
    }
    复制代码
我们在哪里开始用呢?就在Main里面,大家回到Main的initialize()的位置:
  1. private var _globals:Globals;
    
    private function initialize():void
    {
        _globals = Globals.instance; // 这里就直接调用了,Main后面要用到的
    
        // 原来的语句
    }
    复制代码
如此,Globals的单例就搞定了。

1.1 统一路径管理

统一一下路径,方便我们管理,不管是在页游还是手游中都是很有用处的。放在Globals里我们用着方便,舒心啊~~
我们在app.game.core下建立一个Path接口和一个PathImpl实现类。来看代码实现:
  1. // 为什么要用接口呢?
    // 答:我们后面要改项目为其他版本的,尤其是网页版的,加载文件过程要有一点变更,用接口更方便一点,只要换一下实现类,其他代码可以不用变的,是不是很爽?
    // 一般统一路径都是针对所有需要加载的东西,这里也是这样。
    // 当然在页游中,由于有浏览器缓存的问题存在,所在这个里面可能还要对版本控制做处理的,这个问题在后面章节里会说。
    public interface Path
    {
        // 游戏安装后所在目录
        function get root():File;
    
        // 资源所在目录
        function get assets():File;
    
        // 静态数据所在目录
        function get datas():File;
    
        // 图片所在目录
        function get images():File;
    
        // 国际化文件所在目录
        function get locales():File;
    
        // 音频文件所在目录
        function get sounds():File;
    
        // 游戏初始化配置文件
        function get settings():File;
        
        // 拼接目录方法
        function resolve(base:File, path:String):File;
    }
    复制代码
接口定义好了,我们来看下PathImpl类,这个类具体的请看后面的下载,这里着重提出两点希望大家注意,看代码:
  1. [ExcludeClass] // 这个是AS的一个元标签,说明一点,就是在我们的代码提示,或者引用的时候开发工具是不会找到这个类的,但只要用了,编译出来的SWF中还是会有这个类参加的
    internal final class PathImpl implements Path // 请注意internal,说明我们这里类是不能在外部看见的
    {
       // ....... 具体内容请看下载的代码示例
    }
    复制代码
然后我们在Globals中添加调用,让Path起作用:
  1. private var _path:Path = new PathImpl();
    
    public function get path():Path
    {
        return _path;
    }
    复制代码
哈哈,统一路径问题搞定。我们可以回到Main里面把飞溅屏的图片路径自己改改(后面下载的代码里是改过的)。

1.2 国际化支持

一个好的游戏,运营给力的话肯定要有国际化支持的,尽管我们的游戏可能走不了那么远,做这么一步也费不了多少事情的,多掌握一点没有什么坏事的。继续在Globals干活:
  1. private static const LOCALE_EXT:String = "{0}.properties"; // 我们所有的国际化文件后缀名
    
    private var _locale:Properties; // Properties类在app.game.utils包下,仿照Java写的,没有Java那么多方法,AS要比Java灵活太多了。
    
    // 初始化国际化信息
    public function initLocale(locale:String):void
    {
        // ...
    }
    
    // 根据属性Key得到国际化文字
    public function msg(key:String):String
    {
        return _locale.getProperty(key, key);
    }
    复制代码
怎么用呢,还是看看代码吧,这个不详细说了,千言万语都在代码中了。

1.3 统一字体

统一字体,可以让玩家对整个游戏有一个非常好的评价,千万别一会黑体,一会幼圆,一会又是宋体的,这样不说玩家会崩溃,开发的会直接崩溃到死的。
Globals里面只会对字体命名做一个明确的指出,怎么用还是代码,这个比较简单(页游里面对这个有另外说明)。

1.4 统一可视对象缩放比例(这个可选,为了像我这样13本本显示不全的人准备的)

这个可选情况的,不会出现在我们将来的游戏中,看代码处理。这里不做详细说明。

二、Socket

原生的Socket类有几点不太符合我们的要求,一没有办法自动发送消息,二没有办法自动重连(有次数限制的),三没有办法判断是否是服务器断开还是客户端主动断开,所以为了这三点扩展了一下原生的Socket类,还是叫Socket类。下面是代码示例,请大家注意观察。
  1. public class Socket extends flash.net.Socket
    {
        // 这里只把重要的部分列举出来
        
        // 是否自动发送消息
        public function get automatic():Boolean
        {
             return _automatic;
        }
    
        // 重连次数,默认是0,不重连
        public function get reconnect():uint
        {
            return _reconnect;
        }
    
        override public function writeBoolean(value:Boolean):void
        {
             super.writeBoolean(value);
             if (automatic) flush();
        }
    
        // 剩下那些一大堆的write....方法
    }
    复制代码
同时还需要一个SocketEvent类,来帮助我们判断断开连接的情况,这个比较简单,不做详细描述了。

三、Message

Message类是游戏中所有跟服务器的消息类的父类,是一个标准的抽象类(AS里只能用技术手段来创建抽象类)。这个消息将来会被格式化为JSON格式,交给服务器。直接看看代码:
  1. public class Message
    {
        public function Message()
        {
             if (Object(this).constructor == Message) // 判断实例的构造是否为类本身,如果是不符合抽象类的一个条件,直接报错
                 throw new Error('The "Message" class an abstract class.');
        }
    
        protected var _id:uint;
    
        // 每个消息都有唯一的消息号,这个就是表示消息好的,但是消息号是不能格式到JSON结构里,这里我们就需要一个元标签
        [Transient]
        public function get id():uint
        {
            return _id;
        }
    
        public function set id(value:int):void
        {
            // ....
        }
    
        public function encode():String
        {
            return JSON.stringify(this); // 格式化消息
        }
    
        public function decode(struct:String):Object
        {
             return JSON.parse(struct); // 解析字符串为JSON结构
        }
    }
    复制代码
每一个消息都是继承Message下来,这样消息就有一个公共的父类来帮助我们管理所有消息了。

此章结束了,大家好好看看代码理解一下,下面是此章代码下载:

 diabloworld-desktop-air.zip (33.97 MB, )

9秒下载链接:http://www.9miao.com/thread-44112-1-1.html


加载中
返回顶部
顶部