让我的KineticJS动画停止()时遇到问题。
我在同一层上有三个KineticJS图像对象,我已经为每个KineticJS图像对象添加了一个KineticJS动画。但是,只有一个图像对象显示任何动画。它也不会停止响应anim.stop()的动画,除非我停止()所有三个对象(包括那些实际上没有视觉动画的动画)的动画。
我的问题是:是否可以将单个图层/图像/形状上的多个独立动画添加到单个图层,并且仍能够单独启动()/停止()每个动画?或者我是否需要为每个KineticJS图像对象创建单独的图层?
简而言之(黑客攻击版),我的代码如下:
stage = new Kinetic.Stage({container: "container", width: windowWidth, height: windowHeight});
layer = new Kinetic.Layer();
var kinObjArr = [];
for (var i=0; i < 3; i++) {
kinObjArr[i] = new Kinetic.Image({image: myHTMLImage});
kinObjArr[i].anim = new Kinetic.Animation({
func: function(frame) {
kinObjArr[i].setX(30 * Math.sin(frame.time * 2 * Math.PI / 500) + 100);
},
node: layer
});
kinObjArr[i].anim.start();
kinObjArr[i].on('touchstart', function(){
this.anim.stop(); // <----- Doesn't stop
layer.draw();
});
} // for
stage.add(layer);
基本上只有列表中的最后一张KineticJS图像会被动画化,并且只有在触摸/点击所有3张图像时才能停止它。
答案 0 :(得分:5)
经典闭包问题。你需要使用匿名函数来引导范围,或者将所有逻辑分解为自己的函数。这是一篇关于Javascript闭包的文章:
How do JavaScript closures work?
KineticJS支持无限数量的动画(当然,你的内存耗尽)
答案 1 :(得分:0)
感谢Eric的回应。我看了那篇文章,但我的脑袋变形了,但我想我最终得到了它。我选择你的第二个选项,它就像一个魅力:
(同样,这是我实际代码的黑客版本,尚未测试此代码段)
stage = new Kinetic.Stage({container: "container", width: windowWidth, height: windowHeight});
layer = new Kinetic.Layer();
var kinObjArr = [];
function myFunc(i) {
kinObjArr[i] = new Kinetic.Image({image: myHTMLImage});
kinObjArr[i].anim = new Kinetic.Animation({
func: function(frame) {
kinObjArr[i].setX(30 * Math.sin(frame.time * 2 * Math.PI / 500) + 100);
},
node: layer
});
kinObjArr[i].anim.start();
kinObjArr[i].on('touchstart', function(){
this.anim.stop(); // <----- Stops now
layer.draw();
});
} // function myFunc
for (var i=0; i < 3; i++) {
myFunc(i);
} // for
stage.add(layer);