您的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;