如何在两个逆序Sequence Array中按编号匹配变量实现动画?
问题
我遇到了程序运行异常的问题,希望在两个不同的Sequence Array中按编号匹配调用变量以实现动画。当前代码中aDataBack.P.y = aDataGo.s + aDataBack.sback;无法满足动画需求,因为SequenceBack与SequenceGo是逆序排列(必须保留该逆序以保证动画逻辑正确)。我需要按编号匹配变量,例如实现P1.y = s1 + s1back;、P2.y = s2 + s2back;这样的对应关系,但直接编写此类代码也无法运行,请问有什么可行的实现方式?
以下是我的代码:
// Array of Arrays var SequenceGo:Array = [ {dt:dt1, P:P1, s0:s01, s:s1}, {dt:dt2, P:P2, s0:s02, s:s2}, {dt:dt3, P:P3, s0:s03, s:s3}, {dt:dt4, P:P4, s0:s04, s:s4}, {dt:dt5, P:P5, s0:s05, s:s5}, {dt:dt6, P:P6, s0:s06, s:s6}, {dt:dt7, P:P7, s0:s07, s:s7}, {dt:dt8, P:P8, s0:s08, s:s8}, {dt:dt9, P:P9, s0:s09, s:s9}, {dt:dt10, P:P10, s0:s010, s:s10}, ]; var SequenceBack:Array = [ {dtback:dt10back, P:P10, s0:s010, sback:s10back}, {dtback:dt9back, P:P9, s0:s09, sback:s9back}, {dtback:dt8back, P:P8, s0:s08, sback:s8back}, {dtback:dt7back, P:P7, s0:s07, sback:s7back}, {dtback:dt6back, P:P6, s0:s06, sback:s6back}, {dtback:dt5back, P:P5, s0:s05, sback:s5back}, {dtback:dt4back, P:P4, s0:s04, sback:s4back}, {dtback:dt3back, P:P3, s0:s03, sback:s3back}, {dtback:dt2back, P:P2, s0:s02, sback:s2back}, {dtback:dt1back, P:P1, s0:s01, sback:s1back} ]; function onNext(index:int = 0):void { if (index >= SequenceGo.length) { return; } var aDataGo:Object = SequenceGo[index]; var aDataBack:Object = SequenceBack[index]; //variables F = s_teganganst.value; m = s_masjenst.value/10000; v = Math.sqrt(F/m); tp = 5000/v; f = s_frekuensist.value; w = 2*Math.PI*f; aDataGo.dt += t; aDataGo.s = aDataGo.s0 - A * Math.sin(w * aDataGo.dt); aDataGo.P.y = aDataGo.s; if(P10.y < 607){ aDataBack.dtback += t; aDataBack.sback = - A * Math.sin(w * aDataBack.dtBack); aDataBack.P.y = aDataGo.s + aDataBack.sback; } setTimeout(onNext, tp, index + 1); }
解决方案
核心问题是SequenceGo和SequenceBack为逆序对应,不能直接用同一个index取两个数组元素。要实现编号匹配,比如SequenceGo的第0项(P1)对应SequenceBack的第9项(s1back),SequenceGo的第1项(P2)对应SequenceBack的第8项(s2back),可以通过反向索引实现对应关系。另外代码中存在拼写错误:aDataBack.dtBack应为aDataBack.dtback,这也是异常诱因之一。
修改后的onNext函数如下:
function onNext(index:int = 0):void { if (index >= SequenceGo.length) { return; } var aDataGo:Object = SequenceGo[index]; // 计算反向索引,匹配同编号的SequenceBack元素 var backIndex:int = SequenceBack.length - 1 - index; var aDataBack:Object = SequenceBack[backIndex]; //variables F = s_teganganst.value; m = s_masjenst.value/10000; v = Math.sqrt(F/m); tp = 5000/v; f = s_frekuensist.value; w = 2*Math.PI*f; aDataGo.dt += t; aDataGo.s = aDataGo.s0 - A * Math.sin(w * aDataGo.dt); if(P10.y < 607){ aDataBack.dtback += t; // 修正拼写错误:dtBack -> dtback aDataBack.sback = - A * Math.sin(w * aDataBack.dtback); // 实现P1.y=s1+s1back、P2.y=s2+s2back的对应逻辑 aDataGo.P.y = aDataGo.s + aDataBack.sback; } else { // 不满足条件时单独设置Go序列的y值 aDataGo.P.y = aDataGo.s; } setTimeout(onNext, tp, index + 1); }
关键修改点:
- 通过
backIndex = SequenceBack.length - 1 - index实现逆序数组的编号匹配 - 修正
dtBack的拼写错误为dtback - 调整赋值逻辑,将
aDataGo.P.y设置为aDataGo.s + aDataBack.sback,确保每个P元素对应自身的s和sback值
内容的提问来源于stack exchange,提问作者Fatah Kurniawan
相关产品推荐
相关产品推荐

