【问题标题】:Kinetic.js Animating Multiple groups that contain a shape and textKinetic.js 为包含形状和文本的多个组设置动画
【发布时间】:2013-11-18 06:03:44
【问题描述】:

我是 Kinetic.js 的新手。我正在尝试创建一系列随机移动的组,每个组都包含一个星和一个标题。这是当前的草图:http://jsfiddle.net/dCw9e/

我不明白为什么每个组对象在动画中都有一组独特的边界。任何人都可以阐明我在这里缺少什么吗?为什么每个组的边界不一样?即父容器的边界。

这是动画:

var anim = new Kinetic.Animation(function(frame) {

newtime = frame.time;

// Acceleration due to gravity via time delay (chunks miliseconds)
if((newtime - oldtime) > framerate) { // every N milliseconds... (this emulated a frame rate)
    oldtime = newtime;

    var angularSpeed = Math.PI / 2;
    var angleDiff = [];


    var stage = MilestonesGame.stage;
    var stageKids = stage.getChildren();
    var starsLayer = stageKids[1];
    var stars = [];
    stars = starsLayer.getChildren();
    //console.log(stars[1].getX());

    for(var n= 0; n < groups.length; n++){
        angleDiff[n] = frame.timeDiff * angularSpeed / 10000 * rotDir[n];
    }   


    for(var j = 0; j < groups.length; j++) {



    /* Bounce stars off all stage parameter boundaries */

    // floor boundary
    if(groups[j].getY() > floor) {groups[j].setY(floor);}
    if(groups[j].getY() == floor) {

     $(window).resize(_.debounce(function(){
        floor = MilestonesGame.stage.getHeight()-7;
     }, 300));

        yvel[j] *= -1;

    }

    //Ceiling boundary
    if(groups[j].getY() < cieling){groups[j].setY(cieling);}
    if(groups[j].getY() == cieling){

        yvel[j] *= -1;

    }
    // right wall
    if(groups[j].getX() > rightwall) {groups[j].setX(rightwall);}
    if(groups[j].getX() == rightwall) {

        $(window).resize(_.debounce(function(){
            rightwall = MilestonesGame.stage.getWidth()-7;
        }, 300));

        xvel[j] *= -1;
    }
    // left wall
    if(groups[j].getX() < leftwall) {groups[j].setX(leftwall);}
    if(groups[j].getX() == leftwall) {

        xvel[j] *= -1;
    }

    groups[j].setX(groups[j].getX() + xvel[j]);                                 
    groups[j].setY(groups[j].getY() + yvel[j]);
    //stars[i].rotate(angleDiff[i]);
    }
}

}, this.starsLayer); 动画.start();

谢谢, 乔恩

【问题讨论】:

    标签: javascript html canvas kineticjs


    【解决方案1】:

    任何组的原点 [x,y] 默认为相对于其父组的 [0,0]。

    在你的情况下,每个组的父母都是舞台。

    所以你所有的组起源——他们的 x/y,都是相对于舞台的。

    一些观察...

    将调整大小的事件处理程序放在任何循环之外(如果在循环内,这是不好的做法)。

    // resizing handler -- never put this in a loop!
    
    $(window).resize(_.debounce(function(){
        rightwall = MilestonesGame.stage.getWidth();
        floor = MilestonesGame.stage.getHeight();
    }, 300));
    

    让你的边界是全尺寸的,这样你以后可以轻松地调整你的星星的大小

    // boundaries -- leave boundaries full width/height
    // which lets you resize each star later
    
    var leftwall = 0;
    var rightwall = MilestonesGame.stage.getWidth();
    var floor = MilestonesGame.stage.getHeight();
    var cieling = 0;
    

    您的边界命中测试可以这样重构以提高性能和清晰度:

    // Bounce stars off all stage parameter boundaries 
    
        for(var j = 0; j < groups.length; j++) {
    
    
        // temp save often used array references in vars
    
        var group=groups[j];
        var x=group.getX();
        var y=group.getY();
        var r=group.getOuterRadius();
    
        // ceiling boundary
    
        if(y-r<=cieling) {
            y=cieling+r;
            yvel[j] *= -1;
        }
    
        // floor boundary
    
        if(y+r>=floor) {
            y=floor-r;
            yvel[j] *= -1;
        }
    
        // left boundary
    
        if(x-r<=leftwall) {
            x=leftwall+r;
            xvel[j] *= -1;
        }
    
        // left and right boundary
    
        if(x+r>=rightwall) {
            x=rightwall-r;
            xvel[j] *= -1;
        }
    
        // move this star
        group.setX(x + xvel[j]);                                    
        group.setY(y + yvel[j]);
    
        }
    

    【讨论】:

    • 非常感谢!当您说“您的所有组的起源 - 他们的 x/y 都与舞台相关”时,我是否正确假设您的意思是每个组的 0、0、点应该与舞台的 0、0 点对齐?这对我来说是违反直觉的,因为每个组的 0、0 点被每个组的 x、y 属性的差异奇怪地抵消了......我无法完全理解为什么会发生这种情况......有什么想法吗?跨度>
    • 是的,groups[0]{x:0,y:0} 位于 stage[0,0]。所以你的组[0]{x:16,y:16} 处于阶段[16,16]。 groups[0] 中的任何内容都将从 stage[16,16] 加上它们自己的 x,y 开始。例如,组[0] 中的矩形具有自己的 x:20,y:30 将处于阶段[16+20,16+30]。
    • 好的,所以,在我调用的动画中:
    • 哎呀,当我打电话时,groups[j].setX(groups[j].getX() + xvel[j]); groups[j].setY(groups[j].getY() + yvel[j]);,不应该在舞台边界内移动组,以便他们的每个“cielings”都是舞台的吗?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-07-29
    • 2016-06-20
    • 2018-12-29
    • 2010-12-18
    • 2014-07-01
    相关资源
    最近更新 更多