Flash CS3 AS3 影片剪辑转移到其他帧
Posted
技术标签:
【中文标题】Flash CS3 AS3 影片剪辑转移到其他帧【英文标题】:Flash CS3 AS3 Movieclips carrying over to other frames 【发布时间】:2014-09-25 04:32:58 【问题描述】:好的,所以我遇到了一个奇怪的问题。我在屏幕上有一些电影剪辑,其中 4 个,每个都有以下代码(当然有不同的实例名称):
stage.addEventListener(MouseEvent.MOUSE_DOWN,globalMouseDown,false,0,true); //add a global mouse listener
function globalMouseDown(e:Event):void
//find out if the target is a descendant of this, if not, then something else was clicked.
var parent:DisplayObject = e.target as DisplayObject;
while(parent && parent != stage)
if(parent == this) return;
parent = parent.parent;
//something else was clicked that wasn't this, so go to the up state
gotoAndStop(1);
stop();
addEventListener(MouseEvent.MOUSE_DOWN, onHs1Press);
addEventListener(MouseEvent.MOUSE_OVER, onHs1Over);
addEventListener(MouseEvent.MOUSE_OUT, onHs1Out);
function onHs1Press(event:MouseEvent):void
// toggle between frame 1 and 3 on button press
gotoAndStop(this.currentFrame == 3 ? 1 : 3);
parent.addChild(this)
function onHs1Over(event:MouseEvent):void
if (currentFrame != 3)
gotoAndStop(2);
function onHs1Out(event:MouseEvent):void
// only switch back to UP state if the button is "pressed"
if (currentFrame != 3)
gotoAndStop(1);
基本上,它可以让您将鼠标悬停在动画剪辑上,然后当您单击它时会出现一个小弹出窗口,直到您再次单击该动画剪辑以将其关闭。
屏幕上还有一个按钮,可让您使用此代码向前或向后移动到其他帧:
Next.addEventListener(MouseEvent.CLICK,Nclick);
function Nclick(event:MouseEvent):void
nextFrame();
Back.addEventListener(MouseEvent.CLICK,Bclick);
function Bclick(event:MouseEvent):void
prevFrame();
按钮代码位于主时间轴上,而影片剪辑代码位于影片剪辑的时间轴上。
由于某种原因,如果您的影片剪辑处于 DOWN 状态(弹出窗口打开)并且您单击按钮转到下一帧,影片剪辑将跟随下一帧和任何其他帧,而不是消失。
我在其他帧上也有相同的代码,其他帧都没有这样的行为,这真的很奇怪。
您甚至可以在它位于其他帧上时仍然单击它,然后弹出一个弹出窗口,其中甚至不存在影片剪辑和代码。
这是怎么回事?
【问题讨论】:
如果您注释掉parent.addChild(this)
代码,它是否可以正常工作?或者注释掉全局鼠标监听器?
你不应该使用框架。框架用于快速/简单的动画。不要使用它们来控制代码。此外,一般来说,您永远不应该使用 parent。
全局鼠标监听器的评论已经不在了?并且向 parent.addChild(this) 添加评论什么都不做。这很奇怪,因为我在另一个框架上有完全相同的代码,但它没有这样做。就作品的架构而言,有主时间轴,在主时间轴的这一帧上有 4 个动画剪辑,第一段代码在 4 个动画剪辑的每个的第一帧上,所以代码不在主线。第二段代码,用于下一步和后退按钮是在主时间轴上。
好的,我认为问题出在 parent.addChild(this) 部分。我用它来确保所有子影片剪辑都显示在其他所有内容之上。有没有其他方法可以做到这一点?
当我说注释掉时,我的意思是把整行变成注释(有效地删除这行代码来测试它是否是原因)。
【参考方案1】:
我尝试对此进行测试,并且可以重现您的问题。如果您在 FlashPro 中将影片剪辑添加到舞台,在更改它的索引或父级之后,它将被视为从代码创建的对象,时间轴将忽略它,甚至在它所在的帧上创建它的另一个实例已创建。
您必须手动从显示列表中删除按钮。
function Nclick(event:MouseEvent):void
nextFrame();
removeBtns();
function Bclick(event:MouseEvent):void
prevFrame();
removeBtns();
function removeBtns():void
if(currentFrame != 2) //whatever the frame of your buttons is
if(btn1 && btn1.parent) removeChild(btn1); //btn1 being whatever your button instnace name is
if(btn2 && btn2.parent) removeChild(btn2); //repeat for all buttons
或者,如果您希望封装代码而不是上述代码,请将其放在您的按钮类/时间轴上:
var myFrame:int = MovieClip(parent).currentFrame;
this.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
this.addEventListener(Event.REMOVED_FROM_STAGE,removedHandler);
function enterFrameHandler(e:Event):void
if(MovieClip(parent).currentFrame != myFrame)
parent.removeChild(this);
function removedHandler(e:Event):void
this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
this.removeEventListener(Event.REMOVED_FROM_STAGE, removedHandler);
【讨论】:
所以如果我使用第一个选项,我需要删除所有 5 个按钮。我可以将所有五个按钮都添加到 removeBtn 函数中,还是需要创建 5 个单独的 removeBtn 函数并在我点击按钮时全部调用它们? 将它们全部添加到同一个函数中。 太棒了,看起来成功了。我在调试时仍然会遇到一些随机错误,但它似乎并没有引起我可以看到的任何问题,并且一切都按照我的意愿进行。感谢您的所有帮助!以上是关于Flash CS3 AS3 影片剪辑转移到其他帧的主要内容,如果未能解决你的问题,请参考以下文章
用flash as3语言如何将影片剪辑存入一个数组以及如何访问?