About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Feb

    27

    管理 Feathers 资源的两种主要方式:一种是静态嵌入,另一种运行时动态加载。

    静态嵌入

    在 Feathers 中只需如下类似代码即可完成对主题资源的使用(现在新版的 Feathers 已经不需要一个类对象或对象的属性去保存对一个主题的引用了,直接 new 就可以):

    new MetalWorksMobileTheme()

    这种方式比较简单,适合初学者或资源文件不大的情况下。但这种方式要求更多的内存(基本上就是翻倍的内存要求),所以不适合资源文件非常大的情况:Flash 运行时环境在运行 SWF 文件时会存储整个 SWF 文件,当一个嵌入的资源文件被实例化的时候,它又会被复制一份到内存中,所以这种静态嵌入资源对内存的使用基本上会让内存翻一倍。

    在 MetalWorksMobileTheme 默认的这个主题中因为资源文件较小,所以影响不大,但一个自定义的主题资源文件可能会有非常大的内存需求,特别是在开发游戏时的那些大型资源,建义都使用运行时动态加载。

    运行时动态加载

    通过 Starling 的 AssetManager 类在运行时可以动态的加载资源文件,资源文件可以通过 URL 加载(网络服务器上的资源),在 AIR 环境里也可以直接加载本地文件系统中的资源文件。这种方式相对于静态嵌入资源的方式优点是使用内存较少,因为它只会在内存中出现一次,缺点是使用资源管理对象时会相对来说稍复杂一些。

    首先需要指定资源的位置,在一个 AIR 程序中,需要同时打包被引用的资源文件,比如,MetalWorksMobileThemeWithAssetManager 需要以下两个资源文件(MetalWorksMobileTheme 继承自 MetalWorksMobileThemeWithAssetManager ) 

    images/metalworks.xml
    images/metalworks.png

    然后通过下面的代码来告诉主题 images 目录(包含了上面两个文件)的位置在 File.applicationDirectory 下(当然这个资源文件的位置也可以放在其它子目录中):

    var theme:MetalWorksMobileThemeWithAssetManager =
        new MetalWorksMobileThemeWithAssetManager( File.applicationDirectory );

    然后侦听 theme 对象的 Event.COMPLETE 事件:

    theme.addEventListener( Event.COMPLETE, theme_completeHandler );

    当资源文件被加载完成后,并且可用于组件时,资源管理对象调度这个事件,换句话说,开发者必须等待这个事件调度后才能使用资源文件中的东西,否则就不会有任何纹理或其它东西可以提供给组件的皮肤,事件的侦听器可能是如下类似代码:

    private function theme_completeHandler( event:Event ):void
    {
        // the theme is ready!
        this.button = new Button();
        this.button.label = "Click Me";
        this.addChild( button );
    }

     PS:春节前我才刚升级到 Starling 1.6.0 与 Feathers 2.0.1 版本,过完春节后发现它们又分别升级到了 1.6.1 与 2.1.0 版本(并且 Feathers 已经开始出了 2.2 的测试版本),看来还是有不少人在用的样子 

    Feb

    27

    Feb

    16

    碎碎念:物理引擎

    • 1 Comments
    • Babblings

    花了一整天的时间看了《Box2D for Flash Games》中文译版与 Nape 引擎在 9RIA 专题栏所有贴子,感觉就像当初看到 Starling 与 Feathers 资料时一样有点小激动 

    Feb

    16

    Nape 的基本使用方法与 Box2D 类似,但它的性能比 Box2D 高 3-6 倍,内存少 2-3 倍。Nape 官方联机手册上的原文:

    We expect the performance of Nape to be somewhere between 3 and 6 times faster than Box2D on average, whilst using about half the amount of memory (And importantly, having constant memory size). You may also expect the equivalent solution to a problem in Nape to be 2-3 times smaller than in Box2D.

    除了性能,个人喜欢它的原因还包括:

    1、Nape 基于 Haxe 语言编写,提供了 AS3 使用的 swc 库文件(因为是Haxe 编码,意味着被反编译的难度更高)。

    2、Nape 创建刚体的代码量比 Box2D更少,更简单(可以省去 Box2D 中那些大量的 Def 概念上对象的创建)。

    3、Nape 以像素为单位,不像 Box2D 那样以米单位,就不需要进行转换。

    4、Nape 的碰撞检测过程事件类型更丰富、更强大。

    5、最重要的是习惯问题:Nape 的 API 的语法规范更接近于 Adobe 官方和大多数开发者的习惯。而 Box2D 包名和方法名首字母居然是大写,而类名首字母却是小写的(好奇葩啊~),并且它的源码中所有属性定义都写在方法定义之后(俺表示无法接受)。

    相关链接:

    官方资料:http://napephys.com/help.html

    中文资料:http://www.ladeng6666.com/blog/category/nape/

    Feb

    15

    Box2D 主要概念名词列表

    • 0 Comments
    • Flash Platform

    以下是它的一些常用概念名词列表(实在太多,无法一一例出):

    b2Vec2:向量对象(类似 Point 类,但它只有两个参数分别描述水平与垂直方向上的值,可用于创建顶点,创建重力模似等等)。

    b2World:Box2D 世界(第一个参数为向量对象,模似重力等;第二个决定世界中的对象是否允许进入睡眠状态)。

    b2BodyDef:概念上的刚体(rigid body),只是定义刚体的信息(如:位置)。

    b2CircleShape:圆形的形状(一个Shape,决定刚体的显示形状),一个参数决定它的半径。

    b2PolygonShape:多边形形状。

    b2FixtureDef:夹具(fixture),用于关联概念上的刚体与形状对象(将形状关联到概念上的刚体)。

    注:密度、摩擦系数、恢复系数是定义在夹具上的,不是定义在概念上的刚体对象上。

    b2Body:刚体的实体(概念上的刚体与形状对象通过夹具关联起来,生成一个具体的实体)。

    b2DebugDraw:一个支持调试绘图的类。

    注1:刚体调试使用的颜色:static 类型为绿色;dynamic 类型没有睡眠时为红色,睡眠状态时为灰色;kinematic 类型为蓝色。

    注2:鼠标关节用蓝绿色的线。

    b2Contact:接触 / 触点对象(用于碰撞检测,通过触点对象可以获取当前接触的两个刚体对象

    b2ContactListener:定义接触时回调函数的类(默认回调函数什么也不做),自定义接触回调时扩展该类。

    b2ContactImpulse:触点冲量对象。

    b2ContactEdge:接触边缘对象(用于关联刚体和触点对象)。

    b2MouseJoint:鼠标关节。

    b2MouseJointDef:一个概念上的鼠标关节(定义)。

    b2DistanceJoint:距离关节。

    b2DistanceJointDef:一个概念上的距离关节(定义)。

    b2RevoluteJoint:旋转关节。

    b2RevoluteJointDef:一个概念上的旋转关节(定义)。

    其它

    density:密度(大于 0 的值,越大就越重)。

    friction:摩擦或摩擦系数(值范围:0-1)。

    restitution:恢复或恢复系数(值范围:0-1。决定碰撞时的反弹程度)。

    force:力或作用力。

    impulse:冲量。

    linear velocity:线速度。

    motor:马达。

    bullet:子弹。

    sensor:感应器。

    contact (触点)回调顺序:BeginContact > PreSolve > PostSolve > EndContact

    注:其中 EndContact 有可能不发生,如两个刚体碰撞之后保持碰撞的状态(如小球落地后不动了)。

    tunneling:隧道效应(一般发生在两个 dynamic 类型的刚体)

    相关说明

    以上资料全部来自《Box2D for Flash Games》——

    中文译版:http://bbs.9ria.com/thread-179794-1-1.html

    英文原版:http://bbs.9ria.com/thread-170409-1-1.html(含书籍配套源码

    Feb

    15

    1、starling 对象的 enableErrorChecking 属性值如果设为 true,内部的 clear() 与 drawTriangles() 方法将会同步的调用,如果是false,这两个方法将会异步调用。所以最好只在测试时使用 true,正式发布时使用 false 以提高性能。

    2、显示对象的 rotation 属性使用的是弧度,不是角度。可以使用 starling.utils.deg2rad 进行转换。

    注:如 deg2rad(Math.random() * 360);

    3、starling 显示对象只有 hitTest() 方法的(它没有 hitTestPoint 或 hitTestObject 方法,至少现在是没有),它返回的是一个显示对象。

    4、简单的显示对象碰撞检测可以使用 getBounds () 方法返回两个对象相对于同一个坐标系后,通过 Rectangle 原生方法“相交 / 交集” intersects() 测试。

    5、PDParticleSystem 虽然也是 starling 显示对象,但它的大小为 0,所以最好不要动态的修改它的大小,而是要通过修改粒子系统本身的配置数据来改变粒子的大小;同样也不要动态修改它的注点 pivotX 与 pivotY,而应改修改它的发射点 emitterX 与 emitterY。

    6、starling 的事件机制是没有捕获阶段的,只有冒泡阶段的。

    注:starling 的 触摸事件 TouchEvent 在 iOS 与 Android 设备中是有差别的。参考 http://blog.zinewow.com/post/397.html

    8、starling 的影片剪辑对象(MC)与传统的 MC 对象虽然 API 语法类似,但本质有很大区别。

    注1、starling 的 MC 通过一定的时间间隔切换纹理图像摸似传统 MC 的时间轴上帧画面连续播放。

    注2、starling 中的 MC 索引是从 0 开始的,不是从 1 开始的。

    注3、stop() 方法更像是 gotoAndStop(0),而 pause() 方法更像是传统 MC 的 stop()。

    注4、只要不是同时添加的显示对象,它们的播放头并不会像传统的 MC 那样同步。既便两个 MC具有相同的帧速率,只要不是同时添加的,那么它们的播放头就不是同步的(这一点可是与传统 MC 有很大区别哦,一不小心可能会引起大 Bug)。

    9、starling 与时间相关的属性值都是以秒为单位的(不是以毫秒为单位的)

    注:API 参考 http://doc.starling-framework.org/core/)。

    10、starling 对象的 nativeOverlay 引用的只是原生舞台上某个显示对象,与主类为兄弟关系(引用的不是主类,也不是主类的子对象)。

    Feb

    14

    官方帮助页面里写的很简单:

    <name> 
        <text xml:lang="en">Sample 1.0</text> 
        <text xml:lang="fr">Échantillon 1.0</text> 
        <text xml:lang="de">Stichprobe 1.0</text> 
    </name>

    但中文比这个复杂些,因为中文分简体与繁体,而官方帮助中提供的参考链接 http://www.ietf.org/rfc/rfc4646.txt 并不直接适用于 AIR 的应用描述文件。因为它里面使用的全部是减号,而不是下划线。

    <name>
            <text xml:lang="en">English Name text>
            <text xml:lang="zh_Hans">简体中文名称</text>
            <text xml:lang="zh_Hant">繁體中文名稱</text>
    </name>

    请特别注意:减号和下划线的区别,是“zh_Hans”,而不是“zh-Hans”。如果使用了减号就是错误的,它只会显示英文,而不会再显示中文名称。

    Feb

    8

    今天是 2015 年 02 月 08 日。在说流程之前,有必要先澄清一些网上的误区(也可能网上那些流程教程写的太早了,已经与现在的流程脱轨了):

    1、在 Google Wallet 注册时,国内发卡机构提供的卡是可以使用的,本人用的是中国工商银行的 VISA 卡,不需要香港或美国的卡。

    2、选项中没有中国大陆,可以选香港的选项,但帐单地址是不需要违造的(比如本人直接写:浙江省绍兴市XXX区XXX路……)。

    备注:人在香港,和帐单寄往国内家里,这完全就是合法的事么,所以完全不需要违造。

    3、Google 的开发者中心帮助页面中明确写着“支持开发者和商家注册的国家/地区”是包含“中国”和“中国香港”的,并且“中国”是写在“中国香港”前面的。

    4、在 Google 开发者中心注册开发者帐号时,需支付 25 美元是一次性的,不需要一年交一次(这个可是跟苹果公司有很大区别的哦 ^ ^)。

    5、如果电子钱包帐号被冻结,支付失败,不是因为帐单地址、家庭地址或信用卡地址什么的不正确,而是因为 Google 出于帐号的安全因素冻结的。

    6、电子钱包帐号被冻结后会有邮件通知,里面有申诉地址,直接提交身份证与信用卡的照片,然后在备注中注明是本人操作就可以。

    备注1:因为我平时很少用 Google 帐号,Google 出于安全考虑,所以将我的帐号冻结了。

    备注2:在我提交资料证明是本人操作后,不到30分钟后就收到了解冻邮件,所以 Google 的效率是很高的。

    备注3:帐单地址、 IP 地址、家庭住址、网页所选语言、所选币值是否相符都不是造成冻结的最直接原因,电子钱包被冻结只是因为 Google 觉的你的帐号有异常。就像腾讯觉的你的 QQ 帐号有异常,把你踢下线,让你重新登录并输入验证码是一样一样的。所以是完全不需要重新再去注册一个帐号的。 

    如果有什么其它问题,也可以加我的开发者QQ群:15965780 。

    Feb

    6

    游戏素材网站

    • 0 Comments
    • Miscellaneous

    看到一个游戏素材相关的网站,有音效、场设、人设等,很丰富的样子:http://www.2gei.com/

    Feb

    5

    因系统升级,同时也升级了 Adobee Photoshop 到最新版本的 CC 2014,发现在以前 CS 8.0 旧版本中可以正常打开的图片,在 CC 2014 版本中出现打不开的情况,提示无法完成请求,因为找不到不知名的或无效的 JPEG 标志符类型”。

    后来发现因为是文件的后缀名不正确造成的(因为文件是 PNG 编码格式,但后缀名却是 JPG)。CS 旧版本中直接通过文件的编码来识别图像格式,而 CC 新版中却是通过文件名后缀来识别图像格式,所以才会导致文件打不开的情况。

    不管Adobe 是否将这种情况定为 Bug(也可能就是故意这样做的),我反正是将它定性为“超级” Bug,因为无论是什么样的原因,修改文件的后缀是很常见的事情

    解决方法:所以当遇到这种情况时可以尝试修改一下文件的后缀名为其它的图片格式,只有当文件的后缀名与图像编码匹配时,才能打开(蛋疼)。