2016-11-12 2 views
1

У меня есть SWF-файл «виртуальной карты» с разными местоположениями. Когда каждое местоположение кликается, пользователь перенаправляется на гиперссылку.Как я могу отправить пользователя на другой URL-адрес, используя navigateToURL, в зависимости от выбранной цели?

Как я могу перенаправить каждое местоположение на другую гиперссылку?

  • Если фонтан была нажата, пользователь будет перенаправлен на http://different.com
  • Если замок щелкнул, пользователь будет перенаправлен на http://something.com

Вы можете скачать SWF из here или представления он онлайн: http://www.fastswf.com/NInMHKU

Вот код ActionScript, который позволяет пользователю перенаправляться при нажатии на местоположение:

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 
     { 

     } 
    } 
} 

После декомпиляции SWF-файла с программой под названием JPEXS Free Flash Decompiler, я обнаружил, что есть две разные AS-файлов для каждого места на карте. В качестве примера ниже приведены файлы для фонтана.

Источник: 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(); 
     } 
    } 
} 

Источник: 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(); 
     } 
    } 
} 


Раньше я пытался ...

Я был в состоянии использовать RABCDAsm декомпилировать SWF в множество различных файлов, а вот код (исходный файл:Map.class.asasm), который производится по проекту AS3 в верхней части этого вопроса:

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) ** Убедитесь, что вы проверить, что можно повторно скомпилировать ** рабочий ** новые швейцарские франки от JPEXS декомпилирован код , ** (2) ** Также, что ссылка FastSWF.com дает «модифицированный» SWF (например, base64 или такой?), Поэтому, когда он сохраняется с сайта, он не может быть открыт как допустимый SWF в декомпиляторе (байты don даже начинать с ожидаемых значений «CWS» или «FWS» байтов). Я заменил ссылку FastSWF на тестовую ссылку из вашего предыдущего Вопроса. Наконец, подтвердите, что вы можете успешно скомпилировать новый SWF. Затем мы будем знать, что вам нужно, и в противном случае отредактировать код '.ASasm' - ваш лучший вариант. –

+0

@ VC.One Привет, причина, по которой есть ссылка на модифицированный SWF, заключается в том, что правильный, который вы редактировали в сообщении, не перенаправляется на тот же URL-адрес при щелчке по местоположению. Можете ли вы порекомендовать мне сайт, на который я могу загрузить измененный SWF, который можно открыть как действительный SWF в декомпиляторе? Я рассмотрю, можно ли скомпилировать SWF. –

+0

Я имею в виду, что сам сайт делает какую-то защиту от копирования с загруженными swf (попробуйте сохранить swf для целей тестирования, только дает зашифрованный файл). Не проблема, если просмотр в режиме онлайн, но ответчик должен будет заново создать вашу проблему, декомпилировав исходный swf. –

ответ

2

Редактировать файл com.binweevils.externalUIs.map.Map.в:

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

Вы можете найти значения для param1 из:

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

Каждая строка:

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

Обеспечивает buttonMC и roomID которые в дальнейшем могут быть использованы в качестве param1 для gotoLocation(), чтобы условно перемещаться в браузере.

Вы можете скачать SWF из 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

Спасибо за ваш ответ, я собираюсь попробовать. Могу ли я спросить, откуда у вас есть список значений для param1? –

+0

Они были найдены в том же файле Map.as –

0

Если замок или любой другой элемент может быть дан свойство с уникальным значением строки, вы можете попробовать что-то вроде

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

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

Вам просто нужно иметь свойство, называемое url_String в классе, замок является экземпляром (очевидно, это должен быть пользовательский класс), и когда вы создаете экземпляр этого класса, определите его свойство с URL-адресом, в который вы хотите, чтобы замок был включен. Как:

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

Очевидно Location бы ваш пользовательский класс, который может выглядеть примерно так:

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

Hi Neal и спасибо, что ответили! Я очень новичок в AS, но это довольно захватывающее обучение. После того, как я расшифровал файл с помощью RABCDAsm, я нашел два файла для замка в каталоге 'SkylandersSuperchargersMap_26_10_15_fla', названном ** gamscastle_293.script.asasm ** и ** gamscastle_293.class.asasm **. Какой из них я хотел бы изменить, чтобы дать элементу свойство с уникальной строкой, как вы упомянули? –

+0

Ооо, наверное, первый класс –

+0

Спасибо, я попробую это. Вы знаете код в моем оригинальном посте, я должен удалить его? –

 Смежные вопросы

  • Нет связанных вопросов^_^