phina.jsでモンストっぽいゲームを作る【１】ーステージ背景とプレイヤーの配置ー

# はじめに
**phina.js**でモンストもどきを作るという試みの第１回です。
まずはステージ背景とプレイヤーの配置までを実装しようと思います。

# ステージ背景
モンストといえば、草原っぽい背景が印象にありますので、以下のような適当に作った画像を背景として用意しました。
サイズは、**phina.js**のデフォルトの画面サイズである**640x960**にしています。

![bg.png](https://qiita-image-store.s3.amazonaws.com/0/67114/f00fffb7-e577-2745-ba91-5fa8a595ee18.png)

## 画像の読み込み
背景画像はアセットとして、以下のように指定します。

```js
// アセット
var ASSETS = {
  // 画像
  image: {
    'bg': 'https://rawgit.com/alkn203/piko_strike/master/assets/bg.png',
  },
};
```

そして、**main**関数で以下のように読み込みます。

```js
/*
 * メイン処理
 */
phina.main(function() {
  // アプリケーションを生成
  var app = GameApp({
    title: 'Piko Strike',
    // アセット読み込み
    assets: ASSETS,
  });
```

## 背景表示
背景画像はスプライトとしてシーンに追加します。

```js
    // 背景
    Sprite('bg').addChildTo(this)
                .setPosition(this.gridX.center(), this.gridY.center());
  },
});
```
* **Sprite**クラスのコンストラクタには、アセット定義で指定した文字列を引数として与えています。
* 画像は画面と同じサイズにしたので、位置はグリッドを使って画面中央に指定しています。
* グリッドについては、少し古い記事ですが[【phina.js】Gridクラスを使いこなそう](https://qiita.com/alkn203/items/d176a10d4e38d15e4062)を参考にして下さい。

# プレイヤーの配置
## 画像の読み込み
プレイヤー画像はアセットとして、以下のように追加します。

```js
// アセット
var ASSETS = {
  // 画像
  image: {
    'bg': 'https://rawgit.com/alkn203/piko_strike/master/assets/bg.png',
    'tomapiko': 'https://rawgit.com/phinajs/phina.js/develop/assets/images/tomapiko.png',
  },
};

```

プレイヤーはもちろん、おなじみのキャラです。

![tomapiko.png](https://rawgit.com/phinajs/phina.js/develop/assets/images/tomapiko.png)

## プレイヤークラスの作成
プレイヤーの配置の前に**Sprite**クラスを継承した**Player**クラスを定義します。

```js
/*
 * プレイヤークラス
 */
phina.define("Player", {
  // 継承
  superClass: 'Sprite',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit('tomapiko');
  },
});
```

**superInit**で、親クラス**Sprite**のコンストラクタにアセット文字列を与えています。

### シーンに追加
シーンへの追加は、背景画像を追加した時と基本的に同じです。

```js
    // プレイヤー
    this.player = Player().addChildTo(this);
    this.player.setPosition(this.gridX.center(), this.gridY.span(15));
```

**Player**クラスを呼び出せば、クラス内部でスプライトの設定が行われます。

## 動作確認

![monst-tut-02.gif](https://qiita-image-store.s3.amazonaws.com/0/67114/62bb3a07-99b8-b2c1-3f92-95dff655b645.gif)

[[runstantプロジェクトへのリンク]](http://runstant.com/alkn203/projects/4ae3cf8b)

まだこの段階では、背景の上にプレイヤーが表示されるだけです。

## 全体コード
```js
// グローバルに展開
phina.globalize();
// アセット
var ASSETS = {
  // 画像
  image: {
    'bg': 'https://rawgit.com/alkn203/piko_strike/master/assets/bg.png',
    'tomapiko': 'https://rawgit.com/phinajs/phina.js/develop/assets/images/tomapiko.png',
  },
};
// 定数
var SCREEN_WIDTH = 640;
var SCREEN_HEIGHT = 960;
/*
 * メインシーン
 */
phina.define("MainScene", {
  // 継承
  superClass: 'DisplayScene',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit();
    // 背景
    Sprite('bg').addChildTo(this)
                .setPosition(this.gridX.center(), this.gridY.center());
    // プレイヤー
    this.player = Player().addChildTo(this);
    this.player.setPosition(this.gridX.center(), this.gridY.span(15));
  },
});
/*
 * プレイヤークラス
 */
phina.define("Player", {
  // 継承
  superClass: 'Sprite',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit('tomapiko');
  },
});
/*
 * メイン処理
 */
phina.main(function() {
  // アプリケーションを生成
  var app = GameApp({
    title: 'Piko Strike',
    // アセット読み込み
    assets: ASSETS,
  });
  // 実行
  app.run();
});
```

# 次回予定
次回は、プレイヤーを引っ張った時に表示される矢印を実装したいと思います。