在单个动作脚本中编写多个按钮(几乎相同)的问题
Posted
技术标签:
【中文标题】在单个动作脚本中编写多个按钮(几乎相同)的问题【英文标题】:Problems Scripting Multiple Buttons(nearly identical) in a single Action Script 【发布时间】:2013-04-06 08:39:37 【问题描述】:我是动作脚本 3 的菜鸟,所以请原谅这个详细的帖子! (和代码发布错误)
我正在制作一个交互式 Flash 项目...它有 17 个独立的场景...
介绍场景 “主序列” 15 个单独的标题歌曲页面我已经编写了 Intro-->“main”序列的脚本,没有任何问题 ....
我的问题是“主序列”有 15 个按钮,我需要将它们链接到 15 个单独的场景......我尝试了两组不同的代码(见下文)并不断收到编译器错误。 .. ..如果有人能告诉我这两种格式中哪一种最适合我的目的以及我到底做错了什么,我将不胜感激..
代码 1: 这是我用来将各个页面链接回主序列的修改后的代码
TD_g.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler1);
function mouseDownHandler1(event:MouseEvent):void
gotoAndStop(1,"Tweedlee_Dee");
s_g.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler2);
function mouseDownHandler2(event:MouseEvent):void
gotoAndStop(1,"Sincerely");
ats_g.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler3);
function mouseDownHandler3(event:MouseEvent):void
gotoAndStop(1,"Ain’_that_a_shame");
...重复 15 次 ..._g
部分是指我分配给主序列上每个按钮的唯一 实例名称 ...我更改了 #
在每个MouseDownHandlr
因为我在某处读到每个事件都必须不同(?)
..每次我测试场景时,我都会得到以下结果......
TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在 music_Sheet_project_14_Main_Sequence_fla::MainTimeline/frame1( ...然后场景开始,并且它的动画随后是鼠标悬停效果,但是如果我点击它们应该返回错误的按钮(?)不会产生“反应”
...每次我测试电影(只用那个短代码!)我都会得到以下...
14 编译器错误
All 1021:重复的函数定义。来源:function mouseDownHandler(event:MouseEvent):void
..所以我尝试了不同的路线...
**Code2 **这是我在尝试修复第一个代码时发现的风格不同的代码
stop();
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");
...包括第 64 行在内,这种情况又重复了 15 次
else if (nameOfButton=="ysm_g");
gotoAndStop(1, "You_shook_me");
当我尝试运行它时,我得到以下...
"1083: 语法错误:else is unexpected. 来源else if (nameOfButton=="ysm_g");
当我查找此内容时,我收到有关语法错误的建议...但是为什么会选择这一行而不是所有其他行...我已尝试重新键入和重新格式化,但我一直收到该错误.. .
*哪些代码最适合使用? (为什么它不起作用???) 任何/所有建议和帮助将不胜感激......谢谢! *
【问题讨论】:
在此处跟进新问题***.com/questions/16000556/…(对于那些对结果感到好奇的人) 【参考方案1】:问题是在 else 语句之前没有相应的右大括号。此外,您在 else 末尾有分号,这会搞砸:
else if (nameOfButton=="ysm_g");
gotoAndStop(1, "You_shook_me");
应该是
//...Whatever code goes here
else if (nameOfButton=="ysm_g")
gotoAndStop(1, "You_shook_me");
【讨论】:
您好,感谢您的快速回复!我删除 ;我仍然收到编译器错误 1083: Syntax error: else is unexpected.else if (nameOfButton=="ysm_g") 对不起,我没有正确查看代码。我已经编辑了我的答案以反映真正的问题。 谢谢它有效! ..但是现在我得到 ...1021: Duplicate function definition...source : function mouseDownHandler(event:MouseEvent):void ....我为每首歌曲都得到了 15 次...当电影加载时按钮仍然不起作用... 我的另一个相关问题是我在哪里将stop();
放在该动作脚本上,以便页面动画加载通过具有歌曲按钮和鼠标悬停效果的最终关键帧进行...并停止,而不是现在它立即“跳转”到下一个场景....再次感谢:)
不确定,但您应该将此答案标记为已接受,并使用您的新代码提出一个新问题,因为它是一个单独的问题。请记住,您不能拥有两个名称相同的函数(这就是错误告诉您的内容)。不知道 stop() - 我不使用框架。【参考方案2】:
如果将对象链接到要触发的场景的名称,则可以避免整个 if-elseif 混乱。这更容易阅读和维护,因为所有配置都是在下面的 init() 方法中完成的。方法 setSceneByTarget() 是公开的,因此您可以在运行时添加更多项目。
public class Main extends MovieClip
private var _scenesByTarget:Dictionary;
public function Main()
_scenesByTarget = new Dictionary(true);
//call init() or hook it to ADDED_TO_STAGE event if you want
public function init():void
//add your listeners here like this:
//myItem1.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
//setSceneByTarget(myItem1, myItem1Scene);
//myItem2.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
//setSceneByTarget(myItem2, myItem2Scene);
//...
public function setSceneByTarget(targetObj:Object, targetScene:String):void
_scenesByTarget[targetObj] = targetScene;
private function jumpToSceneByTarget(targetObj):void
if (_scenesByTarget[targetObj] != null)
gotoAndStop(1, _scenesByTarget[targetObj]);
private function onMouseDown(evt:MouseEvent):void
jumpToSceneByTarget(evt.target);
【讨论】:
所以 myItem1 将是按钮还是实例?而 myItemScene 将是场景名称? 所以对于 exTD_g.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); setSceneByTarget(TD_g, Tweedlee_Dee);
意味着点击 TD_g 实例/按钮然后它会将人带到标记为 Tweedlee_dee 的场景?
...您的意思是init() _scenesByTarget = new Dictionary(true);
...?不确定我应该在那里做什么!
对您的第一条评论:是的。对于要更改场景的每个可单击项目,init 方法中有两行。字典将它们链接起来,而 jumpToSceneByTarget 方法将处理其余的操作。对于您关于 init 与 new 字典的问题:这是两行单独的行。您创建了字典,然后调用 init()。以上是关于在单个动作脚本中编写多个按钮(几乎相同)的问题的主要内容,如果未能解决你的问题,请参考以下文章