是否可以在单个图层上放置多个KineticJS动画?

时间:2012-10-02 22:30:18

标签: javascript animation html5-canvas layer kineticjs

让我的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张图像时才能停止它。

2 个答案:

答案 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);