Как я могу масштабировать размер спрайта в Phaser/PixiJS без изменения его положения?

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

create() {
    //Create the sprite group and scale it down to 30%
    this.pieces = this.add.group(undefined, "pieces", true);
    this.pieces.scale.x = 0.3;
    this.pieces.scale.y = 0.3;

    //Add the players to the middle of the stage and add them to the 'pieces' group
    var middle = new Phaser.Point( game.stage.width/2, game.stage.height/2);
    var player_two = this.add.sprite(middle.x - 50, middle.y, 'image1', undefined, this.pieces);
    var player_one = this.add.sprite(middle.x, middle.y-50, 'image2', undefined, this.pieces);
}

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

Как мне масштабировать изображение спрайта, не влияя на его местоположение?

(Код, кстати, в Typescript, но я думаю, что этот конкретный пример также является javascript, так что это, вероятно, не имеет значения)

3 ответа

Установите для Sprite.anchor значение 0,5, чтобы физическое тело находилось в центре спрайта, масштабируйте изображение спрайта, не влияя на его местоположение.

this.image.anchor.setTo(0.5, 0.5);

Если я масштабирую спрайт, например, так:

  var scaleX = 2;
  var scaleY = 2;    
  sprite.scale.set(scaleX , scaleY );

тогда мне нужен этот масштабный коэффициент для расчета положения спрайта:

 var positionX = 100;
 var positionY = 100;

 sprite.x = positionX / scaleX;
 sprite.y = positionY / scaleY;

Таким образом, ваш спрайт будет в позиции (100,100). Проблема в том, что sprite.x автоматически умножается на ваш scaleX.

Извините за мой английский:)

Что касается Phaser, я хотел бы добавить, что в конкретном случае оружия. Пуль или других групп, которые вы создаете сами, вам придется делать это следующим образом:

weapon.bullets.setAll('scale.x', 0.5);
weapon.bullets.setAll('scale.y', 0.5);

Я застрял на этом и оказался в этой теме, которая закрыта, но в моем случае просто не то, что мне было нужно. Остальным, надеюсь, будет что-то из этого пригодиться:)

Другие вопросы по тегам