AS3库不兼容

时间:2011-03-04 05:38:56

标签: actionscript-3 namespaces swc smartfoxserver

背景

我正在写一个Flash游戏并遇到了问题。 我一直在使用Polygonal的AS3数据结构(http://code.google.com/p/polygonal/wiki/DataStructures)而没有任何问题。

我最近为游戏添加了SmartFoxServer 2X支持(http://www.smartfoxserver.com/)。一旦我导入SmartFox SWC文件,我就会在“new LinkedQueue()”调用上收到运行时错误,指示不兼容的覆盖。

无论如何,我向Polygonal提交了一个错误,结果发现SmartFox正在使用旧版本的数据结构并将其包含在SWC文件中。

我的问题:

考虑到我拥有的是两个SWC文件,是否有某种方法可以强制它们进入不同的命名空间?这将允许我使用新版本以及smartfox的旧版本。

1 个答案:

答案 0 :(得分:1)

是的,如果真的很重要,并且您想花时间,可以通过更改内部的swf和目录来修改swc中的包。

以下是使用SWFWire Decompiler的示例AIR项目:

public class SWFWireCompiler extends Sprite
{
    public function SWCEditor()
    {
        stage.nativeWindow.activate();

        var bytes:ByteArray = getBytes('library.swf');

        var swfReader:SWFReader = new SWF10Reader();
        var readResult:SWFReadResult = swfReader.read(new SWFByteArray(bytes));
        readResult.swf.header.signature = SWFHeader.UNCOMPRESSED_SIGNATURE;

        for each(var tag:SWFTag in readResult.swf.tags)
        {
            var abcTag:DoABCTag = tag as DoABCTag;
            if(abcTag)
            {
                for each(var string:StringToken in abcTag.abcFile.cpool.strings)
                {
                    if(string.utf8 == 'de.polygonal.ds')
                    {
                        string.utf8 = 'de.polygonal.ds.old';
                    }
                }
            }
        }

        var swfWriter:SWFWriter = new SWF10Writer();
        var writeResult:SWFWriteResult = swfWriter.write(readResult.swf);

        writeBytes('C:\\output.swf', writeResult.bytes);
    }

    private function getBytes(file:String):ByteArray
    {
        var bytes:ByteArray = new ByteArray();
        var stream:FileStream = new FileStream();
        stream.open(File.applicationDirectory.resolvePath(file), FileMode.READ);
        stream.readBytes(bytes);
        stream.close();
        return bytes;
    }

    private function writeBytes(filename:String, bytes:ByteArray):void
    {
        var file:File = new File(filename);
        var fs:FileStream = new FileStream();
        fs.open(file, FileMode.WRITE);
        fs.writeBytes(bytes);
        fs.close();
    }
}

然后,您必须在catalog.xml中进行查找/替换,然后重新打包。