2013-04-01 73 views
1

我正在使用flash/actionscript进行游戏,特别是在某些事情上我有点麻烦。我在闪光方面的知识确实有限,因此在这里可能无助于我,但无论如何。在我的游戏中,我有一个帮助按钮。如果点击此按钮,会弹出一个屏幕,显示如何对玩家执行操作。这些说明分为多个SWF文件,每次单击此按钮时,都会将这些外部SWF文件中的一个加载到游戏中以供使用。如何使用Actionscript 3卸载或删除外部加载的SWF?

我可以做这个部分就好了,但是如果玩家进一步进入游戏并点击帮助按钮,则会显示帮助以及以前显示的每个帮助文件。

很显然,我不希望发生这种情况,我尝试了很多没有成功的事情。

任何建议非常感谢。

编辑: 这是我用来加载帮助文件的代码。

private function prepHelp(title:String):void 
    { 
     // introduction help files 
     switch(title) { 
      case "Welcome to Game Module 1": gameUI.singleton.loadHelp("Help/game_module1.swf"); break; 
      case "Welcome to Game Module 2": gameUI.singleton.loadHelp("Help/game_module2.swf"); break; 
      case "Welcome to Game Module 3": gameUI.singleton.loadHelp("Help/game_module3.swf"); break; 
     } 
    } 

这些叫我loadHelp()函数在gameUI类:

public function loadHelp(file_name:String):void 
    { 
     helpBtn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void { 

       _helpObject.loadHelp(file_name); 
       singleton.addChild(_helpObject); 
       _helpObject.dispatchEvent(new Event("getHelp")); 
      } 
     ); 
    } 

这样一来,帮助SWF被加载在我helpView.as类我_helpObject对象:

public class helpView extends Sprite 
{ 
    // variables associated with loading help content 
    private var _helpLoader:Loader; 
    private var _loader:Loader; 
    private var _helpRequest:URLRequest; 
    private var _helpMc:MovieClip = new MovieClip(); 

    private var _exitButton:Sprite = new Sprite(); 

    public function helpView():void {} 

    public function loadHelp(help_file:String):void 
    { 
     _helpRequest = new URLRequest("swf/help_files/"+help_file); 
     initialize(); 

     addEventListener("getHelp", getHelp); 
    } 

    private function initialize():void 
    { 
     _exitButton.graphics.lineStyle(1, 0x000000, 1); 
     _exitButton.graphics.beginFill(0xffffff); 
     _exitButton.graphics.drawRect(0, 0, 75, 25); 
     _exitButton.graphics.endFill(); 
     _exitButton.buttonMode = true; 
     _exitButton.alpha = 1; 

     _exitButton.x = gameUI.singleton.stage.stageWidth - 210; 
     _exitButton.y = gameUI.singleton.stage.stageHeight - 55; 

     _exitButton.addEventListener(MouseEvent.CLICK, closeHelp); 
    } 

    private function getHelp(evt:Event):void 
    { 
     _helpLoader = new Loader(); 
     _helpLoader.load(_helpRequest); 

     _helpLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, showHelp); 
    } 

    private function showHelp(evt:Event):void 
    { 
     _loader = Loader(evt.target.loader); 

     // set the width and height of the help swf to the dimensions of the game window. 
     _loader.content.width = gameUI.singleton.stage.stageWidth; 
     _loader.content.height = gameUI.singleton.stage.stageHeight; 

     _helpMc.addChild(_loader.content); 
     _helpMc.addChild(_exitButton); 
     addChild(_helpMc); 
     setChildIndex(_helpMc, numChildren - 1); 

     _helpLoader.removeEventListener(Event.COMPLETE, showHelp); 
    } 

    private function closeHelp(evt:MouseEvent):void 
    { 
     removeChild(_helpMc); 
    } 
} 

回答

0

你可以删除/卸载加载论文帮助外部SWF装载机..

addChild(yourloader)  //adds the loader 
removeChild(yourloader) // removes your loader 

另外,如果您使用数组来存储电影(SWFS),则可以清除array.lenght = 0; 可能一个循环函数会更合适。

var len:int = TempSWFS.length; 
    for(var i:int = 0; i < len; i++) { 
    if(TempSWFS[i] != null && TempSWFS[i].parent != null){ 
     TempSWFS[i].parent.removeChild(TempSWFS[i]); 
    } 
+0

'removeChild()'不会删除该对象。它只“隐藏”它(从显示列表中删除)。它仍然继续播放,发出声音,等等。 – strah

+0

我试过使用'unload()'和'unloadAndStop()'应该照顾它,没有成功。我在想,@Mike在他的上述评论中说过,如果这是真的,可能可以解释为什么我现在没有尝试任何工作。 – hRdCoder

1

我认为你遇到的问题是孤儿swfs。所以当swf被加载时,它会被显示,但是当你准备移动到下一个swf时(至少不能正确卸载),它不会被卸载...

如果你想维护这种技术,你需要确保您在完成使用后卸载swf(正确,无泄漏)。

在我的游戏,一般的指示屏幕不是那么重,我会想加载和卸载SWF的,所以我不知道你的情况,而是一个建议,我会做的是:

负荷所有您的swfs和游戏之前显示的信息(preloader阶段) 然后根据需要显示游戏或隐藏相应的帮助剪辑。

IE:

  • 有加载你的游戏指令SWF文件一起预加载。
  • 拥有preloader提供了一个参考加载的指令swfs到游戏
  • 有游戏存储在某些数组/矢量中的引用。
  • 如果用户点击帮助按钮,显示该第一指令SWF,并设置一些“currentClip”变量设置为指向所述第一指令瑞士法郎
  • 如果用户点击关闭按钮,隐藏“currentClip”
  • 如果用户点击下一条指令/ Prev指令,隐藏currentClip,显示下/ Prev指令SWF,并重新初始化currentClip变量显示加载...

如果你能提供一些来源,我大概可以帮助你更有效。

0

好吧,我解决了它。我所做的是我创建了引用每个SWF文件的对象,并将它们全部引入到一个数组中,以及一个跟踪应该加载SWF的引用变量。该参考变量跟踪玩家所在游戏的当前区域,因此当玩家点击帮助按钮时,右侧的SWF将被加载并显示给他们,然后当他们单击退出时可以直接回到游戏。

谢谢大家对我的帮助。

+0

另外,如果你使用数组来存储电影(SWFS),你可以清除数组,我已经建议,好你解决了它 – joshua

+0

这可能会工作,但如果我理解正确,我会清理并重新创建数组单击帮助按钮的时间,那么通过在程序启动时立即加载所有内容并在使用时加载/卸载文件,可以使此方法更高效一些? – hRdCoder

+0

我建议当添加项目到阶段推(intoArray)如果你删除这个,它不会从内存中删除只是引用,如果你删除了loaders.info数组,那么你将需要加载,所以有两个数组一个为装载机和另一个当你添加到舞台 – joshua

相关问题