Javascript 如何在Kinetic.js中利用画布图像制作动画?

Javascript 如何在Kinetic.js中利用画布图像制作动画?,javascript,animation,canvas,frame,kineticjs,Javascript,Animation,Canvas,Frame,Kineticjs,我有下面的代码,应该是一个动画的三个帧,我怎样才能将它们转换为动能.js中的动画?它是一个妖术般的吃豆人,能张开和闭上嘴巴。 我有三个画布图像,作为三个框架,在Kinetic.js中是否有任何内置函数来实现这一点?或者我应该从头开始创建一个?在我制作了精灵之后,我怎样才能在不破坏动画的情况下做其他的动画,比如移动它,或者旋转它。吃豆人仍然应该张开和闭上它的嘴 pacMan1 = new Kinetic.Shape({ x: 15,

我有下面的代码,应该是一个动画的三个帧,我怎样才能将它们转换为动能.js中的动画?它是一个妖术般的吃豆人,能张开和闭上嘴巴。 我有三个画布图像,作为三个框架,在Kinetic.js中是否有任何内置函数来实现这一点?或者我应该从头开始创建一个?在我制作了精灵之后,我怎样才能在不破坏动画的情况下做其他的动画,比如移动它,或者旋转它。吃豆人仍然应该张开和闭上它的嘴

        pacMan1 = new Kinetic.Shape({
            x: 15,
            y: 13,
            //fill: 'rgb(62, 53, 67)',
            // a Kinetic.Canvas renderer is passed into the drawFunc function
            drawFunc: function (canvas) {
                var context = canvas.getContext();
                // layer1/Compound Path
                context.save();
                context.beginPath();

                // layer1/Compound Path/Path
                context.moveTo(54.0, 12.8);
                context.lineTo(34.2, 1.4);
                context.bezierCurveTo(31.2, -0.3, 27.6, -0.3, 24.7, 1.4);
                context.lineTo(4.9, 12.8);
                context.bezierCurveTo(1.9, 14.5, 0.1, 17.7, 0.1, 21.0);
                context.lineTo(0.1, 43.9);
                context.bezierCurveTo(0.1, 47.3, 1.9, 50.5, 4.9, 52.1);
                context.lineTo(24.7, 63.6);
                context.bezierCurveTo(27.6, 65.3, 31.2, 65.3, 34.2, 63.6);
                context.lineTo(54.0, 52.1);
                context.bezierCurveTo(56.9, 50.5, 58.7, 47.3, 58.7, 43.9);
                context.lineTo(58.7, 21.0);
                context.bezierCurveTo(58.7, 17.7, 56.9, 14.5, 54.0, 12.8);
                context.closePath();

                // layer1/Compound Path/Path
                context.moveTo(32.3, 10.8);
                context.bezierCurveTo(30.7, 10.8, 29.5, 9.5, 29.5, 8.0);
                context.bezierCurveTo(29.5, 6.4, 30.7, 5.1, 32.3, 5.1);
                context.bezierCurveTo(33.9, 5.1, 35.1, 6.4, 35.1, 8.0);
                context.bezierCurveTo(35.1, 9.5, 33.9, 10.8, 32.3, 10.8);
                context.closePath();
                context.fillStyle = "rgb(62, 53, 67)";
                context.fill();
                context.lineWidth = 0.3;
                context.stroke();
                canvas.fillStroke(this);
                context.restore();
            }
        });
        pacMan2 = new Kinetic.Shape({
            x: 15,
            y: 13,
            //fill: 'rgb(62, 53, 67)',
            // a Kinetic.Canvas renderer is passed into the drawFunc function
            drawFunc: function (canvas) {
                var context = canvas.getContext();
                // layer1/Compound Path
                context.save();
                context.beginPath();

                // layer1/Compound Path/Path
                context.moveTo(29.1, 36.9);
                context.bezierCurveTo(27.6, 36.0, 26.7, 34.5, 26.7, 32.8);
                context.bezierCurveTo(26.7, 31.2, 27.6, 29.6, 29.1, 28.8);
                context.lineTo(55.2, 13.7);
                context.bezierCurveTo(54.8, 13.4, 54.4, 13.1, 54.0, 12.8);
                context.lineTo(34.2, 1.4);
                context.bezierCurveTo(31.2, -0.3, 27.6, -0.3, 24.7, 1.4);
                context.lineTo(4.9, 12.8);
                context.bezierCurveTo(1.9, 14.5, 0.1, 17.7, 0.1, 21.0);
                context.lineTo(0.1, 43.9);
                context.bezierCurveTo(0.1, 47.3, 1.9, 50.5, 4.9, 52.1);
                context.lineTo(24.7, 63.6);
                context.bezierCurveTo(27.6, 65.3, 31.2, 65.3, 34.2, 63.6);
                context.lineTo(54.0, 52.1);
                context.bezierCurveTo(54.2, 52.0, 54.5, 51.8, 54.7, 51.7);
                context.lineTo(29.1, 36.9);
                context.closePath();

                // layer1/Compound Path/Path
                context.moveTo(32.3, 5.1);
                context.bezierCurveTo(33.9, 5.1, 35.1, 6.4, 35.1, 8.0);
                context.bezierCurveTo(35.1, 9.5, 33.9, 10.8, 32.3, 10.8);
                context.bezierCurveTo(30.7, 10.8, 29.5, 9.5, 29.5, 8.0);
                context.bezierCurveTo(29.5, 6.4, 30.7, 5.1, 32.3, 5.1);
                context.closePath();
                context.fillStyle = "rgb(62, 53, 67)";
                context.fill();
                context.lineWidth = 0.3;
                context.stroke();
                canvas.fillStroke(this);
                context.restore();
            }
        });
        pacMan3 = new Kinetic.Shape({
            x: 15,
            y: 13,
            //fill: 'rgb(62, 53, 67)',
            // a Kinetic.Canvas renderer is passed into the drawFunc function
            drawFunc: function (canvas) {
                var context = canvas.getContext();
                    // layer1/Compound Path
                    context.save();
                    context.beginPath();

                    // layer1/Compound Path/Path
                    context.moveTo(32.0, 36.9);
                    context.bezierCurveTo(28.7, 36.0, 26.7, 34.5, 26.7, 32.8);
                    context.bezierCurveTo(26.7, 31.2, 28.7, 29.6, 32.0, 28.8);
                    context.lineTo(58.7, 22.0);
                    context.lineTo(58.7, 21.0);
                    context.bezierCurveTo(58.7, 17.7, 56.9, 14.5, 54.0, 12.8);
                    context.lineTo(34.2, 1.4);
                    context.bezierCurveTo(31.2, -0.3, 27.6, -0.3, 24.7, 1.4);
                    context.lineTo(4.9, 12.8);
                    context.bezierCurveTo(1.9, 14.5, 0.1, 17.7, 0.1, 21.0);
                    context.lineTo(0.1, 43.9);
                    context.bezierCurveTo(0.1, 47.3, 1.9, 50.5, 4.9, 52.1);
                    context.lineTo(24.7, 63.6);
                    context.bezierCurveTo(27.6, 65.3, 31.2, 65.3, 34.2, 63.6);
                    context.lineTo(54.0, 52.1);
                    context.bezierCurveTo(56.9, 50.5, 58.7, 47.3, 58.7, 43.9);
                    context.lineTo(58.7, 43.7);
                    context.lineTo(32.0, 36.9);
                    context.closePath();

                    // layer1/Compound Path/Path
                    context.moveTo(32.3, 5.1);
                    context.bezierCurveTo(33.9, 5.1, 35.1, 6.4, 35.1, 8.0);
                    context.bezierCurveTo(35.1, 9.5, 33.9, 10.8, 32.3, 10.8);
                    context.bezierCurveTo(30.7, 10.8, 29.5, 9.5, 29.5, 8.0);
                    context.bezierCurveTo(29.5, 6.4, 30.7, 5.1, 32.3, 5.1);
                    context.closePath();
                    context.fillStyle = "rgb(62, 53, 67)";
                    context.fill();
                    context.lineWidth = 0.3;
                    context.stroke();
                    canvas.fillStroke(this);
                    context.restore();
                }
        });
您可以使用带有switch语句的Kinetic.Animation来确定要显示的帧,如下所示:

    var group = new Kinetic.Group({
        x:10,
        y:10
    });

    group.add(pacMan1);
    group.add(pacMan2);
    group.add(pacMan3);
    layer.add(group);
    layer.draw();

    pacMan2.hide();
    pacMan3.hide();

    var frameCount = 0;
    var anim = new Kinetic.Animation(function (frame) {
        frameCount++;
        var mod = frameCount % 30;
        switch (mod) {
            case 0:
                pacMan1.show();
                pacMan2.hide();
                pacMan3.hide();
                break;
            case 10:
                pacMan1.hide();
                pacMan2.show();
                pacMan3.hide();
                break;
            case 20:
                pacMan1.hide();
                pacMan2.hide();
                pacMan3.show();
                break;
        }
        group.setX(group.getX()+1);
    }, layer);

    anim.start();
通过更改模公式和案例编号,可以加快帧的速度

//Faster
var mod = frameCount % 3;
switch (mod) {
    case 0:
        break;
    case 1:
        break;
    case 2:
        break;
}

//Slower
var mod = frameCount % 300;
switch (mod) {
    case 0:
        break;
    case 100:
        break;
    case 200:
        break;
}
如果你想让他移动得比改变x增加的间隔快:

//Move 5 pixels every frame.
group.setX(group.getX()+5);
这不是一个很好的答案,但这是一个开始

相反 我想用toImage方法把你的六边形变成图像,然后在一个动能精灵中使用它

和教程:

但是,我认为问题是你需要为精灵设置一个图像,比如:

理想情况下,出于您的目的,我认为使用Kinetic.Sprite是您需要的,因此如果您可以使用pac man形状设置基于Sprite的图像,那么您将可以使用Sprite完成大量工作。

您可以使用Kinetic.Animation和switch语句来确定要显示的帧,大概是这样的:

    var group = new Kinetic.Group({
        x:10,
        y:10
    });

    group.add(pacMan1);
    group.add(pacMan2);
    group.add(pacMan3);
    layer.add(group);
    layer.draw();

    pacMan2.hide();
    pacMan3.hide();

    var frameCount = 0;
    var anim = new Kinetic.Animation(function (frame) {
        frameCount++;
        var mod = frameCount % 30;
        switch (mod) {
            case 0:
                pacMan1.show();
                pacMan2.hide();
                pacMan3.hide();
                break;
            case 10:
                pacMan1.hide();
                pacMan2.show();
                pacMan3.hide();
                break;
            case 20:
                pacMan1.hide();
                pacMan2.hide();
                pacMan3.show();
                break;
        }
        group.setX(group.getX()+1);
    }, layer);

    anim.start();
通过更改模公式和案例编号,可以加快帧的速度

//Faster
var mod = frameCount % 3;
switch (mod) {
    case 0:
        break;
    case 1:
        break;
    case 2:
        break;
}

//Slower
var mod = frameCount % 300;
switch (mod) {
    case 0:
        break;
    case 100:
        break;
    case 200:
        break;
}
如果你想让他移动得比改变x增加的间隔快:

//Move 5 pixels every frame.
group.setX(group.getX()+5);
这不是一个很好的答案,但这是一个开始

相反 我想用toImage方法把你的六边形变成图像,然后在一个动能精灵中使用它

和教程:

但是,我认为问题是你需要为精灵设置一个图像,比如:

理想情况下,我认为使用Kinetic.Sprite是你想要的,因此如果你能用你的pac man形状设置基于Sprite的图像,那么你就可以用Sprite做很多事情。

以下是如何从“chomping hexes”创建Kinetic.Sprite动画

因为已经有了hex+mouth坐标,所以甚至不需要预先创建的精灵表

您可以使用html画布元素动态创建咀嚼精灵表

方法:

从一个临时html画布元素开始 在画布上画出你所有的咀嚼六角体 使用canvas.toDataURL将该画布转换为精灵表图像 通常使用该精灵表来运行Kinetic.Sprite动画 这是从html画布创建的动态创建的精灵表

下面的代码显示屏幕上的画布以便于演示,但您需要在屏幕外创建临时画布

下面是代码和小提琴:

下面是如何从你的“咀嚼六角体”创建一个动态的精灵动画

因为已经有了hex+mouth坐标,所以甚至不需要预先创建的精灵表

您可以使用html画布元素动态创建咀嚼精灵表

方法:

从一个临时html画布元素开始 在画布上画出你所有的咀嚼六角体 使用canvas.toDataURL将该画布转换为精灵表图像 通常使用该精灵表来运行Kinetic.Sprite动画 这是从html画布创建的动态创建的精灵表

下面的代码显示屏幕上的画布以便于演示,但您需要在屏幕外创建临时画布

下面是代码和小提琴:


如何启动动画?我使用pac.setAnimationchomp;在开始动画的代码末尾,但我得到TypeError:“undefined”不是计算“pac.setAnimation”@igaar的对象。您是否解决了未定义的错误?由于pac对象是在函数内部构建的,因此请确保在全局访问var pac的函数外部定义它;函数外部。如何启动动画?我使用pac.setAnimationchomp;在开始动画的代码末尾,但我得到TypeError:“undefined”不是计算“pac.setAnimation”@igaar的对象。您是否解决了未定义的错误?由于pac对象是在函数内部构建的,因此请确保在全局访问var pac的函数外部定义它;在功能之外。