Метка над телом в Phaser

У меня есть массив с тел. Для каждого из них я хочу поставить метку с некоторой информацией. У меня получилось, но когда я их поворачиваю, этикетка тоже поворачивается.

// Main body
players[id] = game.add.sprite(game.world.randomX, 200, sprite, sprite_ini);
game.physics.p2.enable(players[id]);

players[id].animations.add('walk', [1,2,3,4], 10, true);
players[id].animations.add('stand', [0], 0, true);
players[id].animations.add('jump', [5], 0, true);

// Add weapon
bazuca = game.add.sprite(0, 0, 'bazuca');
players[id].addChild(bazuca);

// Labels   
players[id].body.label_nome = game.add.text(
        -35, 
        -55, 
        "Info", 
        { font: "bold 14px Arial", fill: color});
players[id].addChild(players[id].body.label_nome);

И они обращаются с

players[id].scale.x = -1; 

Анимация крутится и работает отлично, оружие тоже крутится и остается на месте, но метка тоже крутится. Как я могу этого избежать? Этикетка должна двигаться вместе с корпусом, но не поворачиваться.


person Moisés    schedule 28.04.2015    source источник
comment
Группы предназначены для масштабирования, вращения и перемещения, как если бы вы имели дело с одним спрайтом. Я бы попробовал три вещи: первый вариант - повернуть группу, как вы делаете сейчас, затем повернуть текст только один раз; второй вариант - вращать каждый дочерний элемент (кроме текста) отдельно; третий - иметь текст вне группы и обновлять его положение вручную.   -  person Kamen Minkov    schedule 29.04.2015
comment
Мне больше всего понравился третий, мне обновить позицию в функции обновления или с помощью какого-то обратного вызова? обратный вызов кажется лучше, но есть ли обратный вызов изменения положения тела? хе-хе   -  person Moisés    schedule 29.04.2015


Ответы (2)


Я вижу два решения:

  • Камена Минкова, т.е. хранить метки вне групп и обновлять их положение на каждом кадре (похоже, нет сигнала "onMove" или что-то в этом роде).
  • Поскольку вы используете P2, вы можете активировать физику меток, установить для них «body.fixedRotation = true» и создать ограничение между каждой меткой и каждым спрайтом, чтобы метки следовали за спрайтами.

Второе решение кажется более элегантным и удобным в сопровождении, но с точки зрения производительности первое, вероятно, лучше.

person Marwane K.A.    schedule 30.04.2015

Если вы установите метку на то же значение x, что и элемент, который она маркирует, а значение y метки будет меньше, чем у объекта. Вот пример кода:

//in create():
label.anchor.setTo(.5, .5); /*sets positioning to center. 
You need to make sure that arcade physics are applied to label*/

//in update():
label.x = object.x;
label.y = object.y - 60; 
//change the 60 to whatever looks good to you when running.

Чтобы применить аркадную физику:

//in create():
game.physics.startSystem(Phaser.Physics.ARCADE); // do this once 
game.physics.enable(label/*change this to what you want the physics to apply to*/, Phaser.Physics.ARCADE);

Надеюсь это поможет.

person Andrew Feldman    schedule 24.05.2017