AS3技术求助:如何为动态创建的影片剪辑添加ENTER_FRAME动画?
嘿,这个问题我之前也碰到过,其实有两种常用的解决办法,我给你详细说说~
方法一:给每个影片剪辑单独绑定ENTER_FRAME事件
这种方法最直接,在你创建每个mcMovieClip实例后,直接给它添加ENTER_FRAME事件监听器,然后在事件处理函数里针对当前剪辑做动画逻辑就行。
完整代码示例:
import flash.events.Event; for (var i = 0; i < 20; i++ ) { // 从库生成元素 var MovieClip_mc:mcMovieClip = new mcMovieClip(); addChild(MovieClip_mc); // 初始化随机尺寸、位置、旋转(补全你原来的代码) MovieClip_mc.scaleX = MovieClip_mc.scaleY = Math.random() * 1 + 0.5; // 缩放范围0.5-1.5倍 MovieClip_mc.x = Math.random() * stage.stageWidth; MovieClip_mc.y = Math.random() * stage.stageHeight; MovieClip_mc.rotation = Math.random() * 360; // 给当前实例绑定ENTER_FRAME事件 MovieClip_mc.addEventListener(Event.ENTER_FRAME, onClipAnimate); } // 每个剪辑的动画处理函数 function onClipAnimate(e:Event):void { // 把事件源转换成mcMovieClip类型,避免类型错误 var currentClip:mcMovieClip = e.currentTarget as mcMovieClip; if (!currentClip) return; // 这里写你想要的动画逻辑,比如: // 循环缩放动画 currentClip.scaleX += 0.01; currentClip.scaleY = currentClip.scaleX; if (currentClip.scaleX > 2) { currentClip.scaleX = currentClip.scaleY = 0.5; } // 水平移动循环 currentClip.x += 1; if (currentClip.x > stage.stageWidth) { currentClip.x = -currentClip.width; } // 持续旋转 currentClip.rotation += 2; }
方法二:用全局ENTER_FRAME统一处理所有剪辑(性能更优)
如果创建的剪辑数量很多(比如几十上百个),每个都绑定单独的ENTER_FRAME会增加性能开销。这时候可以把所有剪辑存到一个数组里,然后用一个全局的ENTER_FRAME事件来遍历数组,统一处理动画。
完整代码示例:
import flash.events.Event; var clipCollection:Array = []; // 存储所有生成的剪辑实例 for (var i = 0; i < 20; i++ ) { var MovieClip_mc:mcMovieClip = new mcMovieClip(); addChild(MovieClip_mc); // 初始化随机属性 MovieClip_mc.scaleX = MovieClip_mc.scaleY = Math.random() * 1 + 0.5; MovieClip_mc.x = Math.random() * stage.stageWidth; MovieClip_mc.y = Math.random() * stage.stageHeight; MovieClip_mc.rotation = Math.random() * 360; // 将实例加入数组 clipCollection.push(MovieClip_mc); } // 绑定全局ENTER_FRAME事件 addEventListener(Event.ENTER_FRAME, onGlobalAnimate); function onGlobalAnimate(e:Event):void { for (var j:int = 0; j < clipCollection.length; j++) { var currentClip:mcMovieClip = clipCollection[j] as mcMovieClip; // 检查剪辑是否还在舞台上,避免处理已被移除的实例 if (!currentClip || !contains(currentClip)) { clipCollection.splice(j, 1); // 从数组中移除无效实例 j--; continue; } // 同样的动画逻辑,你也可以给每个剪辑加自定义属性来实现差异化动画 currentClip.scaleX += 0.01; currentClip.scaleY = currentClip.scaleX; if (currentClip.scaleX > 2) { currentClip.scaleX = currentClip.scaleY = 0.5; } currentClip.x += 1; if (currentClip.x > stage.stageWidth) { currentClip.x = -currentClip.width; } currentClip.rotation += 2; } }
注意事项
- 如果后续需要移除某个剪辑,记得在方法一中要同时移除它的
ENTER_FRAME事件监听器(currentClip.removeEventListener(Event.ENTER_FRAME, onClipAnimate)),方法二中要把它从数组里删掉,避免内存泄漏。 - 可以给每个剪辑添加自定义属性(比如
currentClip.speed = Math.random() * 2),这样在动画函数里可以实现每个剪辑的差异化动画效果。
内容的提问来源于stack exchange,提问作者user1549184
相关产品推荐
相关产品推荐

