Actionscript 3 AS3在MovieClip中更改帧/实例

Actionscript 3 AS3在MovieClip中更改帧/实例,actionscript-3,flash,Actionscript 3,Flash,我不是程序员,所以如果我的问题太离谱,请原谅我 我在我的图书馆里创作了一部叫做“技巧”的电影。然后我在我的舞台上添加了三个电影剪辑的实例,分别称为“skill\u 01”、“skill\u 02”和“skill\u 03”。我选择了所有三个实例,并创建了另一个名为“图”的MovieClip,将它们嵌套在其中。稍后,我将在这个名为“图表”的MovieClip中添加更多技能实例,但现在,我需要使用三个实例的基础知识 主时间线或阶段只有1帧,“图表”MovieClip实例也是如此。但是,技能实例都有两

我不是程序员,所以如果我的问题太离谱,请原谅我

我在我的图书馆里创作了一部叫做“技巧”的电影。然后我在我的舞台上添加了三个电影剪辑的实例,分别称为“skill\u 01”、“skill\u 02”和“skill\u 03”。我选择了所有三个实例,并创建了另一个名为“图”的MovieClip,将它们嵌套在其中。稍后,我将在这个名为“图表”的MovieClip中添加更多技能实例,但现在,我需要使用三个实例的基础知识

主时间线或阶段只有1帧,“图表”MovieClip实例也是如此。但是,技能实例都有两个帧:在第1帧中,我有一个PNG图像,显示它们处于锁定/脱机状态;在第2帧中,我有另一个PNG图像,显示它们处于解锁/联机状态我需要能够通过单击和右键单击它们来切换它们,就像下面的示例(请参见链接)

我正在尝试这样做,当您左键单击技能实例时,它们通过切换到第2帧中的PNG图像切换到联机/解锁,当您右键单击它们时,它返回到第1帧(脱机/锁定)。我试过几行不同的代码,包括Adobe自己推荐的代码和其他代码,但我不知道我做错了什么。右键单击时,它将转到第2帧并拒绝返回第1帧

这是我在MovieClip中的代码:

stop();
skill_01.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame);

function fl_ClickToGoToNextFrame(event:MouseEvent):void
{
  gotoAndStop(2);
}
这部分代码不起作用:

skill_01a.addEventListener(MouseEvent.RIGHT_CLICK, fl_ClickToGoToPreviousFrame);

function fl_ClickToGoToPreviousFrame(event:MouseEvent):void
{
  prevFrame();
}
截图1: gyazo(dot)com/E622BAEE46C3FABD8C9A8D2DF8396FE

截图2: gyazo(dot)com/1b360716a5d243aa74e2be4127fe9a5b

(很抱歉输入这样的链接,因为我刚刚注册了这个论坛,所以不能添加超过1个链接)

为了了解更多的上下文,我正在尝试制作一个技能树,其工作原理与此类似:


我将感谢任何人帮助我解决这个问题

如果你把你的电影唇命名为skill\u 01,那么skill\u 01a是什么

还可以将事件侦听器及其回调函数添加到movieclip的父级中,并在回调函数内部,为了访问事件所有者,请使用

// stop(); not necessary to call stop if you have only 1 frame

with (this.diagram) {
  skill_01.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame);
  skill_02.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame);
  skill_03.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame);
  skill_04.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame);
  skill_01.gotoAndStop(1);
  skill_02.gotoAndStop(1);
  skill_03.gotoAndStop(1);
  skill_04.gotoAndStop(1);
}

function fl_ClickToGoToNextFrame(event:MouseEvent):void
{
  if (MovieClip(event.target.parent).currentFrame == 1)
    MovieClip(event.target.parent).gotoAndStop(2);
  else
    MovieClip(event.target.parent).gotoAndStop(1);
}
编辑:当从单击的movieclip发送事件时,层次结构树中只有最后一个movieclip将作为
事件传递。目标
在您的示例中,可以是skill_01(如果currentframe为1)或skill_1a(如果currentframe为2)。在问题正文中,skill的第1帧和第2帧中不仅有一个png图像,它们是movieclip的,将作为event.target返回。但是,如果您只放置位图(locked.png和unlocked.png),而不是skill_01和skill_01a,那么前面的代码可以正常工作。位图不捕捉事件,所以它的父对象是谁接受了点击事件,这有点让人困惑,我不擅长解释

如果很难理解

我们将使用类似的东西,更简单但更大的代码
你能解释一下第二个代码块是什么吗?在哪里添加?还有什么是skill_01a(“a”后缀)单击时,第一个块使movieclip跳转到第2帧当右键单击skill_01是第1帧中的实例,skill_01a是第2帧中的实例时,第二个块应使movieclip跳回第1帧,这是完全错误的。试着像我一样重写一遍。你必须从外面控制那个按钮(推荐)我试过了,程序运行没有错误,但当我点击MovieClip时什么都没有发生,它甚至不会进入第2帧是的,代码不完整,它只是对那个部分的建议,必须编辑,让我先来完成它首选的代码必须复制到主时间线,button Movieclip的一个实例可能存在于stage中,并且必须命名为skill_01,仅此而已,好运气当我将代码放入Movieclip实例中时,当我将代码放入主时间线时不会发生任何事情,我得到一个错误“未定义属性技能的访问”我很难理解这里出了什么问题…@Nimvoker根据我之前的评论,你必须在你的主舞台上有一个名为skill_01的电影剪辑,你在主时间线中有多少帧?
with (this.diagram) {
  skill_01.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame_s1);
  skill_02.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame_s2);
  skill_03.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame_s3);
  skill_04.addEventListener(MouseEvent.CLICK, fl_ClickToGoToNextFrame_s4);
  skill_01.gotoAndStop(1);
  skill_02.gotoAndStop(1);
  skill_03.gotoAndStop(1);
  skill_04.gotoAndStop(1);
}

function fl_ClickToGoToNextFrame_s1(event:MouseEvent):void {
 toggle_buttons(skill_01);
}
function fl_ClickToGoToNextFrame_s2(event:MouseEvent):void {
 toggle_buttons(skill_02);
}
function fl_ClickToGoToNextFrame_s3(event:MouseEvent):void {
 toggle_buttons(skill_03);
}
function fl_ClickToGoToNextFrame_s4(event:MouseEvent):void {
 toggle_buttons(skill_04);
}

function toggle_buttons(button:MovieClip):void
{
  if (button.currentFrame == 1)
    button.gotoAndStop(2);
  else
    button.gotoAndStop(1);
}