在单个Action Script中编写多个按钮(几乎相同)的脚本问题

时间:2013-04-14 01:19:12

标签: actionscript-3 flash actionscript flash-cs5 flash-cs4

我是动作脚本3的菜鸟,所以请原谅这个详细的帖子! (和代码发布错误)

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

  • 介绍场景
  • “Main_ Sequence”
  • 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部分是指我分配给主序列上每个按钮的唯一实例名称 ...我更改了{每个#中{1}}因为我在某处读到每个事件必须不同(?) ..每次我测试场景我都会得到以下内容......

TypeError:错误#1009:无法访问空对象引用的属性或方法。     在music_Sheet_project_14_Main_Sequence_fla :: MainTimeline / frame1(...然后场景开始,然后做动画,然后是鼠标悬停效果但按钮应该返回错误(?)如果我点击它们就不会产生“反应”

...每次我测试电影(只用那么短的代码!)我得到以下内容......

14编译器错误

所有1021:重复的功能定义。来源:MouseDownHandlr

..所以我尝试了不同的路线......

** Code2 **这是我在尝试修复第一个代码时发现的不同代码。

function mouseDownHandler(event:MouseEvent):void {

......这种情况还有15次,包括第64行

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");
}

当我尝试运行时,我得到以下内容......

“1083:语法错误:其他是意料之外的。来源{ else if (nameOfButton=="ysm_g"); { gotoAndStop(1, "You_shook_me");

当我查看这个时,我得到了语法错误的建议......但为什么它会选择这一行而不是所有其他行......我已经尝试重新输入并重新格式化但是我一直收到这个错误..

* 哪些代码最适合使用? (为什么它不起作用?) 任何/所有建议&非常感谢帮助...谢谢! *

2 个答案:

答案 0 :(得分:0)

问题是你在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");
}

答案 1 :(得分:0)

如果将对象链接到要触发的场景名称,则可以避免整个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);
    }
}