Kinetic.js Анимация нескольких групп, содержащих фигуру и текст

Я новичок в Kinetic.js. Я пытаюсь создать серию случайно движущихся групп, каждая из которых содержит одну звезду и заголовок. Вот текущий скетч: http://jsfiddle.net/dCw9e/.

Я не могу понять, почему каждый объект группы имеет уникальный набор границ в анимации. Может ли кто-нибудь пролить свет на то, что мне здесь не хватает? Почему границы для каждой группы не одинаковы? то есть границы родительского контейнера.

Это анимация:

var anim = new Kinetic.Animation (функция (кадр) {

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

}, это.starsLayer); аним.старт();

Спасибо, Джон


person user2517788    schedule 06.11.2013    source источник


Ответы (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]);

    }
person markE    schedule 06.11.2013
comment
Большое спасибо! Когда вы говорите, что происхождение всех ваших групп — их x/y — относительно сцены, правильно ли я предполагаю, что вы имеете в виду, что точка 0, 0 каждой группы должна быть выровнена с точкой 0, 0 сцены? Для меня это нелогично, потому что точка 0, 0 каждой группы странным образом компенсируется разницей в атрибутах x, y каждой группы ... не могу понять, почему это происходит ... есть мысли? - person user2517788; 07.11.2013
comment
Да, groups[0]{x:0,y:0} находится на этапе[0,0]. Итак, ваши группы[0]{x:16,y:16} находятся на стадии[16,16]. Все внутри groups[0] начнется со stage[16,16] плюс их собственные x,y. Например, прямоугольник внутри group[0] с собственным прямоугольником x:20,y:30 будет находиться на этапе[16+20,16+30]. - person markE; 07.11.2013
comment
Итак, в моей анимации, когда я звоню: - person user2517788; 07.11.2013
comment
упс, когда я звоню, groups[j].setX(groups[j].getX() + xvel[j]); groups[j].setY(groups[j].getY() + yvel[j]); разве это не должно перемещать группы в пределах границы сцены, чтобы каждый из их «потолков» был стадией? - person user2517788; 07.11.2013