开源工具集GhostCat发布
时间:2009-10-07
来源:互联网
天地会wiki的地址:
http://wiki.9ria.com/index.php/GhostCat
类库参考
http://ghostcat.googlecode.com/s ... at/asdoc-output.chm
源码下载地址:
http://code.google.com/p/ghostcat/downloads/list
源码文件结构:
ChostCat是一个库工程,包含主要的内容
FlexLite也是一个库工程,唯一的作用是在AS工程提供FLEX的绑定功能,一般情况不需要引入
example是示例工程
GhostCatTool/SWFBrower是两个辅助工具的源码
tools是一些附加的工具程序
jsfl是一些jsfl宏命令代码
这并不是一个类库合集,除了贝尔法曲线,HitTest.as,和除去SWFDecoder之外文件解析类其他都是我自己手写的。我没有道理去重新写一些和别人一样的东西
这只是一个Alpha版,难免会有BUG,发布这个版本就是为了除错,希望大家能配合一下
主要功能点
工具集以及框架
它提供了一个微型的可视对象framework,采用类似FLEX的延迟更新机制,实现了一些基本的优化处理以及基础功能。这将会为新功能的开发提供不少便利。 提供了大量实用类,涵盖到颜色,矩阵转换,位图缓存,文本处理,反射管理,滤镜代理,字体,事件,鼠标,声音,拖拽,为许多开发中的难点提供了标准解决方案。 与一般的框架相比,它的各项功能和框架本身的耦合度较低。因此更类似于工具集。
位图动画和矢量动画的统一处理
GMovieClipBase是对动画处理的抽象类,以帧标签为处理单位,可以方便地将动画拼接循环播放,实现复杂动画的简单处理,尤其适用于八方向行走起步转身等连贯动作。 实现了游戏必须的恒定速率(跳帧)功能。 此类为抽象类,它的两个实体类,GMovieClip,GBitmapMovieClip则分别实现了对普通矢量动画以及位图数组动画的统一处理。
泛用化的动态显示模块
Tile类会自动将元素平铺在一个区域内进行动态的增删,以模拟超大范围的重复图元。您可以将他作为地图格子使用,也可以用做一些需要进行不断重复显示的背景图片上。 它采用事件进行元素的更新,使用直观便利,且较易进行扩展,甚至可以用来实现组件List。
它的派生类Tile45则实现了游戏常用的45度角游戏地图功能。
采用XML进行数据的序列及反序列化
类似FLEX的标签表示形式,实现了基本的功能(属性设置,ID绑定,事件)。
就设计目的而言并不仅仅是为了表示界面,同样也可以用与其他数据的反序列化(诸如oper定义) 采用的是开放式的设计,可以切换解析器来应对多种不同的情况,并可自行修改和重新设计解析器。
以队列为手段的简化异步处理方式
简单易用的队列系统,很容易进行扩展。它可以实现资源加载,方法执行的混合队列模式,以实现类似原来的同步的处理方式。甚至可以在里面加入条件判断和循环。 依赖它和FilterProxy?实现了内置Tween的排队播放和对滤镜的支持,拉近了和TweenMax?功能上的距离。依赖它实现了一个简单灵活的QUEST系统,可以帮助实现教程,RPG性质的情节演出效果
以皮肤为主体的GUI类库
这是一个可以自由addChild到任何可视容器上的UI组件库,并没有确切的容器的概念,所有组件只需要addChild到舞台上即可生效。 在满足以上要求的同时尽可能完善了功能。由于主要面向游戏,对MovieClip有良好的支持,比起自适应内容更倾向与多样化的表现方式。数据在这里并不是主体。 组件倾向于替换原有图元上的图形来实现组件皮肤,并不是做出界面然后附上皮肤,而是将皮肤直接转换成界面,因此能够完美呈现美工设计稿上的内容。但也不排斥原有的皮肤方式。 请注意。这个类库的使用要点是“美工先行”。“程序先行”甚至“没有美工”的话,并不适用。
一些杂项功能
Collision
另类的碰撞检测模块。使用图形表达的“圆形”和“矩形”作为碰撞的标准,以这些基本图形来拼接出物品不规则的外型,以此代替速度较慢的位图判断方式。 A 通用型的A*算法。速度虽然较慢,但扩展性能很好,很容易阅读。
Roupe
这是一个有趣的贝尔法曲线的应用实例。一根具有物理特性的弹性细绳。 你可以参考它实现TweenMax的曲线轨迹功能。
TweenUtil
和TweenLite?类似的缓动模块,供库里的某些类使用(比如SoundManager)。它并没有TweenLite?的效率高,但也相距不远。功能上,配合Queue和FilterProxy?可以实现大部分需求。
SWFDecoder
功能虽远不如SWFAssert,但也能实现不少需求了。由于制作它的目的主要是为了编写自己的GhostCatTool?,TAG并不多。大家可以参照swf_file_format_spec_v9.pdf来编写自己需要的TAG,随便找个写好的TAG看看应该就知道怎么做了。
IME
FLASH内部拼音输入法,需要加载词库
tranfer
这个包主要用于处理一些需要转换成位图再实现的东西。比如缩略图,倒影,梯形变换。
parse
这个包用于将操作转换为对象。对于Graphics尤其好用。主要为其他类提供支持。但这种处理方式是很有用的。
拖拽工具
display.graphics提供了一系列可以帮助实现Graphic编辑工具的基础类。(Graphic指的是类似流程图那样的东西)
单文件自加载
利用Frame元标签实现的单文件自加载,这应该是一个很普遍的需求。
鼠标手势
InputManager?内顺便加入了我以前写的鼠标手势系统。这对于增加游戏里的用户体验是很有用的。 监听事件并用PathAnalyzer?解析就可以了。
影子生成器
可以生成物体的影子,并且影子还可以折到墙壁上
以及诸如粒子生成器等等其他功能
作者: flashyiyi 发布时间: 2009-10-07
注意:如果示例打开弹出是的网页的源码,请用IE打开
A*示例
http://code.google.com/p/ghostca ... src/AStarExample.as
http://ghostcat.googlecode.com/s ... se/AStarExample.swf
绑定示例
http://code.google.com/p/ghostca ... c/BindingExample.as
http://ghostcat.googlecode.com/s ... /BindingExample.swf
碰撞检测示例(非位图)
http://code.google.com/p/ghostca ... CollisionExample.as
http://ghostcat.googlecode.com/s ... ollisionExample.swf
图像控制点示例
http://code.google.com/p/ghostca ... ntrolRectExample.as
http://ghostcat.googlecode.com/s ... trolRectExample.swf
XML解析器示例
http://code.google.com/p/ghostca ... /src/GXMLExample.as
http://ghostcat.googlecode.com/s ... ase/GXMLExample.swf
http://code.google.com/p/ghostca ... src/GXMLExample2.as
http://ghostcat.googlecode.com/s ... se/GXMLExample2.swf
输入法示例(用cirl+enter取消掉系统输入法测试)
http://code.google.com/p/ghostca ... e/src/IMEExample.as
http://ghostcat.googlecode.com/s ... ease/IMEExample.swf
光影示例
http://code.google.com/p/ghostca ... src/LightExample.as
http://ghostcat.googlecode.com/s ... se/LightExample.swf
梯形变换示例
http://code.google.com/p/ghostca ... c/Paper3DExample.as
http://ghostcat.googlecode.com/s ... /Paper3DExample.swf
http://code.google.com/p/ghostca ... /src/SkewExample.as
http://ghostcat.googlecode.com/s ... ase/SkewExample.swf
物理绳子示例
http://code.google.com/p/ghostca ... oothCurveExample.as
http://ghostcat.googlecode.com/s ... othCurveExample.swf
SWF解析器示例
http://code.google.com/p/ghostca ... WFDecoderExample.as
http://ghostcat.googlecode.com/s ... FDecoderExample.swf
动态tile-base示例
http://code.google.com/p/ghostca ... /src/TileExample.as
http://ghostcat.googlecode.com/s ... ase/TileExample.swf
http://code.google.com/p/ghostca ... rc/Tile45Example.as
http://ghostcat.googlecode.com/s ... e/Tile45Example.swf
缓动示例
http://code.google.com/p/ghostca ... src/TweenExample.as
http://ghostcat.googlecode.com/s ... se/TweenExample.swf
景深排序示例
http://code.google.com/p/ghostca ... /src/SortExample.as
http://ghostcat.googlecode.com/s ... ase/SortExample.swf
圆形布局示例
http://code.google.com/p/ghostca ... pseLayoutExample.as
http://ghostcat.googlecode.com/s ... seLayoutExample.swf
粒子示例
http://code.google.com/p/ghostca ... src/PixelExample.as
http://ghostcat.googlecode.com/s ... se/PixelExample.swf
几个UI类示例
http://code.google.com/p/ghostca ... src/UIBoxExample.as
http://ghostcat.googlecode.com/s ... se/UIBoxExample.swf
http://code.google.com/p/ghostca ... IBuilderExampler.as
http://ghostcat.googlecode.com/s ... BuilderExampler.swf
http://code.google.com/p/ghostca ... IComboBoxExample.as
http://ghostcat.googlecode.com/s ... ComboBoxExample.swf
http://code.google.com/p/ghostca ... /UIScrollExample.as
http://ghostcat.googlecode.com/s ... UIScrollExample.swf
以下几个示例由于沙箱或者浏览器等原因必须手动打开
多语言示例
http://ghostcat.googlecode.com/s ... LangageExample.html
GIF加载示例
http://ghostcat.googlecode.com/s ... ase/GIFExample.html
IFrame示例
http://ghostcat.googlecode.com/s ... /IFrameExample.html
右键示例
http://ghostcat.googlecode.com/s ... htClickExample.html
[ 本帖最后由 flashyiyi 于 2009-10-7 22:53 编辑 ]
作者: flashyiyi 发布时间: 2009-10-07
tick为系统的相对时间单位,也被称为系统的时基,来源于定时器的周期性中断,一次中断表示一个tick。
大家都知道,FLASH的ENTER_FRAME的触发间隔是不确定的,受到浏览器和当时的资源分配情况影响,原因就在于FLASH是基于帧而不是基于时基的。在网站和动画中,这个缺陷的影响并不大,但在游戏里则不一样了。时基的不统一就如同开了变速齿轮一般,会造成各种未知的影响,因此,这是一个必须解决的问题。
统一时基的方法有很多,GhostCat采用的是一种更倾向与性能的方法。它的时基事件依然是由ENTER_FRAME发出的(而不是Timer),并通过getTimer()方法获得两次事件的间隔毫秒数,并以这个间隔值为参数对不同的情况分别进行处理。这个做法稍显复杂,且触发次数依然不固定,但能够和FLASH的屏幕刷新同步,而且不会产生多余的渲染次数。事实上,TweenLite/Max和Tweener的主要区别就是采用Timer还是ENTER_FRAME,GhostCat使用的是和TweenMax完全相同的处理方式。
实现时基的类是Tick.as,它会不停地发布TickEvent事件,附带上作为时间间隔的interval属性。Ghostcat.display.other.BubbleCreater就有直接利用Tick来调节时基的做法。只要记得interval代表的是速度就可以了。
当然,这个利用interval的方式的确没有固定间隔的事件发布容易理解。好在一般也不怎么需要手动处理interval。运动方面只要使用内部TweenUtil(或者TweenMax)就可以自动实现时基,而动画方面,则是现在要讲的内容。GMovieClipBase。
GMovieClipBase是采用这种时基方式实现的动画。因为FLASH的动画并不是基于时基的,所以必须手动实现动画跳转。也因为如此,每一个动画都拥有了自己的frameRate,自己的播放速度。但,并不仅仅是如此。
GMovieClipBase的动画是完全自主控制的,所以,即使做一些多余的判断也不浪费性能(自主控制动画的确会消耗性能,但为了实现时基这是必须的)。GMovieClipBase会自动根据动画的标签来为动画分段,并通过加入队列来进行动画的排队播放,诸如这样的代码:
mc.setLabel("startjump",1);
mc.queueLabel("jump",1);
mc.queueLabel("slip",3);
mc.queueLabel("slipstop",1);
mc.queueLabel("normal",-1)
这段代码的结果会让动画先播放完整个标记为startjump的部分,然后挑转到jump标签播放,接着是slip,这次会播放3次,然后跳转到slipstop,最后执行循环播放normal,直到下一次setLabel。
形象地说,就是先做出起跳动作,然后跳起完成整个跳跃动作,然后开始做滑行动作,接着受身,最后回到普通状态……
好,说到这里还不明白那再说也没用了。
这种方式是有缺陷的,首先,的确会比普通的动画更耗费性能,而且这样一做,动画里的子动画也会无法正常播放,也就是说无法再在电影剪辑里继续套电影剪辑了(定义成“图形”还是可以的),动画只允许出现一层。一定要双层的话,只能让里面的内容也被GMovieClipBase控制。这是FLASH自身的缺陷,没有办法。
但它的优点也很明显。进入AS3时代要求抛弃时间线代码,这是团队开发所必须的,但stop也要抛弃的确有些麻烦。如果用GMovieClipBase管理的话,只要设置好帧标签,并用代码播放的话,怎么控制也都没有问题。每次动画完成都会发布事件,然后就可以根据事件再跳转到不同的帧并完成一段固定动画跳转,这种做法并不比时间线代码更麻烦,有些时候甚至更简单。
只是定义帧标签,相信这对美工不会是个问题。标签用中文也是一点关系都没有的。
好了,说了这么久GMovieClipBase,但GMovieClipBase实际上并不是一个允许实例化的类(但我做不到- -),使用的时候应该用GMovieClip和GBitmapMovieClip,分别对应FLASH矢量动画和BitmapData数组动画。他们的大部分方法都是完全相同的(因为是同一个基类),而且本身基本没什么代码。GBitmapMovieClip同样也支持帧标签,因为没有IDE只能手动创建数组内容,也有一个简单的办法,就是从一个空MC里直接复制currentLabels数组,这样一来,实际上失量动画和位图动画也没什么区别。
GMovieClip本身就有一个方法,可以直接转换成GBitmapMovieClip,它会自动缓存所有图形并复制Labels,可以用来处理复杂矢量动画的性能问题。但这样做,一定要做好位图的回收。动画位图的泄露可是非常严重的事情。
GMovieClip还包含一个独立的TimeLine类,可以用它来包装不需要控制播放的电影剪辑。它同样可以提供LABEL_CHANGE,TIMELINE_END这样的事件来辅助控制动画。
Tile
这个东西并不是为Tile-base游戏设计的,其实最初就是想做诸如循环显示的街道背景,山峰,云彩一类,或者是那种循环平铺然后滚动的卡通式背景。也就是无限循环背景。这种东西一向就是复制几个实例然后搬来搬去,几句就能完事。
但要做就得做好点。Tile.as的使用方法很简单:
var t:Tile = new Tile(SkinClass);
t.width = 1000;
t.height = 1000;
addChild(t);
只需要将需要重复显示的类放在构造函数里初始化,然后设置宽高就可以了。显示上和一般的显示对象没什么区别,坐标系与往常相同,也可以正常addChild,看起来就是根据宽高复制了N份皮肤实例的普通Sprite。
但实际上并不是这样。它会根据自己的可显示范围(屏幕和scrollRect)来动态增删内容,只保持会被显示的对象实例。但你不需要关心这点,当成是全部存在的就好。
但要注意的是,它和其他的List一样,会重复使用创建的实例,所以其内部实例是不可靠的。
Tile在增删元素的时候会发布事件,通过监听这两个事件,就可以实现Tile-base的功能,如果元素是MovieClip,可以切换它的帧,或者重新addChild新的内容(这并不会影响原来的元素大小),如果是Bitmap直接设置BitmapData即可,复杂对象也可以在事件中按情况进行处理。Tile在元素增删的时候是有顺序的,生成元素的同时就已经完成了排序,并不需要关心这点。
具体到游戏地图的话,由于地面必须是处于单独的层内(一定在下面),而地面上的物品等等需要和人物一起进行排序,因此没法用原来的排序方法(只排了地面)。只能将Tile作为地面,然后在上面建立一个新层并手动addChild物品,这时候需要知道到底是加到哪一层,RepeatEvent专门提供了一个属性addToLow来表示应当使用addChild()添加还是addChildAt(0)添加,只要这样做了,即使在其他层上添加物品依然是已经排序了的。然后就只需要排序人物就可以了。
Tile45通过重写了Tile的坐标系转换方法,使得显示时被表示成了45度角地图。和Tile一样,仍然可以通过displayToItem,itemToDisplay,getItemPointAtPoint来转换屏幕坐标,内部坐标和元素序号坐标。这两个类基本没有差异,仅仅是显示上做了转换,但getRect方法等等还是返回的原来的值(Rectange也不可能表达菱形)
Example目录有两个文件来演示,其中一个直接设置了viewRect将元素的增删表示了出来。这种做法性能上的消耗依然远小于显示内容的消耗,虽然肯定比写死的要慢,但应该也无所谓。组件中所有基于List的部分都是直接继承于Tile的,仅仅是增加了数据显示和选择,它们即使是做快速缓动滚动也都没有问题,简单的Tile就更不用说了。
元素的体积实际上也可以直接设置。整个Tile完全可以当作一个逻辑对象,监听事件获取坐标,即使引入3D和物理也都可以适应。
GXML
系统提供了一个XML解析器,用来通过XML实例化对象,就和FLEX的MXML相仿。
使用上用GXMLManager.instance.create(xmlString,spec)即可,spec是解析器实例,通常非显示对象使用ItemSpec,显示对象用DisplaySpec。它初始化时可以传入this来作为反射依据。xmlString就是XML对象。
使用上很明确,下面说的是转换方式。
和MXML一样,需要在XML里注册命名空间。比如要实例化
ghostcat.skin.ScrollUpButtonSkin这个类,就需要先定义xmlns:skin="ghostcat.skin"这个命名空间,然后就可以用<skin:ScrollUpButtonSkin>表示出来。属性值直接在XML里写好就可以,也可以写成XML的子项,以下是例子:
<skin:ScrollUpButtonSkin xmlns:skin="ghostcat.skin" xmlns:fi="flash.filters"
id="button" x="50" y="50">
<filters>
<fi:BlurFilter blurX="4" blurY="4"/>
<fi

</filters>
</skin:ScrollUpButtonSkin>
数组类型属性必须像这样写成子项才能表示,如果数据内有简单类型,则用回车或者逗号分割
<arr>1,2,3,4,5</arr>
但XML内无法区分简单类型,所以最后都会被当作字符串处理。
如果需要设置构造函数参数,则需要用constructor当成属性来表示
<b:BlurFilter>
<constructor>0,0</constructor>
</b:BlurFilter>
如果使用的是DisplaySpec,显示对象里再写显示对象会被addChild。
高级部分:
ItemSpec之后的解析器都要求在构造中传入this,它的作用是什么呢?它是为了将XML的内部和调用解析器代码的外部联系起来。
比如,在XML里写上id="obj"属性,就会将实例化的结果转存到ths.obj上,就可以执行一次解析器便返回多个结果。
同样的,在属性中使用{},诸如text="{t}",text的值就会从this.t属性里寻找。当然也可以不用从this寻找,text="{RootManager.stage}"这样从静态类走也是可以的。但一定要注意{}应当在""内,否则走的是XML导入数据的方式,并不会是这样的结果。
写上on_事件名,便会自动注册事件,依然是在this中查找对应属性名的函数。
基本上,这个和MXML只有一些写法上的不同。你也可以继承DisplaySpec重新增加功能,ItemSpec和DisplaySpec实际上代码都很少,重写时可以参考下。重写解析器的时候,只需要修改三个方法:
createObject(创建对象)
applyProperties(从父对象中获得初值,目前为止这个方法是空的)
addChild(添加到父对象中)
这样完成整个创建对象的流程即可。
Oper
加载队列是一个非常普遍的需求,普遍到让人怀疑Adobe不内置加载队列是不是脑残了。而且这同时还涉及到浏览器的5连接上限BUG,很多时候,这都是必须解决的一个问题。
解决方案没什么难度,无非就是一个完成后继续加载下一个,只要单纯地做一次简单封装就好。但考虑到加载操作往往会和其他操作合并在一起,而且队列不仅仅是加载需要,比如Alert队列,所以就做了一次逻辑抽离。
队列无非需要4个方法
commit 推入队列
execute 开始执行
result 完成
fault 失败
然后配合Queue对象,将加载请求存入数组并按照execute-result-execute的方式排序执行,这样就形成了一个队列系统。
commit方法是推入队列的方法,参数是queue对象,如果不写的话,将会使用默认的全局queue,所以,顺序加载一组数据只需要像这样写就可以
new LoadOper("1.swf").commit();
new LoadOper("2.swf").commit();
new LoadOper("3.swf").commit();
new LoadOper("4.swf").commit();
new LoadOper("5.swf").commit();
全部加载完成可以监听最后一个的operation_complete事件,也可以监听默认queue,也就是Queue.defaultQueue的operation_complete,或者换一种方法,把加载完成执行的方法也当做一个Oper,也就是在上面的语句再加上一条
new FunctionOper(completeHandler).commit()
它就会在加载完全部资源之后自动执行completeHandler方法
除了LoadOper和FunctionOper,这样的Oper还有很多,比如捆绑加载的GroupOper,播放动画的MovieTween,延时的DelayOper,执行缓动的TweenOper,等待并监听事件的WaitOper。除了具体执行某个操作外,也有进行分支选择的IfOper,循环的RepeatOper,通过不同的Oper使用不同参数可以处理各种各样的功能,而这些功能都可以被放在同一个队列里。而除了LoadOper这种逻辑比较多的,其他的Oper代码都非常少(只有几十行),所以再加入新的Oper是非常容易的事情。
而作为队列管理的Queue对象,其实也是一个Oper,它同样也可以被加到另一个Queue里。因此,整个队列可以不是单线的,而是一个互相触发转向的关系。如果使用GMXML通过XML创建Oper序列的化,可以做出很复杂的自定义内容。
可能说得复杂了点。但像一般的队列加载,只要像上面那样写就可以了。想做的事情创建一个对应的Oper,然后用commit方法推入队列,之后就可以当他们是个独立线程那样处理,而不用再去麻烦地进行各种事件监听。这样处理起来会很简单。而如果队列有冲突的话,重新创建一个queue对象(而不是用默认Queue),然后推入队列的时候写在commit的参数里就可以。多队列的扩展很简单。
GhostCat广泛地使用了Queue体系,但凡和队列和执行操作有关的基本都在这里。
总之,这个东西只要new出来然后commit就好了。是一个很简单的东西。
UI
GhostCat的UI组件借鉴了FLEX的命名方式,组件部分并没有多少可讨论的,new出来然后设置属性并使用就可以。下面要说的是两个需要注意的地方,一个是布局,一个是皮肤。
布局
我本来是想完全不做布局的。如果需要复杂布局的话,就不应该用我这个东西,在拥有复杂布局的同时体积也不可能小得下来。GhostCat的布局使用的是LayoutUtil这个静态类的方法,以及用layout类布局器,它是一个完全和容器没耦合的东西。
LayoutUtil里有一些布局方法,直接调用。与其他的不同,它并不要求注册点一定是0,0。
Layout类则是对容器的管理类,便可对指定的容器内对象自动调用LayoutUtil布局。
虽然并不想做布局,但最后还是做了一个View类,简单包装了一次layout。目前的布局功能只能布局子对象,父对象并不会随着子对象变化(也就是没有measureChildren),如果没有这个需求就可以适用。而且,如果并不需要动态布局的话,建议还是直接执行LayoutUtil的方法为妙。
VBox,Canvas,都是实现了的。但在需要的时候应该使用独立的layout对象手动布局,而不是再套一个容器,那没有必要。View只是对layout的简单包装。
如果真的希望复杂布局,应当使用FLEX或者ASWing。这里的布局类效率并不高,功能也弱。是在必要的时候提供功能用的,省的自己写,而不是推荐使用的东西。
皮肤
GhostCat并没有皮肤管理器,也不存在动态换肤功能。如果想定义皮肤,最简单的办法就是直接修改asset下的默认皮肤fla。如果不想修改库的源文件,可以复制一个fla,在自己的工程重新生成swc并导入,这个新的swc就会自动覆盖掉原来的那个。此外,如果使用的不是默认皮肤,嫌默认皮肤浪费体积的话,也可以创建一个全是空skin的fla生成swc并导入,它会将原来有图形的皮肤替换掉,这就达到了消减多余体积的目的。
默认皮肤实际上就是每个组件类的defaultSkin静态属性,直接修改这个静态属性也是可以的。
但这些并不是设计目的。都只是补充。GhostCat其实从一开始采用的就是替换皮肤的方案:它的所有组件类的第一个属性一定是skin,你只要把皮肤放在这里就好了。GhostCat没有Style,所以所有的表现也都只能通过实际的皮肤。
这个skin属性并不仅仅是设置皮肤。它同时也会接受皮肤的坐标属性,而且会把自己插入到皮肤原来的位置上。可以简单的理解成替换。
诸如:
Var a:Sprite = new AAA();
Var v:GButton = new GButton(a);
V.x = 100;
addChild(v);
这是一般的做法。但这种做法和下面的情况是一样的:
Var a:Sprite = new AAA();
a.x = 100;
addChild(a);
Var v:GButton = new GButton(a);
最下面的一条语句就可以理解成替换,和普通的方法区别就在于创建了以后并不addChild,但这样做皮肤必须已经在舞台之上。如果是在时间线上,则可以省略其他代码直接v:GButton = new GButton(实例名)这样替换。
被替换的皮肤并不一定在第一层,也可以在多层嵌套的任何一个地方。可以通过SearchUtil来查找相应的皮肤并像上面那样进行替换并返回引用。这样对美工提供的FLA就不会有过多的限制:只要名字正确就可以了。
GhostCat对用来替换的皮肤内部有一定的层次要求,因为像List,ScorllBar一类的组件需要让电脑能明白哪些图元各代表的意义是什么。组件的说明上都写明了具体的约定,但约定都并不复杂。此外,也可以通过重新设置fields属性来修改这个约定,即使美工也错了名字也可以进行适应。处理这个约定是唯一麻烦的地方。
如果美工能够正确遵守约定,提供正确的FLA文件,代码这边就会非常简单。以至于,只需要执行一次UIBuilder.buildAll()就可以了。UIBuilder是一个自动执行上面方法批量创建组件的类。
当然,你需要首先建立一个自定义组件,GBase就可以,然后在里面添加几个属性,表示组件里的子组件,并写好它们的类型,名字则必须和皮肤里对应每一项皮肤的名称相同,这样设置皮肤,并执行UIBuilder.buildAll()的时候就会自动进行转换。执行完后所有的属性就都有值了,然后就可以添加事件监听完成逻辑部分。这种方法并不是一直都有效,因为子组件的默认属性并不总是合适的,一种方法就是在buildAll的参数里进行设置,另一种则是放弃buildAll,用build方法一个一个创建,或者连UIBuilder类都不用,还是用SearchUtil找皮肤然后new一个组件替换皮肤并设在属性上的老方法。UIBuilder的目的是提供方便。如果不能提供方便的话,当然也就不该用了。
一般情况的面板靠UIBuilder应当都是可以的。即使是List也一样大多可以通过默认参数创建。需要设置的情况大多都是因为ItemRender,这个值也可以通过buildAll的参数定义。
这个方式有一个优点:因为它可以去替换影片剪辑里的skin,所以和动画不冲突。即使在动画里也能正常显示。但要想正常显示对动画还是有要求的,一个就是包含组件的部分一定要在时间线上始终存在(而不是一直能显示就可以,即使永远不会跳过去的帧上出了空位,一样会导致定义失效),另一个则是不要直接用组件做动画,因为组件是替换式的,它无法替换时间线上的所有实例。取而代之,应当用一个单帧容器包装组件,然后再让这个包装代替组件做动画,这样替换的时候就没问题了。
如果担心嵌套消耗性能,可以将repeater属性改成false,这样组件本身就不会替换皮肤,只是和皮肤建立联系。Text类的还好,Button可就无法接受到鼠标事件了,所以这个只是在必要的时候设置。
作者: flashyiyi 发布时间: 2009-10-07

作者: 0xFF336699 发布时间: 2009-10-08
差不多帮忙推广下啊- -工具库本身就是很难推广的。
[ 本帖最后由 flashyiyi 于 2009-10-8 01:35 编辑 ]
作者: flashyiyi 发布时间: 2009-10-08
作者: yangsongmao 发布时间: 2010-08-06

作者: hglgsxy 发布时间: 2010-08-06
AS3 版本已经补全了开发文档。
ibio.googlecode.com
项目地址:http://code.google.com/p/ibio/source/browse/#svn/trunk/ibio8utils
项目 SVN:https://ibio.googlecode.com/svn/trunk/ibio8utils/as3/
文档 SVN:https://ibio.googlecode.com/svn/trunk/ibio8utils/docs/as3
作者: ibio 发布时间: 2010-10-19
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28