Javascript CreateJS:TweenJS时间线tween在不链接的情况下多次更改属性

Javascript CreateJS:TweenJS时间线tween在不链接的情况下多次更改属性,javascript,animation,createjs,chaining,tweenjs,Javascript,Animation,Createjs,Chaining,Tweenjs,在本例中,预期结果是使圆淡出,然后淡出。这适用于链接。代码段中的注释行 createjs.Tween.get(circle).wait(0).to({alpha:0.1},2000).wait(2000).to({alpha:1},2000) 如果我将它们分离为对同一对象的两个单独调用,则不起作用。回调不是一个选项,因为在淡入和淡出循环之间,可能会有其他孩子的tween Tweenjs似乎覆盖了以前所有的属性更改,只保留最后一个。 有什么建议吗 TweenJS:Canvas Tweenin

在本例中,预期结果是使圆淡出,然后淡出。这适用于链接。代码段中的注释行

createjs.Tween.get(circle).wait(0).to({alpha:0.1},2000).wait(2000).to({alpha:1},2000)
如果我将它们分离为对同一对象的两个单独调用,则不起作用。回调不是一个选项,因为在淡入和淡出循环之间,可能会有其他孩子的tween

Tweenjs似乎覆盖了以前所有的属性更改,只保留最后一个。 有什么建议吗


TweenJS:Canvas Tweening示例
函数init(){
阶段=新的createjs.stage(“canvas1”);
var timeline=new createjs.timeline();
var circle=new createjs.Shape();
圆。图形。Beginll(#FF0000”)。绘图圆(50,50,50);
阶段。添加儿童(圆圈);
timeline.addTween(
//圆圈应衰减到0.1,然后返回到1
//createjs.Tween.get(circle).wait(0).to({alpha:0.1},2000).wait(2000).to({alpha:1},2000)//有效
createjs.Tween.get(circle.wait(0).to({alpha:0.1},2000),//此Tween被忽略
createjs.Tween.get(circle).wait(2000).to({alpha:1},2000)//只有这个Tween激发
)
timeline.setPaused(false);
createjs.Ticker.setFPS(20);
createjs.Ticker.addEventListener(“勾号”,阶段);
}

您正在使用的操作是异步的,因此在第一次调用tween之后,必须使用方法“call”继续执行,如下所示:

createjs.Tween.get(circle, false, null, false).wait(100).to({alpha:0},2000).call(function() {
    createjs.Tween.get(circle, false, null, false).wait(1000).to({alpha:1},2000);
});
您还可以传入对命名函数的引用,例如

createjs.Tween.get(circle, false, null, false).wait(100).to({alpha:0},2000).call(function_name);

因此,您可以通过使用一个包含所有需要执行的操作的数组,以及一个一次提取数组中的元素并执行它们的函数,并将其自身作为.call方法的参数传递,来模拟递归函数的链接。

您使用的操作是异步的,因此必须使用该方法在第一次调用tween之后,“call”继续执行,如下所示:

createjs.Tween.get(circle, false, null, false).wait(100).to({alpha:0},2000).call(function() {
    createjs.Tween.get(circle, false, null, false).wait(1000).to({alpha:1},2000);
});
您还可以传入对命名函数的引用,例如

createjs.Tween.get(circle, false, null, false).wait(100).to({alpha:0},2000).call(function_name);

因此,您可以通过使用一个包含所有需要执行的操作的数组,以及一个每次提取数组中的元素并执行这些元素的函数,并将其自身作为.call方法的参数传递,来模拟递归函数的链接。

您遇到的问题是由于属性与T之间的关系weenj是确定性的。这意味着您可以跳到tween中的任何点,并且它将是您期望的位置。如果您创建多个tween来管理单个属性,则两者都不是确定性的


我建议要么使用链接(我知道你说你不想要),要么使用链接“呼叫”“当另一个二人组完成时,开始一个二人组。也许不是你所希望的,但希望能让你更好地理解为什么这不起作用。

你所遇到的问题是因为用TweenJS填充的属性是确定性的。这意味着你可以跳到一个二人组中的任何一点,它将是你期望的地方。如果您创建了管理单个属性的多个tween,则两者都不是确定性的


我建议要么用链锁(我知道你说过你不想要),要么用链锁的“呼叫”在另一次呼叫完成后启动tween。也许不是您所希望的,但希望能让您更好地了解为什么这不起作用。

正如文档中所述,这确实是一个问题:

多个tween可以指向同一个实例,但是如果它们影响 相同的属性可能会出现意外的行为。阻止一切 在对象上,在 道具论证

超越意味着之前所有的二人组都将被消灭——这有点违背了时间表的目的。 正如我所解释的,我正在使用一长串的tweens来提供多种选择。我是例外-addTween自动链接动画-这不会发生。谢天谢地,它可以用一个简单的for循环来修复


TweenJS:Canvas Tweening示例
函数init(){
阶段=新的createjs.stage(“canvas1”);
var timeline=new createjs.timeline();
var circle=new createjs.Shape();
圆。图形。Beginll(#FF0000”)。绘图圆(50,50,50);
阶段。添加儿童(圆圈);
circle.anims=[
[0, {
阿尔法:0.1
},
2000
],
[0, {
阿尔法:1
},
2000
]
]
for(循环中的变量i.anims){
var c=createjs.Tween.get(圆)
for(循环中的变量j.anims){
var tw=圆形动画[j];
c、 wait(tw[0]);
c、 to(tw[1],tw[2]);
}
}
时间线。addTween(c)
timeline.setPaused(false);
createjs.Ticker.setFPS(20);
createjs.Ticker.addEventListener(“勾号”,阶段);
}

正如文档中所述,这确实是一个问题:

多个tween可以指向同一个实例,但是如果它们影响 相同的属性可能会出现意外的行为。阻止一切 在对象上,在 道具论证

超越意味着之前所有的二人组都将被消灭——这有点违背了时间表的目的。 正如我所解释的,我正在使用一长串的tweens来提供多种选择。我是例外-addTween自动链接动画-这不会发生。谢天谢地,它可以用一个简单的for循环来修复


TweenJS:Canvas Tweening示例
函数init(){
阶段=新的createjs.stage(“canvas1”);
var timeline=new createjs.timeline();
var circle=new createjs.Shape();
圆。图形。Beginll(#FF0000”)。绘图圆(50,50,50);
阶段。添加儿童(圆圈);
circle.anims=[
[0, {
阿尔法:0.1
},
2000
],
[0, {
阿尔法:1
},