プロジェクトテンプレート[Phaser3]

Phaser3
この記事は約8分で読めます。

需要があるかどうか分かりませんが作ってみました。

プロジェクト作成時のテンプレートです。

2022/10/09 現在(3.55.2 Ichika)

記述方法は2種類?あるかと思います。

どちらも動くのでどちらを使っても良いと思いますが

将来的にどちらか一つに、、、なるかならないかは不明ですが

私はES6の形式で記述しようかなと考えています。

以下、サンプルコード

テンプレート 1

//変数
let Game = {};
let Data = {};//このサンプルでは使用しません。

//Game Size
Game.width = 360;
Game.height = 480;

var SceneA = new Phaser.Class({

  Extends: Phaser.Scene,

  initialize:

  function SceneA ()
  {
        Phaser.Scene.call(this, { key: 'sceneA' });
  },
	preload:function(){
		this.load.image("samples", "./assets/sample_image.png");
		this.load.image("samples2", "./assets/sample_image2.png");
	},
  create: function ()
  {
		this.hoge="hogehoge";

		let img_obj=this.add.image(100,100,"samples");
		img_obj.setOrigin(0.5,0.5);

		let img_obj2=new SampleImageClass2(this,Game.width/2,Game.height/2,"samples2");
		this.children.add(img_obj2);

		let txt_obj=this.add.text(Game.width/2,Game.height/2+100, 'Phaser3 Test', { fontSize: '16px', fill: '#fff' });
  },
	update:function(){
		console.log(this.hoge);
	},

});

var SampleImageClass2 = new Phaser.Class({

	Extends: Phaser.GameObjects.Image,

	initialize:

	function SampleImageClass2 (my_scene, x, y,images)
	{
			Phaser.GameObjects.Image.call(this, my_scene);

			this.setTexture(images);
			this.setPosition(x, y);
			this.setScale(1);
	},
	preUpdate (time, delta){
	}

});




//config
let config = {
	type: Phaser.AUTO,
	parent: 'canvas',
	width: Game.width,
	height: Game.height,
	pixelArt: true,
	fps: {
		target: 60,// フレームレート
		forceSetTimeOut: true
	},
	scale: {
		autoCenter: [Phaser.Scale.CENTER_BOTH]
	},
	physics: {
        default:'arcade',
        arcade: {
            /*debug: true,*/
			gravity: {
				y: 0
			}
		},

	},
	scene: [SceneA]
};

let game = new Phaser.Game(config);

SampleImageClass2 クラスは Phaser.GameObjects.Imageを継承したカスタムクラスです。

またテンプレート2と共通ですが

configのdebug: true のコメントを外すと当たり判定が発生するオブジェクト(スプライト等)に

四角い枠が表示されます。3.55.2時点でdebug: false にしても表示は消えなかったので

コメントアウトするなどして表示を消す必要があると思います。

ネット上でのサンプルでは上記のサンプルがよく見られます(公式サンプルもこの形式が多い)

テンプレート 2(ES6)

//変数
let Game = {};
let Data = {};//このサンプルでは使用しません。

//Game Size
Game.width = 360;
Game.height = 480;

class SceneA extends Phaser.Scene {

	constructor (config)
	{
			super(config);
	}

	preload ()
	{
		this.load.image('sample', 'assets/sample_image.png');
		this.load.image('sample2', 'assets/sample_image2.png');
	}
	create(){
		this.hoge="hogehoge";

		let img_obj=this.add.image(100,100,"sample");
		let img_obj2=new CustomImages(this,Game.width/2,Game.height/2,"sample2");
		this.children.add(img_obj2);

		let txt_obj=this.add.text(Game.width/2,Game.height/2+100, 'Phaser3 ES6 Test', { fontSize: '16px', fill: '#fff' });

	}

	update ()
	{
		console.log(this.hoge);
	}

}

class CustomImages extends Phaser.GameObjects.Image{

	constructor (my_scene, x, y,images)
	{
			super(my_scene, x, y,images);
//
//引数(hoge)はhoge、constructor関数内の変数はthis
//preUpdate内で引数を使用する場合は
//constructor内で
//this.my_scene=my_scene;など宣言して使う必要がある。
//またJS用の関数のコールバック関数で使用するthisと
//Phaserのthisは異なるので注意。
			//this.my_scene=my_scene;

			this.setTexture(images);
			this.setPosition(x, y);
			
			this.setActive(true);
			this.setVisible(true);

			//my_scene.add.existing(this);
			//my_scene.physics.world.enable(this);
			//my_scene.physics.add.collider(player_obj,this,function(po,eo){
			//}, null, this);	

	}
	preUpdate (time, delta){
	}
}

//config
let config = {
	type: Phaser.AUTO,
	parent: 'canvas',
	width: Game.width,
	height: Game.height,
	pixelArt: true,
	fps: {
		target: 60,// フレームレート
		forceSetTimeOut: true
	},
	scale: {
        //mode:Phaser.Scale.FIT,
		//autoCenter: [Phaser.Scale.CENTER_HORIZONTALLY,Phaser.Scale.CENTER_VERTICALLY]
		autoCenter: [Phaser.Scale.CENTER_BOTH]
	},
	physics: {
        default:'arcade',
        arcade: {
            /*debug: true,*/// スプライトに緑の枠を表示します
			gravity: {
				y: 0
			}
		},

	},
	scene: [SceneA]
};

let game = new Phaser.Game(config);

CustomImages クラス内にmy_scene.add.existing(this);がありますが

this.children.add(img_obj2);を実行しないで、表示させる場合は

コメントアウトを外します。

またGameObjectsクラスはColliderを持たないので

Phaser.Physics.Arcade.Sprite を継承させた後に

my_scene.physics.world.enable(this);で衝突判定を発生差せる必要があるようです。

config内のmode:Phaser.Scale.FIT,でキャンバスを画面にフィットさせることが出来ます。

autoCenter:[Phaser.Scale.CENTER_HORIZONTALLY,Phaser.Scale.CENTER_VERTICALLY]

でも、上下左右中央揃えが可能ですが、

[Phaser.Scale.CENTER_BOTH] でも可能なようです。

テンプレートに使用した画像

コメント

タイトルとURLをコピーしました