RIAidea - Focus on Flash/Flex/AIR » Flash CS3/AS3 http://www.riaidea.com/blog Focus on Flash/Flex/AIR Mon, 24 Oct 2011 07:54:25 +0000 http://wordpress.org/?v=2.9.2 en hourly 1 Flash资源共享库打包工具Swift 1.0发布 http://www.riaidea.com/blog/archives/302.html http://www.riaidea.com/blog/archives/302.html#comments Sun, 26 Dec 2010 16:17:46 +0000 flashlizi http://www.riaidea.com/blog/?p=302 最新更新:
2011-06-02 Swift 1.0.3发布。增加allowDomain属性设置的支持,解决跨域加载的问题。具体用法可参考下面的xml库文件示例。
2011-01-31 Swift 1.0.2发布。增加对输出SWC的支持。只要把输出文件参数后缀改为swc,即可编译为swc文件。增加两个编译font的参数char和charRange,可与unicode搭配使用。

Swfit是一个用Java开发的免费工具,它可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或swc文件),你可以在运行时动态加载并访问这些资源,实现运行时共享库,减少主应用程序体积和加速下载。

Swift有两种使用方式,一是xml2lib,顾名思义,它可以根据指定的xml文件内容编译成swf/swc库文件。二是dir2lib,它则可以把指定文件夹中的所有有效资源编译成swf库文件。

xml2lib 使用方法:
java -jar Swift.jar xml2lib lib.xml lib.swf
java -jar Swift.jar xml2lib lib.xml lib.swc

xml资源库文件示例:
<?xml version="1.0" encoding="utf-8"?>
<lib allowDomain="riaidea.com">
<bitmapdata file="image/img1.png" class="PNGBitmapData"/>
<bitmapdata file="image/img2.jpg" class="JPGBitmapData"/>
<bitmap file="image/img3.jpg" quality="80" class="JPGBitmap"/>
<bitmap file="image/img4.png" compression="true" quality="80" class="PNGBitmap"/>
<sprite file="image/img5.png" class="PNGSprite"/>
<sprite file="image/img6.jpg" class="JPGSprite"/>
<flexmovieclip file="image/img7.jpg" class="FlexMC"/>
<flexcontainer file="image/img8.jpg" class="FlexContainer"/>
<font file="Arial.ttf" unicode="u+0020-007e,u+00a0-036f" class="ArialFont" />
<font file="msyh.ttf" char="微软雅黑" charRange="a-z,A-Z" unicode="u+5fae,u+8f6f,u+96c5,u+9ed1,u+4e00-u+4eff" class="MsyhFont" />
<sound file="sound/test.mp3" class="TestSound"/>
<bytearray file="data/test.xml" class="XMLData"/>
</lib>

支持资源类型有:

* bitmapdata – 把指定图片文件编译成flash.display.BitmapData类,支持参数有compression,quality。
* bitmap – 把指定图片文件编译成flash.display.Bitmap类,支持参数有compression,quality。
* sprite – 把指定图片文件编译成flash.display.Sprite类,支持参数有compression,quality。
* flexmovieclip – 把指定图片文件编译成mx.flash.UIMovieClip类,支持参数有compression,quality。
* flexcontainer – 把指定图片文件编译成mx.flash.ContainerMovieClip类,支持参数有compression,quality。
* font – 把指定的字体文件编译成flash.text.Font类,支持参数有unicode。
* sound – 把指定声音文件编译成flash.media.Sound类。
* bytearray – 把指定的任何文件编译成flash.utils.ByteArray类。

注意事项:

* 所有资源都有file和class两个参数。file指定资源文件路径,当使用相对路径的时候,要注意这个路径是相对于执行 Swift.jar命令的路径,而不是相对于xml文件的路径。class参数指定资源编译成swf后的as3类定义名,从而能够通过 ApplicationDomain.getDefinition()来获取资源定义。

* 在图片类型资源中,如果是png格式,当参数compression为true时,图片将被编码成带alpha通道DefineBitsJPEG3,默认压缩比率即quality为80,相比原始图片可以得到更高的压缩比率。这也是Flash CS5中的处理方式。

* 在编译font字体资源时,如果不指定unicode参数,Swift将把字体中的所有有效字型都编译到swf中。一般的字体比较小的如英文字体可以完全编译,而像中文字体这种大型字体建议根据需要指定嵌入字型的unicode范围,如\u4e00-\u9fa5等。

* 声音sound资源目前只支持11hz倍率的音频文件,如何11hz,22hz,44hz等。

* allowDomain参数可指定访问域,与Security.allowDomain()方法作用一致。

dir2lib 使用方法:
java -jar Swift.jar dir2lib d:/myLibDir/ d:/myLibDir/lib.swf
java -jar Swift.jar dir2lib d:/myLibDir/ d:/myLibDir/lib.swc

下载地址:http://swift-tool.googlecode.com/files/Swift-1.0.3.zip
详细介绍:http://code.google.com/p/swift-tool/

欢迎任何Bug和建议,谢谢。

]]>
http://www.riaidea.com/blog/archives/302.html/feed 22
FP9下的图文混编组件RichTextField 2.0 http://www.riaidea.com/blog/archives/295.html http://www.riaidea.com/blog/archives/295.html#comments Wed, 25 Aug 2010 05:32:37 +0000 flashlizi http://www.riaidea.com/blog/?p=295 RichTextField是一个基于TextField的图文混编的组件。跟上一个版本相比,新版重写了显示元素的渲染方法,效率得到提升;增加了对html文本的支持;还可以导入和导出XML格式的内容,方便保存和传输等等。

功能演示:

项目首页: http://code.google.com/p/richtextfield
下载地址:http://code.google.com/p/richtextfield/downloads/list
API文档:http://www.riaidea.com/projects/richtextfield/api/

欢迎提交任何bug和建议。

]]>
http://www.riaidea.com/blog/archives/295.html/feed 29
另类Flash程序中PNG图片素材瘦身方法 http://www.riaidea.com/blog/archives/279.html http://www.riaidea.com/blog/archives/279.html#comments Sun, 27 Jun 2010 05:58:58 +0000 flashlizi http://www.riaidea.com/blog/?p=279 在Flash游戏开发过程中,我们会用到大量的png图片资源。它的好处大家都知道,具有alpha通道,可以背景透明,因此它也成为flash游戏图片格式的首选。但是它的缺点就是较大的复杂图形的png的尺寸往往比较大,现在提供一个方法来瘦身大尺寸的png图片。

为了方便演示,先看下面一张png图片,这张图片的大小为60k。

然后大家看下面一张jpg图片,它的背景是黑色,上半部分就是我们上面的png图片,而下半部分则是把这个png图片的填充为纯白色的效果,而这张jpg图片因为没有透明图层,因此大小要比上面的png图片小很多,只有30k。(要制作这样的图片很简单:把png导入ps中,修改高度为2倍,增加一个纯黑色的背景层,再选中png图层选区,填充一个纯白色的图层并移动到图片的底部就ok了。)

那么我们怎么把这张jpg图片实现png图片的透明效果呢?这里我们就要用到BitmapData类了。假设我们已经将上面的jpg图片加载到我们的flash中来的BitmapData为jpgBmpData,那么下面的代码就可以实现png透明效果:
var bmp:BitmapData = new BitmapData(jpgBmpData.width, jpgBmpData.height / 2);
//复制图片的真实像素区域
bmp.copyPixels(jpgBmpData, new Rectangle(0, 0, bmp.width, bmp.height), new Point());
//复制图片的下半区域的红色通道到新图的alpha通道里来实现透明
bmp.copyChannel(jpgBmpData, new Rectangle(0, bmp.height, bmp.width, bmp.height), new Point(), BitmapDataChannel.RED, BitmapDataChannel.ALPHA);
//清除原始图片内存
jpgBmpData.dispose();
jpgBmpData = null;
//得到透明图片后就可以任意处理了
var logo:Bitmap = new Bitmap(bmp);
addChild(logo);

至此大功告成了,flash中的效果截图如下:

最后要注意的是,并不是所有png图片都适合这种方式,要在速度和性能之间取得平衡才是最佳方案。

补充说明:一些朋友反映文中的演示png图片如果压缩成png8或者在flash中导出再使用就已经能得到20k左右压缩结果。是的,确实如此。当初看了一些植物大战僵尸的素材就随便选了这张简单的图来做演示,并没有考虑那么多。而事实上,明白的人应该知道,此文旨在演示一种方法,而且这种方法在传统游戏中也有使用。如果认为这种方法对你没有实用价值,那非常抱歉。

]]>
http://www.riaidea.com/blog/archives/279.html/feed 10
周期定时器:一个Flash Player10.1中不得不关注的特性 http://www.riaidea.com/blog/archives/273.html http://www.riaidea.com/blog/archives/273.html#comments Tue, 22 Jun 2010 10:26:45 +0000 flashlizi http://www.riaidea.com/blog/?p=273 在Flash Player 10.1中,Adobe引入了一个全新的Periodic timer定时器概念,它可以改善浏览器中swf内容的CPU使用。在浏览器中的swf文件在不可见状态下(如窗口最小化,隐藏标签tab或页面滚动到swf文件以外的区域)会自动调节以降低资源消耗。(注:之前的Flash Player版本虽然不会渲染图形,但仍然在全速运行AS脚本,音视频编码解码等。)具体改变如下:

可见状态下:
1)SWF的帧频frameRate会被限制和校准为Jiffy时间模式(如最高60fps),但是目前的10.1 beta3仍然保留最高120fps的限制,这在正式版中将会被改变。
2)计时器(AS2中的Interval和AS3中的Timer)也会校准为Jiffy。
3)LocalConnection也同样会被校准。因此消息从一个swf文件到另一个swf文件至少需要33ms(也有说是40ms)。
4)Video不会做改变,他们可以在任何帧频下播放而不受影响。

不可见状态下:
1)SWF的帧频被锁定为2fps,不进行任何渲染。
2)计时器(AS2中的Interval和AS3中的Timer)被锁定为最多2次/秒。
3)LocalConnection也被锁定为最多2次/秒。
4)Video视频解码(不渲染和显示)只占用CPU空闲时间。
5)为了兼容音频,当swf中有音频在播放的时候,swf的帧频会被调整为8fps,同样swf中计时器和LocalConnection也做相应调整。

应该说这个特性非常有利于网络上flash应用的普及,但是也存在着潜在的风险。比如某些情况下,我们的应用程序需要在不可见的时候仍然保持着正常的运转,比如计时器的正确运行,某些事件按时发生,某些下载任务及时进行等等。当swf的帧速下降到2fps的时候,其影响是显而易见的。因此我们需要在swf不可见的时候仍然保持较高或者正常的帧速。目前有两种解决方法:

利用播放一个音频来使swf在不可见状态下维持8fps:
var gs:Sound = new GhostSound();
gs.play(0, int.MAX_VALUE, new SoundTransform(0));

用js的setInterval方法去调用swf的ExternalInterface.addCallback的方法,从而间接实现一些在不可见状态下必须全速运行的一些动作:
setInterval(callSWF, 50);
function callSWF()
{
var swf=document.getElementById("swfID");
if(swf)swf.execSomeMethod();
}

]]>
http://www.riaidea.com/blog/archives/273.html/feed 0
元标签注入式MVC框架: InjectMVC http://www.riaidea.com/blog/archives/252.html http://www.riaidea.com/blog/archives/252.html#comments Mon, 31 May 2010 15:56:29 +0000 flashlizi http://www.riaidea.com/blog/?p=252 什么是依赖注入(Dependency Injection)?

依赖注入DI在我们编程中其实随处可见,你也可能正在用构造函数注入,setter注入,属性注入等。网上资料随处可以见,在此就不赘述。

什么是元标签(metadata)注入?

有过flex编程经验的可能都知道如[SWF]、[Bindable]、[Event]这样的元标签metadata,flex编译器会根据不同的metadata
会赋予swf特定的属性或者生成特定的as代码来达到我们的目的。 当我们加上-keep-as3-metadata+=MetaName这样编译参数后,编译器会把指定的metadata保存到编译的swf中去。当你再用describeType()方法获取某个有metadata标记的类的XML描述的时候,你会看到你定义的metadata。基于这样的原理,我们便可以利用这一特性实现特殊的注入。

什么是元标签注入式MVC框架?

这是本人根据这种框架的特性命名的。最典型的当属robotlegs (注:可参考eidiot翻译的robotlegs最佳实践)。本框架也是受了它很大的启发,当然InjectMVC有它自己的特点:可注入事件,框架更简单小巧等。(对robotlegs熟悉的朋友可以直接下载demo和源码了解InjectMVC的特别之处)

InjectMVC里Context的作用?

Context是InjectMVC的中枢,有点像puremvc里的Facade,它负责初始化和管理MVC的核心部分Model、View、Controller。 但它跟Facade不一样,它不是单例,可以被实例化。一般来说,一个context定义一个作用域。MVC成员Mediator、Proxy、Command在context范围内的相互通讯和协作。每个context对应一个显示对象application。

Context有一个非常重要的成员Injector,它负责映射和注入属性和事件给Mediator、 Proxy、Command。但你无需直接操作Injector,它已经被封装到context里,你要做的就是注册Mediator、Proxy、Command,并注入你所需要的属性和事件。Context还有一个contextDispatcher,它负责发送和响应context事件。

Context提供以下API供其MVC成员调用来完成彼此的通讯和协作:

* registerMediator
* getMediator
* removeMediator
* hasMediator
* registerProxy
* getProxy
* removeProxy
* hasProxy
* registerEvent
* removeEvent
* dispatchEvent

当你用上面的方法注册一个mediator,proxy或event的时候,InjectMVC会自动注入它们用[Inject]原标签定义的依赖,并保存它们的映射以供其他类注入使用。

比如,我们注册了这么一个mediator:
registerMediator(btn, ButtonMediator);

那么,我们在之的某个Command中便可以注入这个ButtonMediator:
package
{
public class CustomCommand extends Command
{
[Inject]
public var btnMediator:ButtonMediator;
override public function execute()
{
btnMediator.doSomeThing();
}
}
}

更多的文档请到这里参考wiki

InjectMVC相关下载:

* 演示(含源码)
* InjectMVC(源码及SWC)

]]>
http://www.riaidea.com/blog/archives/252.html/feed 1
Debug flash apps with firebug http://www.riaidea.com/blog/archives/183.html http://www.riaidea.com/blog/archives/183.html#comments Thu, 26 Mar 2009 10:08:03 +0000 flashlizi http://www.riaidea.com/blog/?p=183 >> ]]> 大家应该都有用firebug的经验,现在提供2个类Console和Trace,Console可以将指定的debug的内容输出到firebug的控制面板,Trace则可以在firebug的console中trace页面中的flash里的对象和属性等。使用示例如下:
package
{
import flash.display.Sprite;
public class Main extends Sprite
{
public var version:String = "version 1.0";
public var info:Object = { name:"debug_demo", author:"alex", date:"2009-3-26" };
public function Main():void
{
Console.log("This a flash debug demo!");
Console.dump(info);
Trace.bind('main', this);
}
}
}

上面示例在firebug中的输出和trace截图如下:
firebug_screenshot

源文件和Demo下载>>>

]]>
http://www.riaidea.com/blog/archives/183.html/feed 0
用MSNContact Library获取MSN联系人列表 http://www.riaidea.com/blog/archives/167.html http://www.riaidea.com/blog/archives/167.html#comments Wed, 25 Feb 2009 10:07:20 +0000 flashlizi http://www.riaidea.com/blog/?p=167 > 使用方法: import com.riaidea.msn.MSNAccount; import com.riaidea.msn.MSNContact; var email:String = "your email address"; var password:String = "your msn password"; var account:MSNAccount = new MSNAccount(email, password); account.addEventListener(Event.INIT, initHandler); function initHandler(evt:Event):void { account.removeEventListener(Event.INIT, initHandler); //在MSNAccount发出INIT事件后,即可用getContacts()方法获取Contact数组列表。 //数组的每个元素都是一个MSNContact对象,包含id,email,nickname三个属性。 for each(var c:MSNContact in account.getContacts()) { trace(c); //或trace(c.id, c.email, c.nickname); } } ]]> 这是最近在做的一个项目中的一部分,功能就是根据你的MSN帐户和密码获取MSN好友列表。不过要注意因为此组件需要连接微软的MSN远程服务,所以会有安全沙箱问题,在debug状态或者添加了全局安全设置之后就不会报安全错误,当然最适合在AIR项目中使用了。
点击下载SWC组件>>

使用方法:
import com.riaidea.msn.MSNAccount;
import com.riaidea.msn.MSNContact;
var email:String = "your email address";
var password:String = "your msn password";
var account:MSNAccount = new MSNAccount(email, password);
account.addEventListener(Event.INIT, initHandler);

function initHandler(evt:Event):void
{
account.removeEventListener(Event.INIT, initHandler);
//在MSNAccount发出INIT事件后,即可用getContacts()方法获取Contact数组列表。
//数组的每个元素都是一个MSNContact对象,包含id,email,nickname三个属性。
for each(var c:MSNContact in account.getContacts())
{
trace(c); //或trace(c.id, c.email, c.nickname);
}
}

]]>
http://www.riaidea.com/blog/archives/167.html/feed 4
AS3类: BigInt(大整数) http://www.riaidea.com/blog/archives/128.html http://www.riaidea.com/blog/archives/128.html#comments Sun, 22 Feb 2009 15:35:34 +0000 flashlizi http://www.riaidea.com/blog/?p=128 最近在一个项目中计算一个64bit的密钥key的时候,需要用到超过64位的数字运算。大家应该都知道,在AS3.0中,Number数据类型的范围是最大的,它可以使用52位来存储有效位数,即53位以上的数字只是近似值。因此需要到用到Big Integer(大整数),像目前的很多的RSA加密算法就建立于超过512位甚至更大的大数运算。网上找了一下只有hurlant的crypto加密库里面有com.hurlant.math.BigInteger这个类,可惜遗憾的是,这个类还是有位数限制,不能满足我的需求。因此我改写了一个BigInt的js类库,实现了简单的加减乘除取模等运算。由于时间比较紧,改写的代码比较乱,不过还是很好用的,现在分享给需要的朋友。点击下载>>>

下面是使用示例:
var x:BigInt = new BigInt("1234567890123456789012345678901234567890");
var y:BigInt = new BigInt("0x123456789abcdef0123456789abcdef0");
var z:BigInt = x.clone();//复制
z = x.negative();//取相反数
z = BigInt.plus(x, y);//加法
z = BigInt.minus(x, y);//减法
z = BigInt.multiply(x, y);//乘法
z = BigInt.divide(x, y);//除法
z = BigInt.mod(x, y);//取模
var compare:int = BigInt.compare(x, y); //大数比较 return -1, 0, or 1
var num:Number = x.toNumber(); //转为Number类型

]]>
http://www.riaidea.com/blog/archives/128.html/feed 0
DebugLite: Make your debug life more easy! http://www.riaidea.com/blog/archives/81.html http://www.riaidea.com/blog/archives/81.html#comments Fri, 23 Jan 2009 07:00:24 +0000 flashlizi http://www.riaidea.com/blog/?p=81 An agile actionscript3 debugger, you can play Eval function at first.

How to play Eval?

You can use actionscript code to access instances in this flash file, the available instances are main, main.tf, main.btn, main.check.  So you can try these actionscript codes in Eval box:
trace(main.tf.text,main.btn.label,main.check.selected);
main.btn.label=main.check.selected?"YES":"NO";
main.btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));

(note: enter these code into eval box in bottom, click eval button to see result.)

Please visit project homepage for more information.

Project homepage: http://code.google.com/p/debuglite/

]]>
http://www.riaidea.com/blog/archives/81.html/feed 0
GlowTween:一个发光的效果类 http://www.riaidea.com/blog/archives/50.html http://www.riaidea.com/blog/archives/50.html#comments Tue, 09 Sep 2008 18:09:56 +0000 flashlizi http://www.riaidea.com/blog/?p=50

源文件(FlashDevelop项目)下载:

点击下载此文件

]]>
http://www.riaidea.com/blog/archives/50.html/feed 6