【问题标题】:Array and EnterFrame eventlistener数组和 EnterFrame 事件监听器
【发布时间】:2014-05-18 10:11:52
【问题描述】:

我有一个问题希望你能帮我解决。我做了那个代码:

var dates_array:Array =[y1,y2,y3];
var i= 1;

for each(var dates_sym:MovieClip in dates_array){
    dates_sym.visible=false;
};

france_map.addEventListener(Event.ENTER_FRAME, fnCheckDate);
function fnCheckDate (evt:Event):void{
var i = france_map.currentFrame;
}

function fnDateSym (evt:Event):void{
dates_array[i].visible=true;
}

它应该根据主要符号是什么框架来显示一个符号(y1,y2或y3(还有更多符号,但为了清楚起见没有将它们放在代码中)。当我编译时,它显示没有错误,但是当我在我的应用程序中尝试时,什么也没有发生。 我还是一个初学者,我真的不明白有什么问题。 如果您需要更多上下文,我可以提供。提前致谢。 杰瑞尔

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    您的fnCheckDate 函数在进入帧时被调用,但该函数除了设置i 之外从不做任何事情。另一个函数 - fnDateSym - 根据 i 的值设置 visible 属性。这就是您想要的 - 但在您发布的代码中的任何地方都不会调用 fnDateSym

    这可能只是因为您遗漏了一些代码。我猜你可能会从其他地方调用fnDateSym,并期望它使用fnCheckDate 设置的全局i。是的,它使用全局i。但是fnCheckDate 没有设置全局i

    var i = france_map.currentFrame;
    

    var 关键字声明了当前范围内的变量。一个函数创建一个新的作用域。换句话说,您将变量i 声明为您的函数的本地变量,并将currentFrame 值分配给该变量-而不是全局范围(var i = 1) 中已经存在的变量i。当您的函数退出时,本地 i 会“丢失” - 而全局 i 没有改变 - 它仍然是 1。

    所以快速解决方法是将其更改为:

    i = france_map.currentFrame;
    

    现在您不是在声明新变量,而是设置全局 i 变量的值。

    ETA:有点“教你如何钓鱼而不是给你一条鱼”......调试这类问题的一种简单方法是使用trace 函数。例如:

    function fnDateSym (evt:Event):void
    {
        trace("i is:", i);
        dates_array[i].visible=true;
    }
    

    现在,如果您在输出窗口中看不到任何痕迹,这意味着您的函数根本没有被调用。如果您经常看到“i is: 1”,那么您就知道i 不会改变,这就是问题的根源。您可以只使用 trace(i) - 我只是倾向于在跟踪中添加某种文本 - 当您有更多跟踪时,可以更容易地判断输出中的每一行是什么。

    无关,只是一点代码审查...

    请注意,ENTER_FRAME 会在每次帧刷新时触发。即,这并不意味着“当我在时间轴上输入新帧时”。它只是意味着“当在播放器中绘制帧时”。换句话说,它每秒调用 24 次 - 或者你在 Flash 中选择的任何帧速率 - 无论 currentFrame 是否不变(例如,因为你调用了 france_map.stop())。

    这在您的情况下可能没问题 - 毕竟,将 visible 设置为 true 每秒 24 次实际上不会导致任何副作用。但是,如果您做的不止于此,则可能会造成浪费 - 或者可能会导致意想不到的问题,因为它的调用频率超出了您的实际预期。

    制作类似于“进入时间线帧”事件的一种方法是:

    var previousFrame:int; // used for storing the last currentFrame we encountered
    
    mc.addEventListener(Event.ENTER_FRAME, enterFrameListener);
    
    function enterFrameListener(event:Event):void
    {
        // Are we on a different frame than last time?
        if (previousFrame != mc.currentFrame)
        {
           currentFrameChanged();
           previousFrame = mc.currentFrame;
        }
    }
    
    function currentFrameChanged()
    {
       // Do stuff that should be done when the current frame changes
       // - rather than on every frame refresh.
    }
    

    很难准确地说出你是如何做事的(同样,因为似乎省略了对 fnDateSym 的调用) - 但取决于fnDateSym 的调用方式,大多数情况下你不需要fnCheckDate一点也不。做吧:

    dates_array[france_map.currentFrame] = true;
    

    除此之外,只是为了“好”,您可能需要声明i的类型:

    var i:int = 0;
    

    【讨论】:

    • 感谢您的帮助。我将 var i 更改为 i 并且它起作用了。但是,我做了你的建议,并用 date_array[france_map.currentFrame] 替换了函数 fnCheckDate!我不知道 EnterFrame,所以我很高兴您花时间解释并提供替代方案。非常感谢!
    • 哦,是的,我在代码中调用了 fnDateSym,但我忘了复制/粘贴它 :)
    猜你喜欢
    • 2014-02-21
    • 2020-05-06
    • 2020-11-29
    • 2019-12-02
    • 1970-01-01
    • 2023-03-14
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多