Pixi.js: Сортируемые дисплеи

Созданный на 29 авг. 2013  ·  12Комментарии  ·  Источник: pixijs/pixi.js

Иногда нам нужно, чтобы этот экранный объект отображался в определенном порядке, чтобы сохранить z-index.

было бы хорошо, если бы у нас был способ выбрать порядок рисованных дочерних элементов, даже с помощью метода сортировки или путем разрешения отдельного метода повторения для отдельных объектов DisplayObject, чтобы разработчик мог создавать упорядоченный список, перебирать объекты и отображать их .

🤔 Question

Самый полезный комментарий

var mapContainer = new PIXI.DisplayObjectContainer(),
    unitsContainer = new PIXI.DisplayObjectContainer(),
    menuContainer = new PIXI.DisplayObjectContainer();

mapContainer.zIndex = 5;
unitsContainer.zIndex = 10;
menuContainer.zIndex = 20;

/* adding children, no matter in which order */
stage.addChild(mapContainer);
stage.addChild(menuContainer);
stage.addChild(unitsContainer);

/* call this function whenever you added a new layer/container */
stage.updateLayersOrder = function () {
    stage.children.sort(function(a,b) {
        a.zIndex = a.zIndex || 0;
        b.zIndex = b.zIndex || 0;
        return b.zIndex - a.zIndex
    });
};

stage.updateLayersOrder();

Все 12 Комментарий

Порядок объектов в массиве children - это порядок, в котором они будут отображаться. Это означает, что последний в массиве будет отображаться «сверху».

теперь чувствую себя немножко тупым xD
при чтении исходного кода я увидел связанный список в renderDisplayObject и подумал, что в этом выпуске нет массива stage.children ....
неважно, он отлично работает с stage.children sort :)

кстати, производительность 1.3.0 просто потрясающая! Я заканчиваю небольшой код для тестирования материалов WebGL на cocoonjs

благодарю вас :)

Не проблема, рад, что PIXI работает для вас!

var mapContainer = new PIXI.DisplayObjectContainer(),
    unitsContainer = new PIXI.DisplayObjectContainer(),
    menuContainer = new PIXI.DisplayObjectContainer();

mapContainer.zIndex = 5;
unitsContainer.zIndex = 10;
menuContainer.zIndex = 20;

/* adding children, no matter in which order */
stage.addChild(mapContainer);
stage.addChild(menuContainer);
stage.addChild(unitsContainer);

/* call this function whenever you added a new layer/container */
stage.updateLayersOrder = function () {
    stage.children.sort(function(a,b) {
        a.zIndex = a.zIndex || 0;
        b.zIndex = b.zIndex || 0;
        return b.zIndex - a.zIndex
    });
};

stage.updateLayersOrder();

Дочерний массив: readonly

@glebmachine не означает, что вы не можете вызвать "сортировку"

@tengotengo Спасибо! Ваше решение простое, но элегантное.

Действительно ли решение @tengotengo является окончательным решением для этого? Мне кажется, что возможность изменить z-index является основной функцией. Представьте себе, что в изометрической игре, где в зависимости от вашей оси Y один спрайт может рассматриваться позади или перед другим спрайтом. Выполнение z-index - традиционный способ справиться с этим, и в этом случае вы просто сопоставите нижнюю позицию y спрайтов с их z-index и готово. Сейчас я сделаю хак сортировки, но, похоже, у этого должно быть официальное решение.

@bluefeet Взгляните на https://github.com/pixijs/pixi-display
Я думаю, это даст вам необходимую функциональность

Если вы ищете эту функцию в 2017 году; в Pixi это реализовано как zOrder.

https://pixijs.github.io/examples/#/display/zorder.js

@loadedsith pixi-display обновлен до последней версии, переписан на TS, и на этой неделе выйдет огромный патч с множеством примеров.

Этот поток был автоматически заблокирован, поскольку после его закрытия в последнее время не было никаких действий. Пожалуйста, откройте новую проблему для связанных ошибок.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

finscn picture finscn  ·  3Комментарии

readygosports picture readygosports  ·  3Комментарии

softshape picture softshape  ·  3Комментарии

Makio64 picture Makio64  ·  3Комментарии

Darker picture Darker  ·  3Комментарии