我有一个问题,希望你能帮我解决。我做了那个代码:
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
答案 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