Несовместимости библиотеки AS3 - PullRequest
0 голосов
/ 04 марта 2011

Справочная информация:

Я пишу флеш-игру и столкнулась с проблемой.Я использую структуры данных Polygon 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 Ответ

1 голос
/ 04 марта 2011

Да, если это действительно важно, и вы хотите потратить время, можно изменить пакет в SWC, изменив SWF и каталог внутри.

Вот пример проекта AIR с использованием Декомпилятор SWFWire :

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, а затем упаковать его.

...