Browse > Home > Archive: 六月 2007

| Subcribe via RSS

AS2.0:利用Object.watch来控制函数执行队列

六月 22nd, 2007 | No Comments , 293 views | Posted by flashlizi in Flash8/AS2

很多时候,我们需要按照一定顺序执行一系列动作,必需保证一个动作完全执行完毕后再执行另外一个动作。解决办法很多,比如执行完一个动作就广播一个事件,再执行下一个动作。
现在我们利用Object.watch方法来实现这个目的(不熟悉相关方法的请看帮助),代码示例:
[code]var func = [func1, func2, func3];
var listener = {success:false};
listener.watch("success", callFunc);
var i = 0;
exec(0);
function exec(i) {
if (i < func.length) {
func[i]();
} else {
lietener.unwatch("success");
}
}
function callFunc(prop, oldVal, newVal) {
trace(prop + "{oldVal:" + oldVal + " newVal:" + newVal + "}");
if (newVal == true) {
i++;
exec(i);
}
return oldVal;
}
function func1() {
var id1 = setInterval(aa, 1000);
function aa() {
txt.text = "1:exec func1";
clearInterval(id1);
listener.success = true;
}
}
function func2() {
var id2 = setInterval(bb, 1000);
function bb() {
txt.text = "2:exec func2";
clearInterval(id2);
listener.success = true;
}
}
function func3() {
var id3 = setInterval(cc, 1000);
function cc() {
txt.text = "3:exec func3";
clearInterval(id3);
listener.success = true;
}
}[/code]
在此例中,实现了队列执行三个函数func1,func2,func3,每个函数的动作都是间隔1s后改变txt中的文本内容。恰好,我们利用了Object.watch方法来监控success属性,每当一个func[i]执行完毕后,就会改变success为true,继而执行下一个函数。此方法比和事件侦听是同一原理,但更为简洁实用。

AS3类:CRC32校验类

六月 5th, 2007 | No Comments , 212 views | Posted by flashlizi in Flash CS3/AS3

此类是根据java.util.zip中CRC32类写的AS3版CRC32校验类。
[code][color=#008080]/**
* @name:CRC32(CRC32校验类)
* @usage:根据java.util.zip中CRC32类写的AS3版CRC32校验类
* @author:flashlizi(www.flashrek.com/flashlizi@gmail.com)
* @update:2007/06/05
* @example:
var crc=new CRC32();
var ba:ByteArray=new ByteArray();
var str="123";
ba.writeUTFBytes(str);
crc.update(ba,0,3);
trace(crc.getValue().toString(16).toUpperCase());
*/[/color]
package com.flashrek.utils{
import flash.utils.ByteArray;
public class CRC32 {
private var crc32:uint;
private static var CRCTable:Array=initCRCTable();
[color=#008080]/**
* @usage 更新指定的字节数组的CRC32
* @param buffer:指定的字节数组,...arg:arg[0]为offset偏移量,arg[1]为length
指定长度
* 这里可以只指定一个参数buffer,也可以offset,length都指定
* @return void
*/[/color]
public function update(buffer:ByteArray,...arg):void {
var offset:int=arg[0]?arg[0]:0;
var length:int=arg[1]?arg[1]:buffer.length;
var crc:uint = ~crc32;
for (var i:int=offset; i < length; i++) {
crc = CRCTable[(crc ^ buffer[i]) & 0xFF] ^ (crc >>> 8);
}
crc32 = ~crc;
}
[color=#008080]/**
* @usage
* @param
* @return CRC32值
*/[/color]
public function getValue():uint {
return crc32 & 0xFFFFFFFF;
}
[color=#008080]/**
* @usage 将CRC32重置为初始值
* @param
* @return void
*/[/color]
public function reset():void {
crc32 = 0;
}
[color=#008080]/**
* @usage 初始化 CRC table, 长度为256.
* @param crcTable:CRC table
* @return 初始化的crcTable,使用标准poly值:0xEDB88320
*/[/color]
private static function initCRCTable():Array {
var crcTable:Array=new Array(256);
for (var i:int=0; i < 256; i++) {
var crc:uint=i;
for (var j:int=0; j < 8; j++) {
crc=(crc & 1)?(crc >>> 1) ^ 0xEDB88320:(crc >>> 1);
}
crcTable[i]=crc;
}
return crcTable;
}
}
}[/code]

AS3类:直接读取Rar文件中的swf文件

六月 1st, 2007 | No Comments , 209 views | Posted by flashlizi in Flash CS3/AS3

名称:RarExtractor(Rar文件解压器)
作者:flaslizi(www.flashrek.com)
作用:最初的目的是想实现flash文件直接读取rar里的资源,这样在外部文件较多的情况下,可以打包到rar文件里再load进来。
不过由于水平有限,并没有研究出rar的解压算法。而swf文件默认采用zlib压缩方式后,winrar在普通压缩模式下不会再压缩swf文件,因此不用解压就可以读取。
于是便有了这个缩水的RarExtractor,不过还是有点用处的。:)另外,此程序借鉴了Fzip的一些编程思想和方法,在此感谢。
说明:
1、此程序目前只支持压缩过的swf文件的读取(支持目录),不支持rar的固实压缩(solid)方式。
2、有目录的情况下,请注意"\"的转义。比如:filepath\demo.swf ,在外部读取的时候要用 filepath\\demo.swf。
3、程序并不完善,有什么意见大家可以提出。
4、在研究出Rar的解压算法之后或者谁能提供给我,将进一步完善本程序。

效果演示:http://www.flashrek.com/works/RarExtractor_Demo.html

源文件+示例下载:http://www.flashrek.com/works/RarExtractor.rar