需要があるかどうか分かりませんが作ってみました。
プロジェクト作成時のテンプレートです。
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] でも可能なようです。
コメント