You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在两个逆序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:35:49