ActionScript 3.0粒子延迟动画冗长函数简化方案咨询
优化嵌套Timer实现粒子波浪动画的方案
核心问题分析
当前代码通过嵌套单个Timer实现粒子依次延迟振动,本质是重复编写了12次几乎完全相同的逻辑,不仅代码冗余,后续扩展粒子数量会极度繁琐。优化核心是统一管理粒子数据+复用逻辑。
具体优化步骤
1. 统一管理粒子数据
把分散的dt1~dt12、s01~s012、P1~P12替换成数组,一次性初始化所有粒子的基础数据:
// 初始化粒子数据数组,每个元素包含粒子对象、初始y坐标、时间累计值 private var particles:Array = [ {p: P1, s0: s01, dt: 0}, {p: P2, s0: s02, dt: 0}, {p: P3, s0: s03, dt: 0}, {p: P4, s0: s04, dt: 0}, {p: P5, s0: s05, dt: 0}, {p: P6, s0: s06, dt: 0}, {p: P7, s0: s07, dt: 0}, {p: P8, s0: s08, dt: 0}, {p: P9, s0: s09, dt: 0}, {p: P10, s0: s010, dt: 0}, {p: P11, s0: s011, dt: 0}, {p: P12, s0: s012, dt: 0} ];
2. 封装通用更新函数
编写通用函数处理单个粒子的振动计算,避免重复代码:
private function updateParticle(particle:Object):void { particle.dt += t; var s:Number = -A * Math.sin(w * particle.dt); particle.p.y = particle.s0 + s; }
3. 用递归Timer替代嵌套结构
通过递归调用单个Timer,依次处理每个粒子的延迟更新,完全消除嵌套层级:
private var currentParticleIndex:int = 0; private const DELAY:Number = 1000; // 粒子间的延迟时间 private function startWave():void { if (!jalan) return; // 更新当前索引对应的粒子 updateParticle(particles[currentParticleIndex]); currentParticleIndex++; // 还有未处理的粒子,启动下一个延迟 if (currentParticleIndex < particles.length) { var delayTimer:Timer = new Timer(DELAY, 1); delayTimer.addEventListener(TimerEvent.TIMER, onDelayTimer); delayTimer.start(); } else { // 所有粒子处理完毕,重置索引(如需循环执行可在此添加逻辑) currentParticleIndex = 0; } } private function onDelayTimer(event:TimerEvent):void { var timer:Timer = event.target as Timer; timer.removeEventListener(TimerEvent.TIMER, onDelayTimer); timer = null; // 递归处理下一个粒子 startWave(); }
4. 启动动画
将原嵌套代码替换为调用启动函数:
if (jalan) { currentParticleIndex = 0; startWave(); }
扩展优势
后续增加粒子数量时,仅需在particles数组中添加新的粒子数据,无需修改逻辑代码,扩展性极强。
内容的提问来源于stack exchange,提问作者Fatah Kurniawan
相关产品推荐
相关产品推荐

