Actionscript 3 在单个操作脚本中编写多个按钮(几乎相同)时出现问题
我是《动作脚本3》的不速之客,所以请原谅我的这篇详细帖子!(和代码发布错误) 我正在制作一个互动flash项目…它有17个独立的场景Actionscript 3 在单个操作脚本中编写多个按钮(几乎相同)时出现问题,actionscript-3,flash,actionscript,flash-cs5,flash-cs4,Actionscript 3,Flash,Actionscript,Flash Cs5,Flash Cs4,我是《动作脚本3》的不速之客,所以请原谅我的这篇详细帖子!(和代码发布错误) 我正在制作一个互动flash项目…它有17个独立的场景 介绍场景 “主序列” 15个单独的标题歌曲页 我已经编写了介绍-->“主”序列的脚本,没有任何问题 我的问题是“主序列”有15个按钮,我需要将它们链接到15个单独的场景…我尝试了两组不同的代码(见下文),并不断出现编译器错误…。如果有人能告诉我这两种格式中哪种最适合我的目的,我将不胜感激&我到底做错了什么 代码1:这是我用来将各个页面链接回主序列的修改 TD_
- 介绍场景
- “主序列”
- 15个单独的标题歌曲页
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次。。。\u g
部分是指分配给主序列上每个按钮的唯一的实例名称我更改了每个鼠标下指针中的
,因为我在某处读到每个事件都必须不同(?)
…每次我测试场景时,我都会得到以下结果
TypeError:错误#1009:无法访问空对象引用的属性或方法。
在music_Sheet_project_14_Main_Sequence_fla::Main Timeline/frame1(…然后场景以开始并执行动画,然后执行鼠标悬停效果,但如果单击按钮,则应返回错误(?)的按钮不会产生“反应”
…每次我测试这部电影(用这么短的代码!)我都会得到以下结果
14编译器错误
所有1021:重复的函数定义。源:函数mouseDownHandler(事件: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");
}
…这又进行了15次,包括第64行
{
else if (nameOfButton=="ysm_g");
{
gotoAndStop(1, "You_shook_me");
当我尝试运行此程序时,我得到以下结果
“1083:语法错误:else意外。源代码else if(按钮名称==“ysm_g”);
当我查到这一行时,我得到了语法错误的建议…但是为什么它会选择这一行而不是所有的其他行…我尝试过重新键入和重新格式化,但我不断地得到错误
*以下哪种代码最好使用?(为什么不起作用?)
任何/所有的建议和帮助都将不胜感激……谢谢!!!*问题是在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");
}
如果将对象链接到要触发的场景的名称,则可以避免整个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);
}
}
您好,感谢您的快速响应!!我删除了;但仍然收到一个编译器错误1083:语法错误:else是意外的。else if(nameOfButton==“ysm_g”)很抱歉,我没有正确地查看代码。我已编辑了我的答案以反映实际问题。谢谢,它可以工作!。但是现在我得到了…1021:重复的函数定义…来源:函数mouseDownHandler(事件:MouseEvent):void{….每首歌我都会收到15次…当电影加载时,按钮仍然不起作用…我的另一个相关问题是我把stop()放在哪里
在该动作脚本上,以便页面动画加载按最后一个关键帧进行,该关键帧具有歌曲按钮和鼠标悬停效果…并停止,而不是立即“跳转”到下一个场景…再次感谢:)不确定,但您应该将此答案标记为已接受,并使用新代码提出一个新问题,因为这是一个单独的问题。请记住,您不能有两个名称相同的函数(这就是错误告诉您的)。不知道stop()-我不使用框架。请在此处跟进新问题(对于那些对结果好奇的人)因此myItem1将是按钮或实例?myItemScene将是场景名称?因此对于exTD_g.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);setSceneByTarget(TD_g,Tweedlee_Dee);
意味着TD_g实例/按钮被单击,然后它将把人带到标记为Tweedlee_dee?的场景……你是说init()\u scenesByTarget=new Dictionary(true);
…?不确定我应该在那里做什么!对于您的第一条评论:是的。对于每个要更改场景的可单击项,init方法中都有两行。字典将它们链接起来,jumpToSceneByTarget方法将处理其余的操作。对于您关于init与new dictionary的问题:以下是两个分离行。您创建了字典,然后调用init()。