Array和EnterFrame eventlistener

时间:2014-05-18 10:11:52

标签: actionscript-3 flash

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

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(有更多的符号,但为了清晰起见并没有将它们放在代码中),这取决于主符号是什么帧。当我编译时,它没有显示错误,但是当我在我的应用程序中尝试它时,没有任何反应。 我还是个初学者,我真的不明白什么是错的。 如果您需要更多上下文,我可以给它。提前致谢。 病毒Jeryl

1 个答案:

答案 0 :(得分:0)

在输入框架上调用fnCheckDate函数,但除了设置i之外,该函数从不执行任何操作。另一个函数 - fnDateSym - 根据visible的值设置i属性。这是你想要的 - 但fnDateSym永远不会在你发布的代码中的任何地方被调用。

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

var i = france_map.currentFrame;

var关键字声明当前范围内的变量。函数创建新范围。换句话说,您要为函数声明一个变量i并将currentFrame赋值给它 - 而不是全局范围中已存在的变量i({{ 1}})。当您的功能退出时,本地var i = 1“丢失” - 全局i未更改 - 它仍为1。

所以快速修复只需将其更改为:

i

现在您没有声明新变量,而是设置全局i = france_map.currentFrame; 变量的值。

ETA :有点“教你如何钓鱼,而不是给你一条鱼”......调试这些问题的一个简单方法是使用以下方法检查变量的值i功能。例如:

trace

现在,如果在输出窗口中没有看到任何痕迹,则表示根本没有调用您的函数。如果你经常看到“我是:1”,那么你知道function fnDateSym (evt:Event):void { trace("i is:", i); dates_array[i].visible=true; } 没有改变,这就是问题的根源。你可以只使用trace(i) - 我只是倾向于在跟踪中添加某种文本 - 当你有更多的痕迹时,更容易分辨输出中的每一行是什么。

无关,只需进行一些代码审查......

请注意,i会在每次刷新时触发 。即,它并不意味着“当我在时间轴上输入新的帧时”。它只是意味着“当在玩家中绘制一个帧时”。换句话说,它被称为每秒24次 - 或者你在Flash中选择的任何帧速率 - 无论ENTER_FRAME是否没有改变(例如因为你已经调用currentFrame)。

在您的情况下这可能没问题 - 毕竟,将france_map.stop()设置为visible每秒24次并不会产生任何副作用。但是,如果你做的不止这些,那可能会浪费 - 或者它可能会导致意想不到的问题,因为它的调用次数比你真正想要的要多。

制作类似于“输入时间轴框架”事件的一种方法是:

true

很难准确地说出你是如何做事的(再次,因为似乎忽略了对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