Phaser 3 разные ограничительные рамки в атласе - PullRequest
0 голосов
/ 14 ноября 2018

Возможно ли в Phaser 3 определить ограничивающую рамку для каждого спрайтового кадра в атласе?Когда я генерирую спрайт-лист в TexturePacker, мы можем найти некоторые параметры в .json:

"idle-0001.png":
{
   "frame": {"x":1,"y":1,"w":423,"h":619},
   "rotated": false,
   "trimmed": false,
   "spriteSourceSize": {"x":1,"y":1,"w": 423,"h":619,
   "sourceSize": {"w":423,"h":619}
}

и моем определении спрайта:

this.sprite = scene.physics.add.sprite(x,y,'player-idle','idle-0001.png');
this.sprite.setCollideWorldBounds(true);

Когда я изменяю spriteSourceSize или sourceSize, онничего не меняет на моем спрайте это нормально?

это довольно странно, потому что метод setSize хорошо меняет ограничивающий прямоугольник.В реализации setSize sourceSize является обновлением, поэтому я думаю, что можно напрямую установить ограничивающий прямоугольник с атласом .json?

/**
 * Sizes and positions this Body's boundary, as a rectangle.
 * Modifies the Body `offset` if `center` is true (the default).
 * Resets the width and height to match current frame, if no width and height provided and a frame is found.
 *
 * @method Phaser.Physics.Arcade.Body#setSize
 * @since 3.0.0
 *
 * @param {integer} [width] - The width of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame width.
 * @param {integer} [height] - The height of the Body in pixels. Cannot be zero. If not given, and the parent Game Object has a frame, it will use the frame height.
 * @param {boolean} [center=true] - Modify the Body's `offset`, placing the Body's center on its Game Object's center. Only works if the Game Object has the `getCenter` method.
 *
 * @return {Phaser.Physics.Arcade.Body} This Body object.
 */
setSize: function (width, height, center)
{
    if (center === undefined) { center = true; }

    var gameObject = this.gameObject;

    if (!width && gameObject.frame)
    {
        width = gameObject.frame.realWidth;
    }

    if (!height && gameObject.frame)
    {
        height = gameObject.frame.realHeight;
    }

    this.sourceWidth = width;
    this.sourceHeight = height;

    this.width = this.sourceWidth * this._sx;
    this.height = this.sourceHeight * this._sy;

    this.halfWidth = Math.floor(this.width / 2);
    this.halfHeight = Math.floor(this.height / 2);

    this.updateCenter();

    if (center && gameObject.getCenter)
    {
        var ox = gameObject.displayWidth / 2;
        var oy = gameObject.displayHeight / 2;

        this.offset.set(ox - this.halfWidth, oy - this.halfHeight);
    }

    this.isCircle = false;
    this.radius = 0;

    return this;
}
...