我在使用 Flash AS3 时遇到了这个令人困惑的问题,我已经尝试解决这个问题很长时间了。我有一个想法,也许这是 Flash 播放器的一个错误,但也许你可以提供一些见解。
我在 Flash 中有一个 MovieClip,它是 10 帧的星形、另外 10 帧的圆形、另外 10 帧的方形,之后它将 gotoAndPlay(1)
重播动画。此 MovieClip 扩展了一个我称为 FlipClip
的 AS3 类。
FlipClip
中有一个名为 reverseClip
的函数。此函数的目的是在每次 Flash 启动 EXIT_FRAME
事件时围绕轴翻转某些图形子项。
public function FlipClip()
{
//as soon as this is instantiated, add the eventListener
addEventListener(Event.EXIT_FRAME,flipTheClip);
}
public function flipTheClip(e:Event)
{
trace("currentFrame = " + currentFrame);
//for sake of simplicity, we will flip every child
for (var i=0; i<numChildren; i++)
{
var targetClip = getChildAt(i);
var axis = 10;
//if the target child has not already been flipped...
if (Math.abs(targetClip.scaleX) / targetClip.scaleX != -1)
{
//reverse the child's direction with scaleX and move based on the axis
targetClip.scaleX *= -1;
var dist:Number = targetClip.x - axis;
targetClip.x = axis - dist;
}
}
}
明显的结果是,每次退出一帧时,所有图形元素都会围绕 x=10 水平翻转,并且每十帧,MovieClip 的形状就会从星形变为圆形,再变为方形。对吗?
不。
影片剪辑确实成功地绕该轴翻转,但随后出现了一个奇怪的问题。动画停止。 MovieClip 被固定为一颗永恒的星星。 Flash 甚至无法识别动画已停止,因为我们一遍又一遍地获得此输出;
currentFrame = 1
currentFrame = 2
currentFrame = 3
currentFrame = 4
...
currentFrame = 30
currentFrame = 1
一直到 30,然后又回到 1。该剪辑仍在播放,但不知何故图形元素没有更新!
这是Flash播放器的问题吗?这是代码的问题吗?如有任何帮助,我们将不胜感激!
我已将 .fla 和 .as 的文件上传到 Dropbox 上。我仍在研究如何嵌入类似的东西,但现在我希望这个链接对您有用。
https://www.dropbox.com/sh/hcljutesblichpp/AABKQ4Kn8OTwfTaeh0I3nnOZa?dl=0
更新:
如果我将每个单独的形状转换为父 MovieClip 中的 MovieClip,则它可以正常播放。然而,这对于复杂的动画来说内存效率不高或者不可行。希望这些信息可以帮助您解决问题。
最佳答案
有几件事您需要注意。
- 您不需要像往常一样根据 numChildren 翻转元素 返回 1,因为在每一帧上您都会得到单个 child 。
- 您也不需要检查其他条件
Math.abs(targetClip.scaleX)/targetClip.scaleX != -1
设置 翻动。 - 而且您还需要使用 ENTER_FRAME 而不是 EXIT_FRAME。 ENTER_FRAME 适用于当前帧,而 EXIT_FRAME 适用于 上一帧。
使用下面的代码。
package
{
import flash.display.MovieClip;
import flash.events.*;
import flash.utils.setTimeout;
public class FlipClip extends MovieClip
{
var mInstance
var prevX;
public function FlipClip()
{
//as soon as this is instantiated, add the eventListener
addEventListener(Event.ENTER_FRAME,flipTheClip);
mInstance = this;
//mInstance.visible = false;
}
public function flipTheClip(e)
{
this.scaleX *= -1;
prevX = this.x;
if(this.scaleX < 0)
this.x = prevX + this.width
else
this.x = prevX - this.width
}
}
}
将以上代码粘贴到 FlipClip.as 文件中,并将帧速率更改为 1。 您需要根据您的要求更新 moviClip 位置。
希望以上回答能解决您的问题。
关于actionscript-3 - Actionscript 3.0 影片剪辑对 EXIT_FRAME 的修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31973144/