0

我正在尝试在 AS3 中将按钮设置为不可见,但是当我离开框架并返回到它时,按钮再次可见。这是我为通信技术课程制作的危险游戏。

这是我目前拥有的:

a1.addEventListener(MouseEvent.CLICK, a1mouseClick); 

function a1mouseClick(mouse:MouseEvent) {
    a1.visible = false;
    gotoAndStop("A1");
    trace("Going to A1");
}

但是,当它返回到带有 a1 按钮的框架时,它再次可见。

这是我当前的动画:https ://dl.dropbox.com/u/23938245/jeporady.fla

4

3 回答 3

4

在时间线中移动时,Flash 播放器可以重新创建精灵、影片剪辑和文本字段,因此您的按钮再次可见。为防止重新创建,将所有控件移动到没有关键帧的单独关卡。如果需要关键帧,请尝试在所有关键帧中为此按钮设置相同的实例名称。

于 2013-01-01T21:50:25.070 回答
1

您错过了 Flash 时间线和关键帧如何运作的一个基本方面。一旦您离开该框架,该框架内容的舞台实例及其属性/状态就消失了。当您返回到该帧时,将根据关键帧内容再次创建实例。

我认为考虑到您当前的方法,最好的解决方案是让主板在所有框架中都保持不变。您可以通过为它创建一个图层来做到这一点,并让它的关键帧从第 2 帧延伸到第 27 帧。但是,当您不希望它们可见时,您的下一个问题将是调整该屏幕上所有元素的可见性。

我的建议是将该屏幕的所有元素放入它自己的影片剪辑符号中,并将该影片剪辑及其侦听器的所有代码添加到您创建的这个新层中。例如,您可以将该实例命名为 - main_board,因此您可以使用属性修改它的可见main_board.visible性。如果您确实选择了该解决方案,则需要修改该框架上的所有代码以也使用该实例名称,即:

main_board.a1.visible = false;

此外,您还需要修改所有 addEventListener 行:

main_board.a1.addEventListener(MouseEvent.CLICK, a1mouseClick);

你对这个游戏的方法可以大大简化,但比我已经讨论的更远超出了这个问题的范围!

于 2013-01-01T22:01:49.457 回答
1

@fsbmain 和 @prototypical 他们是对的。

在时间线中移动时,Flash 播放器可以重新创建精灵、影片剪辑和文本字段,因此您的按钮再次可见。为防止重新创建,将所有控件移动到没有关键帧的单独关卡。如果需要关键帧,请尝试在所有关键帧中为此按钮设置相同的实例名称。

我正在查看您的项目并提供快速修复,您需要执行以下操作:

  1. 在顶部创建一个新层,以使用以下操作管理所有框架的一些可用操作:

    import flash.display.DisplayObject;
    
    // Manages the buttons visible state 
    var buttonsStates:Object = {
        "a1":true, "b1":true, "c1":true, "d1":true, "e1":true,
        "a2":true, "b2":true, "c2":true, "d2":true, "e2":true,
        "a3":true, "b3":true, "c3":true, "d3":true, "e3":true,
        "a4":true, "b4":true, "c4":true, "d4":true, "e4":true,
        "a5":true, "b5":true, "c5":true, "d5":true, "e5":true
    };
    
    // Checks the buttons visibility
    function checkVisibility () {   
        for (var buttonName:String in buttonsStates)
        {
            var child:DisplayObject = this.getChildByName(buttonName);
            child.visible = buttonsStates[buttonName];
        }
    }
    
    // Saves the visible satatus to false
    function setVisibilityToFalse(target:*) {
        buttonsStates[target.name] = false;
        target.visible = false;
    }
    
  2. 每次要检查按钮的可见性时,都必须调用该checkVisibility()函数。例如,每次返回按钮列表。

  3. 最后,每个按钮的事件处理程序必须是这样的:

    function a1mouseClick(mouse:MouseEvent) {
        setVisibilityToFalse(mouse.currentTarget); // Saves the visible state to false
        gotoAndStop("A1");
        trace("Going to A1");
    }
    

您可以在此处下载编辑后的文件http://cl.ly/Lt6X

于 2013-01-01T23:55:51.840 回答