Kineticjs对象处理&事件监听器

时间:2014-01-16 02:28:27

标签: javascript html5 javascript-events kineticjs

我销售定制设备,在我的网站上,我有一个闪存工具,客户可以为手套部件分配颜色,看看它会是什么样子。

我一直在研究这个工具的HTML5版本,所以ipad人群可以做同样的事情。点击这里查看我已完成的工作,

我带了kineticjs多个图片加载器并将其砍掉以加载舞台和颜色按钮所需的所有图片,这些按钮是同一图像的多个实例。在他们的例子中,它只有2个图像,因此它们 var name 每个图像都是可操作的。我的goai是根据图像名称动态创建变量。

我正在使用 for循环 if 语句根据类型定位零件。如果正在加载的图像是一个按钮,则原始实例不会添加到舞台上,而是另一个for循环,带有计数器,创建实例并放置在舞台上。变量是部分字符串+ n(wht0)。从这里我启动一个eventlistener,当点击时,假设隐藏与选项有关的所有手套部件并显示适当的颜色。那段代码我已经在我的AS中了。

我在白色按钮(第一个按钮)上创建了一个eventlistener,点击后,我将其设置为隐藏手套的白色皮革部分之一。但是,当我单击按钮时,我在控制台中得到手套部件的错误(例如,wlt_wht),我收到一条错误,指出对象未定义。但是当加载图像时,变量名称来自正在加载的当前数组对象。

我在回调调用之前添加了另一个变量,将数组的内容转换为字符串,并使用document.write确认对象名称是正确的,但是在创建对象之后它现在是[object object]。在闪存中,您手动分配影片剪辑名称,如果您调用它,则target.name可用。

如何编写Image obj以便我可以控制对象?在doc中有一个id和name的引用作为对象的属性,但是当我设置它们时,它并不适用于我。当然,我可以手动创建每个Kinetic.Image(),但没有那么有趣......特别是191张图片。关于如何解决这个问题的任何提示?

结帐http://jsfiddle.net/jacobsultd/b2BwU/6/以检查和测试脚本。

感谢。

function loadImages(sources, callback) {
var assetDir = 'http://dev.nystixs.com/test/inf/';
var fileExt = '.png';
var images = {};
var loadedImages = 0;
var numImages = 0;
for (var src in sources) {
    numImages++;
}
for (var src in sources) {

    images[src] = new Image();

    images[src].onload = function () {
        var db = sources[src].toString();

        var dbname = db.slice(-0, -4);


        if (++loadedImages >= numImages) {
            callback(images, dbname);
        }
    };
    images[src].src = assetDir + sources[src];
    //images[src].src = assetDir+sources[src]+".png";

}

}

function initStage(images,db){

var shapesLayer = new Kinetic.Layer();
var messageLayer = new Kinetic.Layer();


//Loading Images

var xpos = 0;
var ypos = 200;
for (var i in images) {
    var glvP = i.slice(0, 3);
    db = new Kinetic.Image({
        image: images[i],
        x: xpos,
        y: ypos
    });

    if (glvP == "wlt") {
        shapesLayer.add(db);
        db.setPosition(186.95, 7.00);

        //db.hide();
        shapesLayer.draw();
    } else if (glvP == "lin") {

        shapesLayer.add(db);
        db.setPosition(204.95, 205.00);
    } else if (glvP == "plm") {
        shapesLayer.add(db);
        db.setPosition(311.95, 6.00);
    } else if (glvP == "web") {
        shapesLayer.add(db);
        db.setPosition(315.95, 7.00);
    } else if (glvP == "lce") {
        shapesLayer.add(db);
        db.setPosition(162.95, 3.00);
    } else if (glvP == "thb") {
        shapesLayer.add(db);
        db.setPosition(63.00, 28.60);
    } else if (glvP == "bfg") {
        shapesLayer.add(db);
        db.setPosition(167.95, 7.00);
    } else if (glvP == "wst") {
        shapesLayer.add(db);
        db.setPosition(208.95, 234.00);
    } else if (glvP == "fpd") {
        shapesLayer.add(db);
        db.setPosition(252.95, 82.00);
    } else if (glvP == "bac") {
        shapesLayer.add(db);
        db.setPosition(0, 0);
    } else if (glvP == "bnd") {
        shapesLayer.add(db);
        db.setPosition(196.95, 164.00);
    } else {}


    var rect = new Kinetic.Rect({
        x: 710,
        y: 6,
        stroke: '#555',
        strokeWidth: 5,
        fill: '#ddd',
        width: 200,
        height: 325,
        shadowColor: 'white',
        shadowBlur: 10,
        shadowOffset: [5, 5],
        shadowOpacity: 0.2,
        cornerRadius: 10
    });
    shapesLayer.add(rect);


    // End of Glove Parts Tabs

    //Load Color Buttons

    if (glvP == "wht") {

        xpos = -5.00;
        bpos = 375;
        var zpos = -5.00;
        var tpos = -5.00;
        db.setPosition(xpos, bpos);
        //shapesLayer.add(db);

        var n = 0;
        for (n = 0; n < 12; n++) {
            if (n < 4) {
                var glvB = "wht" + n;
                var btn = glvB;

                glvB = new Kinetic.Image({
                    image: images[i],
                    width: 18,
                    height: 18,
                    id: 'wht0'
                });

                glvB.on('mouseout', function () {
                    blankText('');
                });
                glvB.on('mouseover', function () {
                    writeColors('White', btn);
                });
                glvB.on('click', function () {
                    console.log(glvB + " clicked");
                    wht.hide();
                    shapesLayer.draw();
                });

                glvB.setPosition((xpos + 20), bpos);
                shapesLayer.add(glvB);
                xpos = (xpos + 230);

            }

-AJ

1 个答案:

答案 0 :(得分:0)

您可以使用.png图片文件名自动执行彩色按钮编码工作。

无需手动编码10个手套组件X每个组件21种颜色(210个颜色按钮)。

假设您已拆分每个图像网址(文件名)以获取颜色和手套类型。

然后,您可以使用一段可重复使用的代码创建所有210个颜色按钮。

演示:http://jsfiddle.net/m1erickson/H5FDc/

enter image description here

示例代码:

// Usage:

addColorButton(100,100,"red","fingers");

// 1 function to add 210 color-buttons

function addColorButton(x,y,color,component){

    // create this button

    var button=new Kinetic.Image({
        x:x,
        y:y,
        image: imageArray[ color+"-color-button" ],        
    });

    // save the color as a property on this button

    button.gloveColor=color;

    // save the glove component name as a property on this button

    button.gloveComponent=component; // eg, "fingers"

    // resuable click handler
    // Will change the gloves "#fingers" to "red-fingers-image"

    button.on("click",function(){

        // eg. get the image "red-fingers-image"
        var newImage = imageArray[this.gloveColor+"-"+this.gloveComponent+"-image"];

        // eg. get the Kinetic.Image with  id:”finger” 
        var glovePart = layer.find("#"+this.gloveComponent”][0];

        // change the Kinetic id:finger’s image
        // to the red-fingers-image
        glovePart.setImage(newImage);

        layer.draw();
    });

    layer.add(button);
}