1021:我的动作脚本中的重复函数定义

Posted

技术标签:

【中文标题】1021:我的动作脚本中的重复函数定义【英文标题】:1021: Duplicate function definition in my action Script 【发布时间】:2013-04-06 16:54:03 【问题描述】:

这是对我之前的问题 (Problems Scripting Multiple Buttons(nearly identical) in a single Action Script) 的跟进

我正在制作一个交互式 Flash 项目...它有 17 个独立的场景...

介绍场景 “主序列” 15 个单独的标题歌曲页面 ....

我的第一个问题是“主序列”有 15 个按钮,我需要将它们链接到 15 个单独的场景......我正在使用以下代码......

    TD_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    s_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ats_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    iyk_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    hms_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    tf_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    hd_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ld_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ll_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ts_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ipsy_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ysm_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    ihm_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    iss_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    tl_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
    function mouseDownHandler(event:MouseEvent):void 
   var nameOfButton:String=event.currentTarget.name;
   if (nameOfButton=="TD_g") 
    gotoAndStop(1, "Tweedlee_Dee");
 else if (nameOfButton=="s_g") 
    gotoAndStop(1, "Sincerely");
 else if (nameOfButton=="ats_g") 
    gotoAndStop(1, "Ain’_that_a_shame");
 else if (nameOfButton=="iyk_g") 
    gotoAndStop(1, "I_hear_you_knocking");
 else if (nameOfButton=="hms_g") 
    gotoAndStop(1, "Hearts_made_of_stone");
 else if (nameOfButton=="tf_g") 
    gotoAndStop(1, "Tutti_fruiti");
 else if (nameOfButton=="hd_g") 
    gotoAndStop(1, "Hound_Dog");
 else if (nameOfButton=="ld_g") 
    gotoAndStop(1, "Little_darlin");
 else if (nameOfButton=="ll_g") 
    gotoAndStop(1, "Louie_Louie");
 else if (nameOfButton=="ts_g") 
    gotoAndStop(1, "Twist_and_shout");
 else if (nameOfButton=="ipsy_g") 
    gotoAndStop(1, "I_put_a_spell_on_you");
 else if (nameOfButton=="ysm_g") 
    gotoAndStop(1, "You_shook_me");

 else if (nameOfButton=="ihm_g") 
    gotoAndStop(1, "I_can_hear_music");

 else if (nameOfButton=="iss_g") 
    gotoAndStop(1, "I_shot_the_sheriff");

 else if (nameOfButton=="tl_g") 
    gotoAndStop(1, "Tainted_love");

    

当我运行序列时,我得到以下 15 个错误全部 1021: Duplicate function definition. Source : function mouseDownHandler(event:MouseEvent):void

我尝试更改 ..._g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 以在每个 DownHandler 前包含一个唯一的#next)TD_g.addEventListener12(MouseEvent.MOUSE_DOWN, mouseDownHandler1);..我仍然遇到 15 个错误...

谢谢!

PS ...我还希望在该动作脚本中的某处插入stop();,以便在为该场景播放动画后,人们有机会导航并单击按钮,而不是“跳转”到下一个场景!

【问题讨论】:

【参考方案1】:

我个人更喜欢使用哈希映射/字典来处理这样的名称/值对。 所以你的代码可以写成:

var buttonMap:Dictionary = new Dictionary();
buttonMap["TD_g"] = "Tweedlee_Dee";
buttonMap["s_g"] = "Sincerely";
buttonMap["ats_g"] = "Ain’_that_a_shame";
buttonMap["iyk_g"] = "I_hear_you_knocking";
buttonMap["hms_g"] = "Hearts_made_of_stone";
buttonMap["tf_g"] = "Tutti_fruiti";
buttonMap["hd_g"] = "Hound_Dog";
buttonMap["ld_g"] = "Little_darlin";
buttonMap["ll_g"] = "Louie_Louie";
buttonMap["ts_g"] = "Twist_and_shout";
buttonMap["ipsy_g"] = "I_put_a_spell_on_you";
buttonMap["ysm_g"] = "You_shook_me";
buttonMap["ihm_g"] = "I_can_hear_music";
buttonMap["iss_g"] = "I_shot_the_sheriff";
buttonMap["tl_g"] = "Tainted_love";

TD_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
s_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ats_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
iyk_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
hms_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
tf_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
hd_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ld_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ll_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ts_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ipsy_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ysm_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
ihm_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
iss_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
tl_g.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);

function mouseDownHandler(event:MouseEvent):void 
    gotoAndStop(1, buttonMap[event.currentTarget.name]);

这仍然不能解决您的问题。该错误表明您在代码中的其他位置定义了function mouseDownHandler。单击编译器错误中带有错误的行并找到重复的代码。现在评论它,然后弄清楚为什么它首先被复制/粘贴并改进/修复它。高温

【讨论】:

好的,我想通了...我有 15 个单独的场景(每首歌一个),它们都有 1 个按钮,其代码如下 stop(); "UniqueInstace".addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler); function mouseDownHandler(event:MouseEvent):void gotoAndStop(525,"Main_Sequence"); 这些应该将人们送回在动画完成播放的主序列中,人们可以单击以访问各个页面...这不再起作用,显然需要在每个单独的场景动作脚本页面上进行更改??? @user2278533 看起来您将代码从一帧复制/粘贴到所有其他帧并更改了实例名称,但使用相同的名称保留了处理函数,这在动作脚本中是不允许的。您有多种选择:1. 保持肮脏并为每个按钮设置单独的侦听器,但至少更改处理程序:TD_g.addEventListener(MouseEvent.MOUSE_DOWN, TD_gMouseDownHandler);function TD_gMouseDownHandler(e:MouseEvent):voidTweedlee_Dee 然后s_g.addEventListener(MouseEvent.MOUSE_DOWN, s_gMouseDownHandler);function s_gMouseDownHandler(e:MouseEvent):voidgotoAndStop(1,"Sincerely"); @user2278533 2. 使所有框架中的所有按钮实例都可用,尽管它们在视图中/仅可在它们需要的框架上单击(这样您在使用时不会得到空对象引用添加侦听器),您可以像上面的代码一样在一帧中一次性设置所有鼠标处理程序。 3. 类似于 2,但如果您不想让实例在所有帧上可用,请使用 Event.RENDER 的事件处理程序并使用 stage.invalidate()...大量的 posts 技术,但是对你来说不像 2 那样容易 我不是很清楚..我为“主页”按钮设置了单独的实例名称,因此每个页面的代码现在看起来像 ...stop(); td_home.addEventListener(MouseEvent.MOUSE_DOWN,td_homemouseDownHandler); function td_homemouseDownHandler(event:MouseEvent):void gotoAndStop(525,"Main_Sequence"); 一切正常,没有编译器代码错误然而(见下一条评论) 当我去“测试电影”时,它需要永远加载(有时不会..)&当它正常工作时播放第一个场景,然后当它进入“主序列”时开始动画的第一部分,然后出现以下错误类型错误:错误 #1009:无法访问空对象引用的属性或方法。在 music_Sheet_project_15_fla::MainTimeline/frame91() ..我应该在第 91 帧寻找什么?

以上是关于1021:我的动作脚本中的重复函数定义的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义类导入 Flex 中的 mxml 文件? (动作脚本 3)

未定义的函数'concat' vb.net [重复]

jQuery .click() 在自定义函数之前执行默认动作

shell脚本的函数介绍和使用案例

面向对象

脚本-流程