2016-11-12 2 views
1

J'ai un fichier SWF d'une "carte virtuelle" avec différents emplacements. Lorsque vous cliquez sur chaque emplacement, l'utilisateur est redirigé vers un lien hypertexte.Comment envoyer l'utilisateur à une URL différente en utilisant navigateToURL en fonction de la cible cliquée?

Comment faire pour rediriger chaque emplacement vers un autre lien hypertexte?

Vous pouvez télécharger le fichier SWF à partir here ou vue en ligne: http://www.fastswf.com/NInMHKU

Voici le code ActionScript qui permet à l'utilisateur d'être redirigé en cliquant sur un lieu:

package 
{ 
    import flash.net.URLRequest; 
    import flash.net.navigateToURL; 
    import flash.events.MouseEvent; 

    public class Map 
    { 
     public function Map() 
     { 
     } 

     public function gotoLocation(param1:int) : void 
     { 
      if(param1 != 999) 
      { 
       navigateToURL(new URLRequest("http://www.baidu.com"),"_blank"); 
      } 
     } 

     private function closeMap(param1:MouseEvent = null) : void 
     { 

     } 
    } 
} 

Après décompilation du fichier SWF avec un programme appelé JPEXS Free Flash Decompiler, je découvre qu'il ya deux différents fichiers AS pour chaque emplacement sur la carte. À titre d'exemple, voici les fichiers de la fontaine.

Source de: Flumsfountain_499.as

package SkylandersSuperchargersMap_26_10_15_fla 
{ 
    import flash.display.MovieClip; 

    public dynamic class Flumsfountain_499 extends MovieClip 
    { 


     public function Flumsfountain_499() 
     { 
     super(); 
     addFrameScript(0,this.frame1,1,this.frame2); 
     } 

     function frame1() : * 
     { 
     stop(); 
     } 

     function frame2() : * 
     { 
     stop(); 
     } 
    } 
} 

Source de: flumsfountainlPU_520.as

package SkylandersSuperchargersMap_26_10_15_fla 
{ 
    import flash.display.MovieClip; 

    public dynamic class flumsfountainlPU_520 extends MovieClip 
    { 


     public function flumsfountainlPU_520() 
     { 
     super(); 
     addFrameScript(18,this.frame19); 
     } 

     function frame19() : * 
     { 
     stop(); 
     } 
    } 
} 


Auparavant, j'ai essayé ...

j'ai pu utiliser RABCDAsm décompiler le fichier SWF en plusieurs fichiers différents et est le code ici (fichier source:Map.class.asasm) qui est produit par le projet AS3 en haut de cette question:

trait method QName(PackageNamespace(""), "gotoLocation") 
    method 
    name "gotoLocation" 
    refid "TestGotoLocationFunction/instance/gotoLocation" 
    param QName(PackageNamespace(""), "int") 
    returns QName(PackageNamespace(""), "void") 
    flag HAS_PARAM_NAMES 
    paramname "param1" 
    body 
    maxstack 4 
    localcount 2 
    initscopedepth 0 
    maxscopedepth 1 
    code 
     getlocal0 
     pushscope 

     getlocal1 
     pushshort   999 
     ifeq    L13 

     getlex    QName(PackageNamespace("flash.net"), "navigateToURL") 
     getglobalscope 
     findpropstrict  QName(PackageNamespace("flash.net"), "URLRequest") 
     pushstring   "http://www.baidu.com" 
     constructprop  QName(PackageNamespace("flash.net"), "URLRequest"), 1 
     pushstring   "_blank" 
     call    2 
     pop 
L13: 
     returnvoid 
    end ; code 
    end ; body 
    end ; method 
    end ; trait 
+0

_Note_: ** (1) ** Assurez-vous de tester qu'il est possible de recompiler un nouveau ** ** swf travail de ce JPEXS Code décompilé . ** (2) ** Aussi le lien FastSWF.com donne un SWF "modifié" (comme base64 ou tel?) Donc quand il est sauvé du site il ne peut pas être ouvert comme un SWF valide dans un décompilateur (les octets don ne commencent même pas avec les valeurs d'octets "CWS" ou "FWS" attendues). J'ai remplacé le lien FastSWF par un lien testable de votre question précédente. Enfin, confirmez que vous pouvez recompiler avec succès un nouveau fichier SWF. Ensuite, nous saurons où vous avez besoin de réponse, sinon éditer ce code '.ASasm' est votre meilleure option. –

+0

@ VC.One Bonjour, la raison pour laquelle il existe un lien vers un fichier SWF modifié est que le fichier que vous avez édité dans la publication ne redirige pas vers la même URL lorsqu'un utilisateur clique sur un emplacement. Pouvez-vous me recommander un site Web que je peux télécharger le SWF modifié, un qui peut être ouvert en tant que SWF valide dans un décompilateur? Je vais voir si le fichier SWF peut être recompilé. –

+0

Je veux dire que le site web lui-même est en train de faire une sorte de protection contre la copie avec des swf téléchargés (essayez de sauvegarder le swf à des fins de test ne donne qu'un fichier crypté). Ce n'est pas un problème si vous êtes en ligne uniquement, mais un répondeur devra recréer votre problème en décompilant le swf d'origine. –

Répondre

2

Modifier le fichier de com.binweevils.externalUIs.map.Map.comme:

public function gotoLocation(param1:int) : void 
    { 
    if(param1 == 190) 
    { 
     navigateToURL(new URLRequest("http://www.different.com"),"_blank"); 
    } 
    else if(param1 == 113) 
    { 
     navigateToURL(new URLRequest("http://www.something.com"),"_blank"); 
    } 
    else 
    { 
     navigateToURL(new URLRequest("http://www.baidu.com"),"_blank"); 
    } 
    } 

Vous pouvez trouver des valeurs pour param1 de:

 this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.halloween_btn,818)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.sinksSub_btn,116)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.tinksTree_btn,191)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.doshPalace_btn,102)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.gongsPipenest_btn,103)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.shoppingMall_btn,104)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.castleGam_btn,113)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.flem_manor_btn,125)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.partyBox_btn,10013)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.rumsCove_btn,129)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.flumsFountain_btn,190)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.riggsPalladium_btn,111)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.post_btn,120)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.figgsCafe_btn,156)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.grottoClub_btn,109)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.labsLab_btn,172)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.nestStreet_btn,115)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.nest_btn,5)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.binPetsParadiseRight_btn,100)); 
    this.mapLocs.push(new com.binweevils.externalUIs.map.MapLocation(this,this.binPetsParadiseLeft_btn,101)); 

Chaque ligne:

this.mapLocs.push(new com.binweevils.externalUIs.map. MapLocation(this,this.flumsFountain_btn,190));

fournit les buttonMC et roomID qui peut en outre être utilisé comme param1 pour la gotoLocation() pour naviguer dans le navigateur de manière conditionnelle.

Vous pouvez télécharger le fichier SWF de https://drive.google.com/open?id=0B_AKfmXEaZvQUldqNkU3ZW9ZMTg

NOTE: You shouldn't decompile and use others property without permission unless it is for educational purpose.

+0

Merci pour votre réponse, je suis sur le point de l'essayer. Puis-je demander où vous avez obtenu la liste de valeurs pour param1? –

+0

Elles ont été trouvées dans le même fichier Map.as –

0

Si le château ou tout autre élément pourrait donner une propriété d'une valeur de chaîne unique, vous pouvez essayer quelque chose comme

private function mClick(me:MouseEvent):void{ 
    goToURL(me.target.url_String); 
} 

private function goToURL(urlString:String):void{ 
    navigateToURL(new URLRequest(url_String)); 
} 

vous avez juste besoin d'avoir une propriété appelée url_String dans la classe le château est une instance de (évidemment, il devra être une classe personnalisée) et quand vous instanciez cette classe, définissez sa propriété avec l'URL que vous voulez que le château aille. Comme:

var castle:Location = new Location("http://www.baidu.com"); 

Il est évident que Location serait votre classe personnalisée qui pourrait ressembler à quelque chose comme ceci:

public class Location extends Sprite { 
    public var url_String:String; 
    private function Location(s:String):void{ 
     url_String = s; 
    } 
} 
+0

Salut Neal et merci d'avoir répondu! Je suis très nouveau à AS, mais c'est très excitant d'apprendre. Après avoir décodé le fichier avec RABCDAsm, j'ai trouvé deux fichiers pour le château dans le répertoire 'SkylandersSuperchargersMap_26_10_15_fla', nommé ** gamscastle_293.script.asasm ** et ** gamscastle_293.class.asasm **. Lequel modifierais-je pour donner à l'élément une propriété avec une chaîne unique comme celle que vous avez mentionnée? –

+0

Ooh, probablement la classe –

+0

Merci, je vais essayer. Vous connaissez le code dans mon message original, devrais-je le supprimer? –