【问题标题】:AS3 Change Frame/Instance within MovieClipAS3 在 MovieClip 中更改帧/实例
【发布时间】:2017-03-17 15:44:05
【问题描述】:

我不是程序员,所以如果我的问题太幼稚,请原谅我。

我在我的库中创建了一个名为“skill”的影片剪辑。然后,我在我的舞台中添加了该 MovieClip 的三个实例,分别称为“skill_01”、“skill_02”和“skill_03”。我选择了所有三个实例并创建了另一个名为“图表”的影片剪辑,以将它们嵌套在其中。稍后我将在这个名为“图表”的影片剪辑中添加更多技能实例,但现在,我需要使用三个实例的基础知识。

主时间线或舞台只有 1 帧,“图表”MovieClip 实例也是如此。但是,技能实例都有两个帧:在第 1 帧中,我有一个 PNG 图像显示它们被锁定/离线,而在第 2 帧中,我有另一个 PNG 将它们显示为解锁/在线。 我需要能够通过单击并右键单击它们来切换它们,就像在下面的示例中一样(参见链接)

我正在尝试这样做,以便当您左键单击技能实例时,它们会通过切换到第 2 帧中的 PNG 图像切换到在线/解锁,当您右键单击它们时,它会返回到第 1 帧(离线/锁定)。我尝试了几行不同的代码,包括 Adob​​e 自己推荐的代码行和其他代码行,但我无法弄清楚我做错了什么。右击会跳转到第2帧,拒绝返回第1帧。

这是我在电影剪辑中的代码:

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/e622baee46c3fabbd8c9a8d2df8396fe

屏幕截图 2: gyazo(点)com/1b360716a5d243aa74e2be4127fe9a5b

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

有关更多上下文,我正在尝试制作与此类似的技能树:http://www.dungeonsanddevelopers.com/#__6_Your

如果能帮我解决这个问题,我将不胜感激!

【问题讨论】:

  • 你能解释一下第二个代码块是什么吗?它在哪里添加?还有什么是skill_01a('a'后缀)
  • 第一个块使动画剪辑在单击时跳转到第 2 帧 第二个块应该使动画剪辑在右键单击时跳回第 1 帧 Skill_01 是第 1 帧中的实例,而 Skill_01a 是第 1 帧中的实例第 2 帧
  • 那是完全错误的。尝试像我一样再次重写它们。您必须从外部控制该按钮(推荐)

标签: actionscript-3 flash


【解决方案1】:

如果您将影片剪辑命名为 Skill_01,那么 Skill_01a 是什么?

还将您的事件侦听器及其回调函数添加到影片剪辑的父级和回调函数中,以访问事件所有者,请使用

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

编辑:当从单击的动画剪辑中调度事件时,在您的示例中,只有层次结构树中的最后一个动画剪辑将作为 event.target 传递,可以是技能_01(如果当前帧为 1)或技能_1a(如果当前帧为2)在问题主体中,您不仅在技能的第1帧和第2帧内有一个png图像,它们是电影剪辑的,并将作为event.target返回。但是如果你只放你的位图(locked.png & unlocked.png)而不是skill_01和skill_01a,前面的代码就可以正常工作。位图不捕获事件,所以它的父级是接受点击事件的人,这有点令人困惑,我不擅长解释

如果很难理解

我们将使用类似的东西,更简单但更大的代码

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

【讨论】:

  • 我试过了,程序运行没有错误,但是当我点击 MovieClip 时没有任何反应,它甚至不再进入第 2 帧
  • 是的,代码不完整,只是对必须编辑的部分的建议,让我一秒钟完成它
  • 首选的代码必须复制到主时间线,按钮Movieclip的实例可以存在于舞台中,并且必须命名为skill_01,就这样,祝你好运
  • 当我将代码放在 MovieClip 实例中时,当我将代码放在主时间线中时,没有任何反应,我收到错误“访问未定义的属性技能_01”gyazo.com/3198949d29c2e2e935e65a93517e263e 我很难时间了解这里出了什么问题...
  • @Nimvoker 根据我之前的评论,您的主舞台中必须有一个名为 Skill_01 的影片剪辑,您在主时间线中有多少帧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2010-12-11
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多