游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2125|回复: 0

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

[复制链接]

119

主题

119

帖子

694

积分

版主

Rank: 7Rank: 7Rank: 7

积分
694
发表于 2013-10-29 11:22:29 | 显示全部楼层 |阅读模式
本帖最后由 openfirefly 于 2013-10-29 11:26 编辑

抱歉啊,本来周末要出东西的,结果有事,提前把星期一的事情弄完了,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 _pathath = new PathImpl();public function get path()ath{    return _path;}
    复制代码


哈哈,统一路径问题搞定。我们可以回到Main里面把飞溅屏的图片路径自己改改(后面下载的代码里是改过的)。

1.2 国际化支持

一个好的游戏,运营给力的话肯定要有国际化支持的,尽管我们的游戏可能走不了那么远,做这么一步也费不了多少事情的,多掌握一点没有什么坏事的。继续在Globals干活:
    1. private static const LOCALE_EXT:String = "{0}.properties"; // 我们所有的国际化文件后缀名private var _localeroperties; // 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下来,这样消息就有一个公共的父类来帮助我们管理所有消息了。

此章结束了,大家好好看看代码理解一下,下面是此章代码下载:
游客,如果您要查看本帖隐藏内容请回复






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-27 10:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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