javascript - Kinetic.js 对包含形状和文本的多个组进行动画处理

标签 javascript html canvas kineticjs

我是 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();

谢谢, 乔恩

最佳答案

任何组的原点 [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;

为了性能和清晰度,您的边界 HitTest 可以这样重构:

// 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]);

    }

关于javascript - Kinetic.js 对包含形状和文本的多个组进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19821611/

相关文章:

javascript - 为函数原型(prototype)调用 Object.defineProperty 时会发生什么?

javascript - 如何让添加到购物车按钮直接进入购物车

javascript - 如何在 Jquery UI 按钮上添加事件

Javascript 函数作用域与对象作用域

php - 如何防止我的 WordPress 网站中的评论部分横跨全屏?

javascript - 当我想仅显示一个输入字段的错误气泡时,如何正确使用 reportValidity()?

javascript - 使用 html 5 canvas (javascript API) 制作的游戏是开源的吗?

javascript - 在另一种形式周围放置一些形式[已经给出了一些代码]

javascript - Flash Canvas 响应动画大小

Python Tkinter 刷新 Canvas