Phaser 3 : depthで重なり順の制御

今回はDepthを使って重なり順を制御してみます。

Depth

Phaser2ではグループそのものとグループ内でのスプライトをソートすることによって重なり順を制御していましたが、Phaser3からはDepthを使って簡単に重なり順制御を行えるようになりました。


まずy座標とDepthを連動させたスプライトを作ります。

for (let i = 0; i < 10; i++) {
    let block= this.add.sprite(300, 100 + i * 32, "block");
    block.setTint(0x111111 * i);
    block.depth = block.y;
}

次にy座標に応じてDepthを変えるプレイヤーオブジェクトを作成します。

create() {
    this.player = this.add.graphics({ fillStyle: { color: 0xaa1111 } });
    this.player.fillRectShape(new Phaser.Geom.Rectangle(280, 0, 40, 40));
~~~
    this.input.keyboard.on('keydown_UP', ()=> {
        this.player.y -= 5;
    });

    this.input.keyboard.on('keydown_DOWN', ()=> {
        this.player.y += 5;

    });

}

update() {
    this.player.depth = this.player.y+20;
}

実行結果がこちらです。 f:id:Phaser_3:20190116140114g:plain

移動しながら重なり順が切り替わっているのがわかると思います。
Phaser2では重ね順に相当する変数を自分でつけてsortを実行する必要があったのですが、phaser3ではdepthを変更するだけで自動で重なり順を変えて描画してくれます。
今回のソースはこちらです。

/// <reference path="../app.ts" />

namespace MyGame {


    export class MyScene1 extends Phaser.Scene {

        //グラフィックオブジェクトを用意
        public player: Phaser.GameObjects.Graphics;

        constructor() {
            super({ key: 'MyScene1', active: false });
        }

        preload() {
            this.load.image("block", "assets/images/block1.png");
        }

        create() {
            this.player = this.add.graphics({ fillStyle: { color: 0xaa1111 } });
            this.player.fillRectShape(new Phaser.Geom.Rectangle(280, 0, 40, 40));

            this.cameras.main.setBackgroundColor(0xffffff);

            for (let i = 0; i < 10; i++) {
                let block= this.add.sprite(300, 100 + i * 32, "block");
                block.setTint(0x111111 * i);
                block.depth = block.y;
            }

            this.input.keyboard.on('keydown_UP', ()=> {
                this.player.y -= 5;
            });

            this.input.keyboard.on('keydown_DOWN', ()=> {
                this.player.y += 5;
            });
        }
        update() {
            this.player.depth = this.player.y+20;
        }
    }
}