2011-03-04 15 views
0

Contexte:AS3 Bibliothèque Incompatibilités

Je suis en train d'écrire un jeu flash et ont rencontré un problème. J'ai utilisé les structures de données AS3 de Polygonal (http://code.google.com/p/polygonal/wiki/DataStructures) sans aucun problème.

J'ai récemment ajouté le support SmartFoxServer 2X au jeu (http://www.smartfoxserver.com/). Dès que j'importe le fichier SWF SmartFox, j'obtiens des erreurs d'exécution sur les "nouveaux appels LinkedQueue()" indiquant un remplacement incompatible.

Quoi qu'il en soit, j'ai déposé un bogue avec Polygonal et il s'avère que SmartFox utilise une ancienne version de ses structures de données et l'a inclus dans son fichier SWC.

Ma question:

Considérant que tout ce que j'ai est deux fichiers SWC, est-il une manière que je peux forcer sur d'entre eux dans un espace de noms différent? cela me permettrait d'utiliser la nouvelle version à côté de l'ancienne version de smartfox.

Répondre

1

Oui, si c'est vraiment important, et que vous voulez passer du temps, il est possible de modifier le paquet dans le swc en changeant le swf et le catalogue à l'intérieur.

Voici un exemple de projet AIR à l'aide SWFWire Decompiler:

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(); 
    } 
} 

Vous devrez alors faire une recherche/remplacement dans catalog.xml, reconditionner il.

+0

Je vais voir ce que les gars de smartfox et polygonal trouveront. pour le moment, j'ai des choses qui fonctionnent en chargeant l'ancienne version sur le dessus. –

+0

Dois-je marquer le vôtre comme réponse acceptée? Je veux dire en soi ce n'est pas une solution mais je ne m'attends pas à ce que quelqu'un d'autre réponde. –

+0

@Aaron J'ai ajouté du code au cas où vous le feriez, alors maintenant cela devrait être une réponse à votre question. –

Questions connexes