avatar
Today is 星期五
2010 年 09 月 10 日

搜索结果 标签: actionscript

2010 年 07 月 05 日

【官方】flash性能优化

by fireyang — Categories: actionscript — 标签:, 评论暂缺

flash性能优化:http://help.adobe.com/zh_CN/as3/mobile/index.html

是adobe自己出的,应该比较权威吧,看看吧,能得到提示的。

2010 年 06 月 29 日

AS缓动生成器

by fireyang — Categories: actionscript — 标签:, , 1 条评论

【来源】:http://clockmaker.jp/blog-en/2010/06/easing-generator/

用AIR做的一个缓动设计器,支持大多数的缓动引擎。免费试用的哦,在google code上还可以获取代码。

你可以在可见的编辑器中设置缓动的路径……

如何使用

  1. 编辑图形路径
  2. 点击“copy”按钮
  3. 粘帖到你的项目中

很简单的制作你的自定义缓动了

支持的缓动引擎

  • Tweener
  • BetweenAS3 (possible to control flexibly)
  • KTween (it’s very lightweight)
  • TweenMax

下载

  • here (Google Code)

注意:不知道为什么我在播放动画测试的时候,cpu一直是50%,爆卡,估计是代码设计的问题,所以不要开启循环播放“loop Play”
作者回复说已经修复这个问题了,去下最新版吧

2010 年 06 月 07 日

提示:移除不需要的Timer事件监听器

by fireyang — Categories: actionscript — 标签:评论暂缺

转自:http://blog.yoz.sk/2010/06/quick-tip-timer-listeners-doesnt-require-remove/

用处:用于匿名监听函数的remove,很方便,再也不用担心匿名函数无法被移除的困扰了。

基于分析器(或 net.hires.debug.Stats)你的Timer监听器在被移除时却不能被垃圾回收器回收。移除它们所有的引用是一个很好的做法,即使是匿名函数。

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
 
    import net.hires.debug.Stats;
 
    [SWF(frameRate="60")]
 
    public class WonderflApp extends Sprite
    {
        public function WonderflApp()
        {
            addChild(new Stats());
            addEventListener(Event.ENTER_FRAME, loop);
        }
 
        public function loop(event:Event):void
        {
            for(var i:uint = 1; i < 100; i++)
            {
                var timer:Timer = new Timer(100, 1);
                timer.addEventListener(TimerEvent.TIMER_COMPLETE,
                    function onTimer(event:TimerEvent):void{});
                timer.start();
            }
        }
    }
}

简单的方法移除匿名函数的监听:

EventDispatcher(event.currentTarget).removeEventListener(event.type, arguments.callee);

2010 年 04 月 22 日

基于mm.cfg的终极调试和评测

by fireyang — Categories: 其他 — 标签:, 2 条评论

介绍:

使用这个工具,你可以在不改变原始的swf的情况下,直接在flash里查看幀频,内存使用情况,还结合了MonsterDebugger。
反正一个字:赞
ps:我打算把trace也加到里面,那是不是更爽了,哈哈,往下看吧……

参考:

  1. The Ultimate Debugging And Profiling
  2. Almighty PreloadSWF
  3. Flash Visual Profiler.

后面两篇需要翻墙(提议用googleReader订阅,然后自己慢慢找吧)

方法:

ps:期间涉及到mmcfg的配置,可以参考我以前的文章:《在ubuntu中捕获trace》(用mm.cfg来捕捉trace)

  • 安装Debug Player (如果你已经安装可以跳过)
  • 安装De MonsterDebugger并运行(可选)
  • 下载MicroProfiler.swf 到本地
  • 确认放文件的位置(如. d:/whatever/MicroProfiler.swf)必须在本地信任范围(修改信任范围地址: local trasted scope)
  • 打开你的mm.cfg文件并添加如下内容 (在 XP中 C:\Documents and Settings\username\mm.cfg)
    PreloadSWF=c:\whatever\MicroProfiler.swf
  • 关闭所有flashplayer并重启浏览器

就这样,现在起,如果你访问任何as3编译的.swf文件,你将在flash影片里看到MicroProfiler。如果你用MonsterDebugger来接受数据,你可以修改里面的变量进行测试了,非常cool吧。
我在使用中发现经常报一些错误,可能这个工具还不成熟还不稳定,有源码的,回头看看参考下……

Ps:修改“信任目录”方法:

  • xp:在C:\Documents and Settings\[your name]\Application Data\Macromedia\Flash Player\#Security 新建一个以.cfg为扩展名的文件,写入你MicroProfiler.swf所在目录的路径就可以了

我的截图(xp下成功,但是我这里有些动画出现类似花屏,不知道原因,ubuntu下一直报警告,还没找到原因):

原文截图:

2010 年 04 月 14 日

[译]使用加密来保护你的Flash文件被反编译

by fireyang — Categories: actionscript — 标签:, 4 条评论

出处:Protect Your Flash Files From Decompilers by Using Encryption

反编译真的让flash制作者讨厌的东西。你花大量的精力做了一个很好的游戏,却有很多人盗用,并且替换了你的logo然后将其放到他们自己的站点。

怎么做到呢?就是通过反编译。如果你不将你的swf进行保护,它将很容易被反编译,只需一个按钮就可以获取阅读性很强的源代码。

这篇教程我用一个案例来说明我是如何保护代码和资源,防止被剽窃。

编者提示: 感谢 Vaclav 的icon图标. 访问Psdtuts+ 你可以看到他的其他图标

让我们开始吧

我使用一个小项目的 demo来说明swf在反编译下试多么的脆弱。你可以从上面的source链接下载这个demo然后自己测试。

我是使用Sothink SWF Decompiler 5来反编译swf然后看他的解析输出。这些代码相当明显易懂, 而且你可以非常容易的拿来使用。

那我们该怎么办呢?

我想出一个可以保护swf文件被反编译的方法,在之后的教程中将加以说明。我们能够得到如下的代码:(译者:如果你是破 解的人,是不是已经开始头痛了呢?)

这 些被反编译的代码实际就是你被解码的内容,其实已经与你的主代码完全不同了。另外这些命名已经全部是非法的了,因此已经无法被重新编译。你可以尝试去编译

在我们开始之前,需要指出的是这篇教程并不适合初学者,如果你想继续阅读必须具备扎实的 AS3知识。这里同样涉及字节和ByteArrays的一些底层程序设计,使用hex editor来操作swf 文件。

我们需要的工具:

  • 一个要被保护的SWF. 免费下载作者的作品
  • Flex SDK. 我们需要使用Embed标签内嵌资源,你可以从 opensource.adobe.com 下载.
  • hex editor(二进制编辑器). 我使用免费的编辑器 Hex-Ed.你可以从这里下载 nielshorn.net 当然你也可以选择自己喜欢的编辑器
  • 反编译器. 虽然不是必须的,但它可以见证我们的保护措施是非常棒的。你可以从sothink.com获取一个试用的Sothink SWF Decompile

步骤 1: 实时加载SWF

打开一个新的ActionScript 3.0项目,并设置好编译的Flex SDK(我用FlashDevelop来写代码)。选择一个你想要保护的SWF并将其以二进制数据的Embed标签嵌入:

[Embed  (source = "VerletCloth.swf", mimeType = "application/octet-stream")]
//  source = path to the swf you want to protect
private var  content:Class;

现在以ByteArray形式,swf被嵌入到其中,然后通过Loader.loadBytes() 将其加载。

var loader:Loader = new Loader();
addChild(loader);
loader.loadBytes(new  content(), new LoaderContext(false, new ApplicationDomain()));

最后我们将 得到如下的代码:

package
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
 
    [SWF (width = 640, height = 423)] //the dimensions should be same as the loaded swf's
    public class Main extends Sprite
    {
        [Embed (source = "VerletCloth.swf", mimeType = "application/octet-stream")]
        // source = path to the swf you want to protect
        private var content:Class;
 
        public function Main():void
        {
            var loader:Loader = new Loader();
            addChild(loader);
            loader.loadBytes(new content(), new LoaderContext(false, new ApplicationDomain()));
        }
    }
 
}

编译然后查看是否正确运 行。现在我们称嵌入里面的SWF为“保护SWF”,刚刚编译的SWF被称为“加载SWF”

步骤 2: 分析结果

让我们再反编译查看下:

耶!

资源和原始代码都不见了!这里的代码看到的是被加载的SWF而不是它的内容了。这里我们可以避免掉大多数的攻击者,他们不是Flash的高手,但是你的保 护技术在高手面前依然还不是足够的安全,因为被加载的”保护SWF”还是依然等待着他们来破解。

步骤 3: 解压缩 SWF

让 我们用hex editor来查看swf:

它看上去像是一堆二进制数据因为它是以ASCII码的”CWS”开头的。我们需要解压它!(如果你的SWF是以“FWS”开始的,那么这些就是有意义的字 符,那它就是未压缩的。但是我们之后同样可以压缩它)。听上去很难的样子其实不然。SWF文件格式是开发的格式有详细的文档说 明了,你可以从adobe.com下 载在文档的第25页。这里说明了头部结构并说明SWF是怎么压缩的,因此我们解压缩就变得容易多了。写在最开头的3个字节是一个标 志(CSW或FWS),接下来的字节表示Flash的版本号,再后面的4个字节就表示SWF的大小。如果标志是CWS那剩下的字节的就是被压缩的内容了, 反之如果标志为FWS,那剩下的就是位压缩的。

让我们写一个简单的函数来解压这个SWF:

private  function decompress(data:ByteArray):ByteArray
{
       var  header:ByteArray = new ByteArray();
       var compressed:ByteArray =  new ByteArray();
       var decompressed:ByteArray = new ByteArray();
       header.writeBytes(data, 3, 5); //读取未压缩的头信息,排除标记符号
       compressed.writeBytes(data, 8); //读取剩余的被压缩数据
       compressed.uncompress();
       decompressed.writeMultiByte("FWS",  "us-ascii"); //未压缩标记
       decompressed.writeBytes(header); //回写头部信息
       decompressed.writeBytes(compressed); //回写解压缩数据
       return  decompressed;
}

这个函数做了一些事:

  1. 读取未压缩的header(开始的8个字节)记住不包括标志 符号。
  2. 读取剩下的数据并解压缩它
  3. 回写到头里(变成“FWS”标记)并解压缩数据,创建一个新的,解压缩的SWF。

步骤 4: 创建一个公共程序(Utility)

接下来我们用Flash创建一个灵巧的工具来压缩和解压缩SWF文件。在一个新的AS3项目中, 编译如下的文档类:

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.FileFilter;
    import flash.net.FileReference;
    import flash.utils.ByteArray;
 
    public class Compressor extends Sprite
    {
        private var ref:FileReference;
 
        public function Compressor()
        {
            ref = new FileReference();
            ref.addEventListener(Event.SELECT, load);
            ref.browse([new FileFilter("SWF Files", "*.swf")]);
        }
 
        private function load(e:Event):void
        {
            ref.addEventListener(Event.COMPLETE, processSWF);
            ref.load();
        }
 
        private function processSWF(e:Event):void
        {
            var swf:ByteArray;
            switch(ref.data.readMultiByte(3, "us-ascii"))
            {
                case "CWS":
                    swf = decompress(ref.data);
                    break;
                case "FWS":
                    swf = compress(ref.data);
                    break;
                default:
                    throw Error("Not SWF...");
                    break;
            }
 
            new FileReference().save(swf);
        }
 
        private function compress(data:ByteArray):ByteArray
       {
            var header:ByteArray = new ByteArray();
            var decompressed:ByteArray = new ByteArray();
            var compressed:ByteArray = new ByteArray();
 
            header.writeBytes(data, 3, 5); //read the header, excluding the signature
            decompressed.writeBytes(data, 8); //read the rest
 
            decompressed.compress();
 
            compressed.writeMultiByte("CWS", "us-ascii"); //mark as compressed
            compressed.writeBytes(header);
            compressed.writeBytes(decompressed);
 
            return compressed;
        }
 
        private function decompress(data:ByteArray):ByteArray
        {
            var header:ByteArray = new ByteArray();
            var compressed:ByteArray = new ByteArray();
            var decompressed:ByteArray = new ByteArray();
 
            header.writeBytes(data, 3, 5); //read the uncompressed header, excluding the signature
            compressed.writeBytes(data, 8); //read the rest, compressed
 
            compressed.uncompress();
 
            decompressed.writeMultiByte("FWS", "us-ascii"); //mark as uncompressed
            decompressed.writeBytes(header); //write the header back
            decompressed.writeBytes(compressed); //write the now uncompressed content
 
            return decompressed;
        }
    }
}

大概你已经注意到了,我只是实现了两件事:加载文件和压缩函数。

这个压缩函数基本与解压缩函数一致,只是反转而以。文件的加载用的是 FileReference (必须FP10)而加载的文件要么被压缩,要么被解压缩。注意:我们只能用标准的player在本地运行这个SWF,因为FileReference.browse()必 须与用户交互(译者:只有用本地player才能运行,如果在网络访问,无法弹出对话框的)

步 骤 5: 解压缩被加载的SWF

测试这个工具,动起来,加载一个SWF文件然后再保存。然后用hex editor进行查看。你看到的ascii字符串就类似如下的:

步 骤 6: 再次分析

让我们回到步骤2.当反编译器不能在“保护SWF”得到有用的数据,这是在未压缩的loader中获取这个SWF那将 是很容易的。只需要搜索“CWS”(如果“保护SWF”是未压缩的,直接搜索“FWS”)这样就看到如下的结果了:

你 将会发现一个DefineBinaryData标记,这个就是包含“保护SWF”的,将这段字符提取出来便可以了。所以我们不得不再在这个加载的SWF上 加上一层保护:加密。

步骤 7: 加密

为了让我们的“保护SWF”不那么容易被找到,所 以我们要采用加密。我选择了as3crypto的方式,你可以从这里下载到:code.google.com。 你可以用其他任何类库来代替(或者你自己实现,或许更好),但有一个必须的条件就是一个key,用来对二进制进行加密和解密。

步骤 8: 加密数据

首先我们需要一个公用程序在将SWF嵌入之前进行加密。这需要对as3crypto库有简单的了解,而这个库也是非常 的简单易用,将这个类库添加到你的库路径里,然后就可以通过如下的方式使用了:

var aes:AESKey = new AESKey(binKey);
var bytesToEncrypt:int = (data.length & ~15); //确保能被16整除,最后4个字节为0
for (var i:int = 0; i < bytesToEncrypt; i += 16)
        aes.encrypt(data, i);

这里做了什么处理呢?我们使用as3crypto类所生成的实例 AESKey对内容进行加密。这个类每次加密16个字节(128-bit),我们通过for循环将所有的数据加密。注意第二行:data.length&~15。这是为了确保被加密的字节数刚好可以被16整除否则我们将不能调用aes.encrypt().

注 意: 在这里对加密知识的了解非常重要。这里不是真正的加密,我们只是在SWF中嵌入一个key来混淆而已。这里的目的是将数据变成二进制乱码,这就是上面代码 的作用,虽然可以达到15个加密字节(在我们的例子中我们不关心这个)。我不是一个密码专家,而我也相信上面的代码在专业的密码人员眼里是如此的渐现,但 是如我所说SWF中查找这个key也是很渺茫的。

步骤9:加密公共程序

现在需要另一个公共程序用 来帮助我们加密SWF文件。这几乎和我们之前轻松创建的压缩程序是一样的,这里就不再赘述了。

在新的项目里编译这个文档类:

package
{
    import com.hurlant.crypto.symmetric.AESKey;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.FileReference;
    import flash.utils.ByteArray;
 
    public class Encryptor extends Sprite
    {
        private var key:String = "activetuts"; //I hardcoded the key
        private var ref:FileReference;
 
        public function Encryptor()
        {
            ref = new FileReference();
            ref.addEventListener(Event.SELECT, load);
            ref.browse();
        }
 
        private function load(e:Event):void
        {
            ref.addEventListener(Event.COMPLETE, encrypt);
            ref.load();
        }
 
        private function encrypt(e:Event):void
        {
            var data:ByteArray = ref.data;
 
            var binKey:ByteArray = new ByteArray();
            binKey.writeUTF(key); //AESKey requires binary key
 
            var aes:AESKey = new AESKey(binKey);
            var bytesToEncrypt:int = (data.length & ~15); //make sure that it can be divided by 16, zero the last 4 bytes
            for (var i:int = 0; i < bytesToEncrypt; i += 16)
                aes.encrypt(data, i);
 
            new FileReference().save(data);
        }
    }
}

运行它,首先选择你要加密的SWF,然后将加密后的swf另存就可以了。

步骤 10:更改加载模块

重新回到前面加载SWF项目。因为内容已经被加密过,所以我们必须修改加载SWF,在其中添加解密代码。不要忘记将 Embed 标签中的src重新指向被加密的SWF上。

package
{
    import com.hurlant.crypto.symmetric.AESKey;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.utils.ByteArray;
 
    [SWF (width = 640, height = 423)] //the dimensions should be same as the loaded swf's
    public class Main extends Sprite
    {
        [Embed (source = "VerletClothEn.swf", mimeType = "application/octet-stream")]
        // source = path to the swf you want to protect
        private var content:Class;
 
        private var key:String = "activetuts";
 
        public function Main():void
        {
            var data:ByteArray = new content();
 
            var binKey:ByteArray = new ByteArray();
            binKey.writeUTF(key); //AESKey requires binary key
 
            var aes:AESKey = new AESKey(binKey);
            var bytesToDecrypt:int = (data.length & ~15); //make sure that it can be divided by 16, zero the last 4 bytes
            for (var i:int = 0; i < bytesToDecrypt; i += 16)
                aes.decrypt(data, i);
 
            var loader:Loader = new Loader();
            addChild(loader);
            loader.loadBytes(data, new LoaderContext(false, new ApplicationDomain()));
        }
    }
 
}

这里除了代码中间的解密代码不同外其余基本相同。现在编译这个加载SWF并测试它是否工作。如果你一直很仔细的根据我所说的做,这个“保护SWF”是会成功 被加载并显示的。

步骤 11:通过反编译器看看内部

在反编译器里打开这个加载SWF看看。

这里包含约1000行的混乱的加密代码,从中提取这个“保护SWF”已经相当困难了。我们再加入一些新的步骤增加攻击者负担:

  1. 他 (她)找到拥有加密内容的DefineBinaryData,并将其提取出来
  2. 他必须有一个工具去解密它。

这个问题 就变成创建一个工具,类似从反编译器中复制-粘贴到代码编辑器,只需要对代码做简短的修改。我尝试着去破坏自己保护的swf,那是相当简单的-我做这些只 用了将近5分钟。所以我们不得不做一些测试。

步骤12:字符串混淆

首先,我将“保护SWF”加载到SWF,并加密它,现 在我们将对加载SWF做最后的处理。我们用非法的名字重命名类名,函数名和变量名。

我意味的非法名称例如,;!@@,^#^和(^_^)。 这么酷的事只对编译器有效果而对FlashPlayer是没关系的。当编译器内部识别遇到非法字符,它不能解析它们而它们就无法通过编译。另一方面,播放器中的非法命名是没有任何问题的。我们可以用非法字符编译SWF,解压它然后用一堆非法字符来重命名它们。这个反编译器将输出非法的代码,而攻击者不得不 自己去整理数以万计的代码,在他编译之前必须先移除这些非法字符。他值得这么做!

这是在字符混淆之前的视图:

让我们开始吧!使用我们制作的工具解压缩加载SWF,并在hex editor查看。

步骤13: 你的第一个混淆

让我们重命名文档类。在左侧找到原名(Main),让我们用hex editor打开未压缩加载SWF并搜索:

将“Main”重命名为;;;;。现在再继续查找“Main”同样重命名为;;;;。

当我们在重命名的时候确保你不会将不必要的字符串重命名,否则SWF将无法运行。

Save and run the SWF. It works! And look what the decompiler says:

胜利!! :)

步骤 14: 重命名剩余的类名

继续重命名你的类名。选择类名并查找它,从头到尾查找并替换成非法字符。如我所说,最重要的是利用你的常 识,确保你不会打乱你的SWF文件。当你重命名完类名后,你可以重命名你的包名。注意:当你重命名包名时,你可以将其命名为长长的非法字符包名。看看我的 命名:

当你完成类名和包名的重命名后,你可以重命名函数和变量。它们同样非常容易重命名,因为它们通常出现的比较少。当然,确保你重命名你的方法不会与Flash 内置的方法相同。确保你不会擦除掉我们的加密使用的key(这里是”activetuts”)。

步骤 15: 压缩SWF

在你完成重命名后,你将压缩SWF,因为它大小将变小。我们可以使用我们之前制作的压缩工具,运行这个工具,选择 SWF然后另存。

结 论:最后回顾

再打开看看,类名、变量名和方法名是否被混淆成功而“保护SWF”是否被藏匿其中,并加密。这个技术可能会让开始的时候比较 慢(因为有解密的原因),但是这仅仅是一点点时间。

之后我创建一个自动工具将我的“保护SWF”注入到“加载SWF”里,而它也能很好的操 作。唯一的问题就是如果你用了这个自动工具进行注入,它就能被其他工具破解。因此攻击者只要做一个相应的工具就会很容易获取你的SWF。所以我每次做 SWF的工作都是通过自己手动操作,附带一些细小的修改,让自动化变得困难。

另一个很好的应用技术就是Domain locking。 这里用你SWF当前正在执行的域名来代替前面进行解密所使用的字符串常量。因此,用一个if语句来检查域,您可以引入一个更强大 的方式来保护放在其他网 站上的SWF。

最后,你可以用自己实现的加密代码来代替现在的加密代码。为 什么?因为我们使用的加密代码都是来自常见的开源库这样攻击者同样也能使用。他可以下一个完全的拷贝,怎么样的混淆都变得多余了。另外,使用你自己实现的 代码,他必须首先得还原你的混淆,这样他才能继续接下来的工作。

其他一些保护方法

在Flash应 用里SWF被破解是一个大问题,这里还有一些供选择的保护方法。许多程序都是基于字节层的AS混淆(比如Kindisoft的 secureSWF)。它们破坏编译好的字节,当反编译器尝试输出代码的时候就失败了,甚至有时候崩溃。当然越好的加密工具,价格也越贵。所以在你选择用 何种工具加密的时候,需要考虑加密的程度。如果你所保护的算法是拥有50个程序员工作室耗时2年做的东西,你就需要考虑比重命名变量更好的办法了。再者, 如果你只想要保护玩家提交的最高分,那这个技术就已经够了。

我喜欢这种办法只是在运行的时候你保护的SWF不被很容易接触到。而字节代码的 混淆可能会破坏SWF并产生一些Bug(虽然我自己还没有遇到过)。

这次就到这里,希望你喜欢这篇教程并能学到新的东西!如果你有什么问题 或意见可以在下方留言。

PS:我翻译这篇文章是想推荐这种简单的加密方法,让大家对flash的加密有简单的了解,只为抛 砖引玉。

2009 年 12 月 20 日

34个有用的ActionScript 3.0的API

by fireyang — Categories: actionscript, 未分类 — 标签:评论暂缺

对于api的说明自己翻译了下,本人英语水平一般,可能有所错误,如果可以,建议阅读原文。

来源:

List of 34 More ActionScript 3.0 APIs

Using an API can save time during the development process. The wonderful thing about the Flash Platform Community has always been the willingness to share. Here’s 34 more ActionScript 3.0 APIs that can be used for Flex, Flash and AIR development. Hopefully one of the APIs listed here or in one of my previous API listing posts can help you and your team save time. Happy Holidays!! :)

在开发的过程中如果使用API可以节省很多时间。而且幸运的是Flash Platform Community一直乐意来共享这些资源。这34个AS3 API将被使用在Flex,Flash和AIR开发中。希望这些API包括我之前发布的API版本能帮助你和你的团队来节省时间。另外,祝节日快乐!!:)

ArcGIS API for Flex
ArcGIS  API for Flex是允许用基于ArcGIS Server开发RIA项目。它是基于Adobe Flex 框架。这个框架是在Flash Player 9或以上版本的客户端技术,或者Adobe AIR。所有的Flex 3.x SDK版本现在都支持。
http://resources.esri.com/arcgisserver/apis/flex/

asaudio
ASaudio是一个小型专用于简单并高效的声音处理AS3库。
http://code.google.com/p/asaudio/

as3ansi
是在Flash和Flex应用中的AS3中扩展自ASCII(IBM code page 437)和解析和查看类库。
http://code.google.com/p/as3ansi/

ActionScript 3.0 Client Library for Facebook Platform API
Facebook平台客户端的AS3 API,完全支持Facebook和Adobe,能更简单的在Facebook平台和Flash平台直接构建应用。
http://code.google.com/p/facebook-actionscript-api/

ascolourlovers
AS3的ColourLoversAPI。在As3的项目中使用这个类库,提供所有需要调色板,颜色的工具。
http://code.google.com/p/ascolourlovers/

AS3DAC
AS3DAC解析AS3.0类或实例文件,并添加一段asdoc的文档。沿用Flex SDK的代码编写规则。
http://code.google.com/p/as3dac/

as3flexdb
AS3FlexDB项目是一个开源的类库,允许Adobe Flex应用能直接连接到MySQL服务器。
http://code.google.com/p/as3flexdb/

as3growl
这个ActionScript 3 API是伴随Grwol 通知服务器工作的。
http://code.google.com/p/as3growl/

AS3 Http Client Library
这个http 类库基于flash.net.Socket(并as3crypto)编写的,使用在AIR或flash运行时。
http://github.com/gabriel/as3httpclient

as3midilib
ActionScript 3.0提供支持MIDI
http://code.google.com/p/as3midilib/

as3openxmlformats
ActionScript 3类库支持MS Office开放XML格式。
http://code.google.com/p/as3openxmlformats/

as3-scaffold
as3-scaffold是一个轻量as3框架,其中包括一些简便的脚手架脚本用来自动完成一些单调的新建as3项目时的设置,并支持PureMVC.
http://code.google.com/p/as3-scaffold/

as3scriptinglib
这个类库的目标是提供一个API在Flash客户端来编译并执行 ActionScript/JavaScript(不需要服务器),遵循Adobe的ECMAScrpit 4编译器(来自Tamarin项目)
http://code.google.com/p/as3scriptinglib/

as3zlib
zlib的as3端口。
这个JZlib到as3的端口。之初创建这个,是由于Flash 9中的as3不支持ByteArray。AIR已经支持内置的所以不需要这个代码。
http://code.google.com/p/as3zlib/

bitly as3 api
bit.lyAPI的简单as3实现。
http://code.google.com/p/bitly-as3-api/

Diggbe
Diggbe是一个普遍的目标DI引擎。当初的构想是为了单元测试目标(忽略 xxxSet/GetForTest)。但是它允许服务依赖注入使用在运行时代码中。
http://code.google.com/p/diggbe/

echo-nest-flash-api
Echo Nest API在ActionScript 3上的接口。
http://github.com/also/echo-nest-flash-api

Etsy API Wrapper for Actionscript 3
Etsy.com API封装的ActionScript 3类。
http://thunderfarm.com/etsy/

feedmeas3
FeedMe是使用低级别的类的对象之间共享数据。
http://code.google.com/p/feedmeas3/

fuelas3svn
SVN协议的As3实现。这个类库让你可以在Flash上完全拥有SVN客户端的写入能力。
http://code.google.com/p/fuelas3svn/

Gigya AS3 API
http://wiki.gigya.com/030_Gigya_Socialize_API_2.0/030_API_reference/010_Client_API_%28JavaScript%29

googleas3api
Google  API的AS3类库。将Google的强大融入到你的Flash/Flex/AIR应用中(搜索,翻译,建议,天气,订阅等)
http://code.google.com/p/googleas3api/

Kongregate’s AS3 API
这Kongregate AS3 API允许你拓展你的游戏与Kongregate平台进行交互。
http://www.kongregate.com/developer_center/docs/as3-api

KoolMoves AS3 API
http://koolexchange.com/docs/km/

lastfm as3
允许访问Last.fm web服务(Last.fm是一个音乐共享平台)
http://code.google.com/p/lastfm-as3/

Mappy AS3 API
感谢Mappy AS3 API,秀出你用户的高级显示效果(缩放的过渡效果,视频积分,动画等)。浏览器的Flash插件让地图的呈现速度更快(拥有大量的网络用户)。
http://api.mappy.com/en/as3

MP3tunes Music AS3/Flex/AIR API
MP3tunes Music API的AS3实现。这个api由REST接口组成,允许你访问MP3tunes Locker service上的某个用户的所有数据。你可以以此服务为基础构建AS3/Flex/AIR项目。
http://code.google.com/p/mp3tunes-as3-api/

nd3d
ND3D是一个简单的AS3 3D引擎。针对速度和简单性。目标是使用简单的3D效果和迅速的3D测试/原型。这个引擎编译后的大小约为10k。
http://code.google.com/p/nd3d/

netflex-as3-api
基于Netflix API 应用的Actionscript 3公共类库
http://code.google.com/p/netflex-as3-api/

Sekati API
Sekati API是个纯Actionscript 3.0的框架,设计用来辅助开发flash/flex项目或应用的时候能更关注更高级的功能函数封装。该框架提供一个灵活的,丰富的xml可配置的应用架构,通过实现其核心显示对象、控制器模块,管理模块和公共模块的集成。
http://code.google.com/p/sekati/

Soundcloud AS3 API
用AS3写的通用Soundcloud AS3 API,应用到Flash,Flex和AIR项目中去。
http://github.com/dasflash/Soundcloud-AS3-API/blame/1aa2d25c072309a1e931b08e88f6c7218a135be0/README

tweensy
tweensy是一个不可思议的性能的Actionscript 3原型运动员。在Teensy有一个扩展的包名为Tweensy FX,它能在DisplayObjects上应用运动效果。(应该属于缓动库)
http://code.google.com/p/tweensy/

vyana
轻量的类似于Cairngorm-PureMVC框架,关于模块化应用。
http://code.google.com/p/vyana/

wiiflash
Wiimote和Flash之间的通信。
http://code.google.com/p/wiiflash/

2009 年 08 月 05 日

不错的as类库站点

by fireyang — Categories: actionscript — 标签:, 评论暂缺

在整理个人类库发现国内居然有这么个站点,内容不错。

介绍的类和包,都挺有用的,强烈推荐下:

http://asclass.yo2.cn/

Flasher们,赶紧去淘淘看,或许就有收获了!

2009 年 07 月 03 日

getDefinitionByName+Embed使用,未定义错误

by fireyang — Categories: actionscript, flex — 标签:, , 评论暂缺

getDefinitionByName的用处是可以通过字符串映射的取到相应的类。
但是如果你在一个类中,embed一个图片,将这个图片声明为一个class 。这样用getDefinitionByName来调用,就会出现“未定义错误”。

package
{
	import flash.display.Bitmap;
	import flash.display.MovieClip;
	import flash.utils.getDefinitionByName;

	/**
	 * ...
	 * @author FireYang
	 */
	public class embedTest extends MovieClip
	{
		[Embed(source="tile1.png")]
		private var tile1:Class;

		public function embedTest()
		{
			var string:String = "embedTest_tile1";//所在类名+"_"+embed的类名
			var c:Class = getDefinitionByName(string) as  Class;
			var b:Bitmap = new c();
			b.x = 100;
			b.y = 100;
			trace(b);
			addChild(b);
		}
	}
}

采用上面的形式,红色部分是重点,就没问题了!原因还没找到,呵呵,但是测试了没错!

2009 年 06 月 09 日

Flash开发者应该掌握的东西

by fireyang — Categories: actionscript — 标签:, 评论暂缺

无意中看到这样的一个flash站点,有几个特色

  1. 对flash开发者需掌握的技能,归纳的比较好。
  2. 整个呈现过程就比较cool
  3. 制作的说明和插图,都比较直观

总之,值得已经入门的开发者浏览下,讲自己掌握的知识系统化

链接:http://gskinner.com/talks/things/

qqe688aae59bbee69caae591bde5908d

2009 年 04 月 27 日

as3版flash 游戏的结构设计(一)

by fireyang — Categories: actionscript — 标签:, , 1 条评论

最近关注flash游戏设计,发现了这个系列的文章,觉得还可以,适合新手学习和参考。

所以把它翻译过来(不是原原本本,根据意思做了很大变化),希望入门有帮助,我也在入门,呵呵

欢迎转载,请注明出处(包括译者和作者)

原文:Designing the structure of a Flash game – AS3 version

作者层级写过: Designing the structure of a Flash game ,这篇文章是针对在flash里的动作里直接写到,现在这个as3版本,者采用了class(类)的形式。更有面向对象的感觉,原来就感觉是面向过程的。

刚开始使用类来代替,如果你不熟悉面向对象,就感觉很不直观;但是如果你熟悉后,你完全将这个用作你以后开发游戏的模板。

在这个游戏中,我们使用了4个屏幕切换(后面简称:切屏):splash(开始屏),info(如何玩),game itself(游戏本身)和game over(游戏结束)……并且你还可以根据需求非常简单的添加其他屏。

首先给游戏做一个规划:

as3dia

在图片中你能看到游戏的4屏,并且指出了每个按钮的屏幕切换方向。如,在splash(开始)屏你可以跳转到info(介绍)屏,但是你不能直接跳转到game over(游戏结束)屏。

主函数the_game(因此文件命名为the_game.as),把其他对象和类被列在库中,根据红色的顺序进行引用。

查看链接列(元件的链接属性,常识,不多作解释),非常清楚的显示出其他需要的四个as文件:game_over.as,how_to_play.as,splash.as和the_game_itself.as。

让我们看看详细的实现(blog主题原因,代码呈现有点问题):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package {
	import flash.display.Sprite;
	public class the_game extends Sprite {
		public var splash_screen:splash;
		public var play_screen:the_game_itself;
		public var game_over_screen:game_over;
		public var how_to_play_screen:how_to_play;
		public function the_game() {
			show_splash();
		}
		public function show_splash() {
			splash_screen = new splash(this);
			if (how_to_play_screen) {
				removeChild(how_to_play_screen);
				how_to_play_screen = null;
			}
			addChild(splash_screen);
		}
		public function show_how_to_play() {
			how_to_play_screen = new how_to_play(this);
			removeChild(splash_screen);
			splash_screen = null;
			addChild(how_to_play_screen);
		}
		public function show_game_over() {
			game_over_screen = new game_over(this);
			removeChild(play_screen);
			play_screen = null;
			addChild(game_over_screen);

		}
		public function play_the_game() {
			play_screen = new the_game_itself(this);
			if (splash_screen) {
				removeChild(splash_screen);
				splash_screen = null;
			}
			if (how_to_play_screen) {
				removeChild(how_to_play_screen);
				how_to_play_screen = null;
			}
			if (game_over_screen) {
				removeChild(game_over_screen);
				game_over_screen = null;
			}
			addChild(play_screen);
		}
	}
}

详细步骤说明:

行4-7: 使用相应的类声明游戏切屏的对象。

行8-10:这是主要函数,simply调用一个显示splash屏的函数。

行11: 这样一个函数: show_splash。

行12: 函数的核心:我将为第4行声明的splash_screen变量new一个对象。注意这里的参数:我要求它记住是哪个类调用了它,在这里this其实就是the_game类。

行13: 检查场景上是否已经有how_to_play_screen屏。这里有可能是从info屏切换到splash屏的。

行14: 如果是,我需要在场景上移除这一屏……

行15: 设置变量为null,这个非常重要因为removeChild只是在场景上移除sprite,而内存中依然存在的。

行17: 最后,我将splash屏放置到场景上。

其他剩下的也都是相同的操作,分配变量、添加并移除相应的sprite,直到结束为止。

现在让我们看看splash.as中splash类的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
	import flash.display.Sprite;
	import flash.display.SimpleButton;
	import flash.events.MouseEvent;
	public class splash extends Sprite {
		public var main_class:the_game;
		public function splash(passed_class:the_game) {
			main_class = passed_class;
			play_button.addEventListener(MouseEvent.CLICK, on_play_button_clicked);
			how_to_button.addEventListener(MouseEvent.CLICK, on_how_to_button_clicked);
		}
		public function on_play_button_clicked(event:MouseEvent) {
			main_class.play_the_game();
		}
		public function on_how_to_button_clicked(event:MouseEvent) {
			main_class.show_how_to_play();
		}
	}
}

行6:声明the_game类型的变量main_class(主类)

行7:主要函数,查看the_game类型的参数passed_class:这函数的传递可以在the_game.as的第12行可以找到

行8: 记住调用的此类的原始类

行8-9:附加两个按钮的监听,当玩家按”play”或”how to play”按钮时触发。

行12:当玩家点击play按钮时,函数被执行

行13: 这个文件的核心:我在主类中调用play_the_game()函数。我们能知道主类哪里来,就需要感谢main_class变量了。

这里的函数执行就和前面show_splash的解释一样,添加和移除相应的sprite并调用其他的类。

其他类也和这个是类似的,所以不做过多注释。

how_to_play.as

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
	import flash.display.Sprite;
	import flash.display.SimpleButton;
	import flash.events.MouseEvent;
	public class how_to_play extends Sprite {
		public var main_class:the_game;
		public function how_to_play(passed_class:the_game) {
			main_class = passed_class;
			play_button.addEventListener(MouseEvent.CLICK, on_play_button_clicked);
			back_button.addEventListener(MouseEvent.CLICK, on_back_button_clicked);
		}
		public function on_play_button_clicked(event:MouseEvent) {
			main_class.play_the_game();
		}
		public function on_back_button_clicked(event:MouseEvent) {
			main_class.show_splash();
		}
	}
}

the_game_itself.as

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package {
	import flash.display.Sprite;
	import flash.display.SimpleButton;
	import flash.events.MouseEvent;
	public class the_game_itself extends Sprite {
		public var main_class:the_game;
		public function the_game_itself(passed_class:the_game) {
			main_class = passed_class;
			die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked);
		}
		public function on_die_button_clicked(event:MouseEvent) {
			main_class.show_game_over();
		}
	}
}

game_over.as

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package {
	import flash.display.Sprite;
	import flash.display.SimpleButton;
	import flash.events.MouseEvent;
	public class the_game_itself extends Sprite {
		public var main_class:the_game;
		public function the_game_itself(passed_class:the_game) {
			main_class = passed_class;
			die_button.addEventListener(MouseEvent.CLICK, on_die_button_clicked);
		}
		public function on_die_button_clicked(event:MouseEvent) {
			main_class.show_game_over();
		}
	}
}

最后你将看到:

下载源代码 .

这是第一篇,有空继续第2篇。

© 2010 fireyang’blog All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - Have fun!浙ICP备07033342号