Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 数组和EnterFrame eventlistener_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 数组和EnterFrame eventlistener

Actionscript 3 数组和EnterFrame eventlistener,actionscript-3,flash,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):voi

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

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

您的
fnCheckDate
函数在enter frame上被调用,但该函数除了设置
i
之外什么都不做。另一个函数-
fnDateSym
基于
i
的值设置
可见的
属性。这是您想要的-但是
fnDateSym
在任何地方都不会被调用你发布的代码

这可能是因为您遗漏了一些代码。我猜您可能是从其他地方调用了
fnDateSym
,希望它使用由
fnCheckDate
设置的全局
I
。是的,它将使用全局
I
。但是
fnCheckDate
没有设置全局
I

var i = france_map.currentFrame;
var i:int = 0;
var
关键字在当前范围内声明一个变量。函数创建一个新的范围。换句话说,您正在为函数声明一个变量
i
本地,并将
currentFrame
值赋给该变量,而不是全局范围内已经存在的变量
i
var i=1
)。当您的函数退出时,本地
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
没有改变,这是问题的根源。您可以使用跟踪(i)-我只是倾向于在跟踪中添加一些文本-当您有更多跟踪时,更容易判断输出中的每一行是什么

不相关,只是一点代码检查

请注意,
ENTER_FRAME
在每次帧刷新时都会被触发。也就是说,它不是指“当我在时间轴上输入新帧时”。它只是指“当一帧在播放器中绘制时”。换句话说,它被称为每秒24次-或者无论您在Flash中选择的帧速率如何-无论
currentFrame
是否发生变化(例如,因为您调用了
france\u 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 = france_map.currentFrame;
var i:int = 0;

谢谢你的帮助。我把变量I改成了I,它成功了。但是,我做到了,我按照你的建议,用date_数组[france_map.currentFrame]替换了函数fnCheckDate!我不知道EnterFrame,所以我真的很高兴你花时间解释并给出一个替代方案。非常感谢!哦,是的,我在代码中打电话给fnDateSym higher,但我忘了复制/粘贴它:)