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

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

一、Globals(全局参数类)

Globals是一个标准的单例模式出来的东西(当然如果用常量类也是可以的,看个人喜好吧),像单例这个东西到底是有哪种形式,大家自己看情况而定,只要能实现功能就行。这里用的如代码示例:

  1. public final class Globals
  2. {
  3.     private static var _instance:Globals;

  4.     public static function get instance():Globals // 类静态属性方式,我个人比较喜欢这样,也可以用方法的形式
  5.     {
  6.         _instance ||= new Globals();

  7.         // 这句可以看出是这样的写法
  8.         // if (_instance == null)
  9.         // {
  10.         //       _instance = new Globals();
  11.         //  }
  12.        
  13.         return _instance;
  14.     }

  15.     public function Globals()
  16.     {
  17.          if (_instance != null) // 确保_instance对象唯一,如果再出现new Globals()的情况就报错。
  18.              throw new Error('The "Globals" is a singleton class.');
  19.     }
  20. }
复制代码
我们在哪里开始用呢?就在Main里面,大家回到Main的initialize()的位置:

  1. private var _globals:Globals;

  2. private function initialize():void
  3. {
  4.     _globals = Globals.instance; // 这里就直接调用了,Main后面要用到的

  5.     // 原来的语句
  6. }
复制代码
如此,Globals的单例就搞定了。

1.1 统一路径管理

统一一下路径,方便我们管理,不管是在页游还是手游中都是很有用处的。放在Globals里我们用着方便,舒心啊~~
我们在app.game.core下建立一个Path接口和一个PathImpl实现类。来看代码实现:

  1. // 为什么要用接口呢?
  2. // 答:我们后面要改项目为其他版本的,尤其是网页版的,加载文件过程要有一点变更,用接口更方便一点,只要换一下实现类,其他代码可以不用变的,是不是很爽?
  3. // 一般统一路径都是针对所有需要加载的东西,这里也是这样。
  4. // 当然在页游中,由于有浏览器缓存的问题存在,所在这个里面可能还要对版本控制做处理的,这个问题在后面章节里会说。
  5. public interface Path
  6. {
  7.     // 游戏安装后所在目录
  8.     function get root():File;

  9.     // 资源所在目录
  10.     function get assets():File;

  11.     // 静态数据所在目录
  12.     function get datas():File;

  13.     // 图片所在目录
  14.     function get images():File;

  15.     // 国际化文件所在目录
  16.     function get locales():File;

  17.     // 音频文件所在目录
  18.     function get sounds():File;

  19.     // 游戏初始化配置文件
  20.     function get settings():File;
  21.     
  22.     // 拼接目录方法
  23.     function resolve(base:File, path:String):File;
  24. }
复制代码
接口定义好了,我们来看下PathImpl类,这个类具体的请看后面的下载,这里着重提出两点希望大家注意,看代码:

  1. [ExcludeClass] // 这个是AS的一个元标签,说明一点,就是在我们的代码提示,或者引用的时候开发工具是不会找到这个类的,但只要用了,编译出来的SWF中还是会有这个类参加的
  2. internal final class PathImpl implements Path // 请注意internal,说明我们这里类是不能在外部看见的
  3. {
  4.    // ....... 具体内容请看下载的代码示例
  5. }
复制代码
然后我们在Globals中添加调用,让Path起作用:

  1. private var _path:Path = new PathImpl();

  2. public function get path():Path
  3. {
  4.     return _path;
  5. }
复制代码
哈哈,统一路径问题搞定。我们可以回到Main里面把飞溅屏的图片路径自己改改(后面下载的代码里是改过的)。

1.2 国际化支持

一个好的游戏,运营给力的话肯定要有国际化支持的,尽管我们的游戏可能走不了那么远,做这么一步也费不了多少事情的,多掌握一点没有什么坏事的。继续在Globals干活:

  1. private static const LOCALE_EXT:String = "{0}.properties"; // 我们所有的国际化文件后缀名

  2. private var _locale:Properties; // Properties类在app.game.utils包下,仿照Java写的,没有Java那么多方法,AS要比Java灵活太多了。

  3. // 初始化国际化信息
  4. public function initLocale(locale:String):void
  5. {
  6.     // ...
  7. }

  8. // 根据属性Key得到国际化文字
  9. public function msg(key:String):String
  10. {
  11.     return _locale.getProperty(key, key);
  12. }
复制代码
怎么用呢,还是看看代码吧,这个不详细说了,千言万语都在代码中了。

1.3 统一字体

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

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

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

二、Socket

原生的Socket类有几点不太符合我们的要求,一没有办法自动发送消息,二没有办法自动重连(有次数限制的),三没有办法判断是否是服务器断开还是客户端主动断开,所以为了这三点扩展了一下原生的Socket类,还是叫Socket类。下面是代码示例,请大家注意观察。

  1. public class Socket extends flash.net.Socket
  2. {
  3.     // 这里只把重要的部分列举出来
  4.     
  5.     // 是否自动发送消息
  6.     public function get automatic():Boolean
  7.     {
  8.          return _automatic;
  9.     }

  10.     // 重连次数,默认是0,不重连
  11.     public function get reconnect():uint
  12.     {
  13.         return _reconnect;
  14.     }

  15.     override public function writeBoolean(value:Boolean):void
  16.     {
  17.          super.writeBoolean(value);
  18.          if (automatic) flush();
  19.     }

  20.     // 剩下那些一大堆的write....方法
  21. }
复制代码
同时还需要一个SocketEvent类,来帮助我们判断断开连接的情况,这个比较简单,不做详细描述了。

三、Message

Message类是游戏中所有跟服务器的消息类的父类,是一个标准的抽象类(AS里只能用技术手段来创建抽象类)。这个消息将来会被格式化为JSON格式,交给服务器。直接看看代码:

  1. public class Message
  2. {
  3.     public function Message()
  4.     {
  5.          if (Object(this).constructor == Message) // 判断实例的构造是否为类本身,如果是不符合抽象类的一个条件,直接报错
  6.              throw new Error('The "Message" class an abstract class.');
  7.     }

  8.     protected var _id:uint;

  9.     // 每个消息都有唯一的消息号,这个就是表示消息好的,但是消息号是不能格式到JSON结构里,这里我们就需要一个元标签
  10.     [Transient]
  11.     public function get id():uint
  12.     {
  13.         return _id;
  14.     }

  15.     public function set id(value:int):void
  16.     {
  17.         // ....
  18.     }

  19.     public function encode():String
  20.     {
  21.         return JSON.stringify(this); // 格式化消息
  22.     }

  23.     public function decode(struct:String):Object
  24.     {
  25.          return JSON.parse(struct); // 解析字符串为JSON结构
  26.     }
  27. }
复制代码
每一个消息都是继承Message下来,这样消息就有一个公共的父类来帮助我们管理所有消息了。

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

 diabloworld-desktop-air.zip (33.97 MB, 下载次数: 37)


9秒链接:www.9miao.com



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值