Open14

JavaScriptゲームエンジン Phaser 調査

naga3naga3

JavaScriptゲームエンジン調査

Phaser

公式サイト https://phaser.io/
リポジトリ https://github.com/photonstorm/phaser Star 31.2k
Wikipedia https://en.wikipedia.org/wiki/Phaser_(game_framework)

活発に開発が行われている。

phina.js

公式サイト http://phinajs.com/
リポジトリ https://github.com/phinajs/phina.js Star 288
Wikipedia https://ja.wikipedia.org/wiki/Phina.js

日本製。最新版は 2016/4/21

Kiwi.js

公式サイト https://www.kiwijs.org/
リポジトリ https://github.com/gamelab/kiwi.js Star 1.2k

最新版は 2015/11/16

enchant.js

公式サイト 消滅
Wikipedia https://ja.wikipedia.org/wiki/Enchant.js

事実上開発が停止している。

naga3naga3

Introduction

https://phaser.io/tutorials/getting-started-phaser3/index
直接HTMLを起動すると file:// で動作するため、ブラウザで大幅な制限がかけられる。
画像・音声ファイル・JSONなどのリソースをセキュリティに引っかからないように読み込むために、まずWebサーバーを立ち上げる。

とりあえず有名な http-server を使う。

npm install -D http-server

Download

https://phaser.io/download/stable

npm install phaser@3.55.2
naga3naga3

Hello World

https://phaser.io/tutorials/getting-started-phaser3/part5

<!DOCTYPE html>
<html>
<head>
    <script src="node_modules/phaser/dist/phaser.js"></script>
</head>
<body>

    <script>
    var config = {
        type: Phaser.AUTO,
        width: 800,
        height: 600,
        physics: {
            default: 'arcade',
            arcade: {
                gravity: { y: 200 }
            }
        },
        scene: {
            preload: preload,
            create: create
        }
    };

    var game = new Phaser.Game(config);

    function preload ()
    {
        this.load.setBaseURL('http://labs.phaser.io');

        this.load.image('sky', 'assets/skies/space3.png');
        this.load.image('logo', 'assets/sprites/phaser3-logo.png');
        this.load.image('red', 'assets/particles/red.png');
    }

    function create ()
    {
        this.add.image(400, 300, 'sky');

        var particles = this.add.particles('red');

        var emitter = particles.createEmitter({
            speed: 100,
            scale: { start: 1, end: 0 },
            blendMode: 'ADD'
        });

        var logo = this.physics.add.image(400, 100, 'logo');

        logo.setVelocity(100, 200);
        logo.setBounce(1, 1);
        logo.setCollideWorldBounds(true);

        emitter.startFollow(logo);
    }
    </script>

</body>
</html>
naga3naga3

Making your first Phaser 3 game

https://phaser.io/tutorials/making-your-first-phaser-3-game/part1

boilerplate

var config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    scene: {
        preload: preload,
        create: create,
        update: update
    }
};

var game = new Phaser.Game(config);

function preload ()
{
}

function create ()
{
}

function update ()
{
}

GameConfig

https://photonstorm.github.io/phaser3-docs/Phaser.Types.Core.html#.GameConfig

type: Phaser.AUTO はWEBGLがあればそれを使ってくれて、なければCANVASを使う。

Scene

https://photonstorm.github.io/phaser3-docs/Phaser.Scene.html

preload, create, update 関数内での this は Scene オブジェクトを指す。

naga3naga3

Part 5 - Ready Player One

https://phaser.io/tutorials/making-your-first-phaser-3-game/part5

this.physics.add.sprite(100, 450, 'dude');
左上から (100, 450) の位置にPhysics Spriteを追加する。デフォルトでDynamic Physicsボディとなる。

setBounce は跳ね返り係数を設定する。1でフルに跳ね返る。

this.anims.create でアニメーション設定。spritesheetの何番目やフレームレートなどを指定。

naga3naga3

Part 6 - Body Velocity: A world of physics

https://phaser.io/tutorials/making-your-first-phaser-3-game/part6

物理システムは Arcade Physics, Impact Physics, Matter.js Physics などがある。
Arcade Physicsはコンパクトで軽量。

Physics Spriteを作成するとArcade Physics Bodyへの参照となるbodyプロパティが生える。

player.body.setGravityY(300)
configのgravityは世界全体の重力。それにplayerの重力を追加する感じ。

this.physics.add.collider(player, platforms);
衝突判定する。platformsは地面全体を含んだstaticGroupなので、地面全体と衝突判定できる。

naga3naga3

Part 7 - Controlling the player with the keyboard

https://phaser.io/tutorials/making-your-first-phaser-3-game/part7

cursors = this.input.keyboard.createCursorKeys();
ビルトインのカーソルキーマネージャを使う。

update が毎フレームのループ。
setVelocityX, setVelocityY で速度設定。

player.body.touching.down で下の地面に触れているかをチェックできる。

naga3naga3

Part 8 - Stardust

https://phaser.io/tutorials/making-your-first-phaser-3-game/part8

stars.children.iterate
startsグループで繰り返しの処理を書ける。ここではランダムに跳ね返りを設定している。

this.physics.add.overlap(player, stars, collectStar, null, this);
プレイヤーと星が重なったときにcollectStar関数を呼び出す。 disableBody で星を消す。