manmanrai’s diary

新米フロントエンジニアの勉強記録ブログ

Pixi.js でパララックススクローラーを作ってみる【第二回】

前回の話

前回は二枚の画像を重ねさせ、動かしました。
今回はそれの進化型です。

Building a Parallax Scroller with Pixi.js: Part 2

構造の理解

前回に出てきた二種類スプライト、スプライトとタイリングスプライトなんですが、どちらもwidth, height, alpha, positionなどの設定できます。しかもどちらもaddChild function使って、containerの中に簡単に入れることできます。

承継(しょうけい)のルール通用しますので、それがこんな感じで引き継ぐらしいです。 f:id:manmanrai:20170429135631p:plain

承継を利用したプロトタイプ作成

前回tilingSpriteを作る時何回も重複したコードは:

// 画像を読み込む
var farTexture = PIXI.Texture.fromImage("resources/bg-far.png");  

// タイリングスプライトとして貼り付ける
far = new PIXI.extras.TilingSprite(farTexture, 512, 256);

// タイリングスプライトの位置を決める
far.position.x = 0;
far.position.y = 0;

// タイルを貼る位置を決める
far.tilePosition.x = 0;
far.tilePosition.y = 0;

// コンテナに追加する
stage.addChild(far);

という流れでした。 この流れをプロトタイプとして、カスタマイズできるように独立させ

far = new Far();
stage.addChild(far);

これが今回の目標です。

スタート

まず、function Farを作成します。

function Far(texture, width, height) {
  PIXI.extras.TilingSprite.call(this, texture, width, height);
}

そして、このfunction Farの次に原型(どこから引き継いて来たなのか)を表記します。

Far.prototype = Object.create(PIXI.extras.TilingSprite.prototype);

それでsetupの中身をこういう風に書き換えられます。

  var farTexture = PIXI.Texture.fromImage("resources/bg-far.png");

  // far = new PIXI.extras.TilingSprite(farTexture, 512, 256);
  far = new Far(farTexture, 512, 256);

  far.position.x = 0;
  far.position.y = 0;
  far.tilePosition.x = 0;
  far.tilePosition.y = 0;
  stage.addChild(far);

次は位置の設定もfunction Farに入れときます。

function Far(texture, width, height) {
  PIXI.extras.TilingSprite.call(this, texture, width, height);

  this.position.x = 0;
  this.position.y = 0;
  this.tilePosition.x = 0;
  this.tilePosition.y = 0;
}

そうしたら、

  var farTexture = PIXI.Texture.fromImage("resources/bg-far.png");

  // far = new PIXI.extras.TilingSprite(farTexture, 512, 256);
  far = new Far(farTexture, 512, 256);

  // far.position.x = 0;
  // far.position.y = 0;
  // far.tilePosition.x = 0;
  // far.tilePosition.y = 0;
  stage.addChild(far);

コメントアウトした部分もいらないので、setupの中で3行で終わらせます。
最後に、このfarプロトタイプはbg-far.pngを呼び出すために存在するので、いっそう最初の読み込み入れれば良いです。
widthとheightも同時に指定します。

function Far(texture, width, height) {
  var texture = PIXI.Texture.fromImage("resources/bg-far.png");
  PIXI.extras.TilingSprite.call(this, texture,512, 256));

  this.position.x = 0;
  this.position.y = 0;
  this.tilePosition.x = 0;
  this.tilePosition.y = 0;
}

で、setup内に はこうなります。

  far = new Far();
  stage.addChild(far);

farを設置するコードは2行で済ませました。
次はmidにも同じようなことを。

function Mid() {
  var texture = PIXI.Texture.fromImage("resources/bg-mid.png");
  PIXI.extras.TilingSprite.call(this, texture, 512, 256);

  this.position.x = 0;
  this.position.y = 128;
  this.tilePosition.x = 0;
  this.tilePosition.y = 0;
}

Mid.prototype = Object.create(PIXI.extras.TilingSprite.prototype);

setup function:

mid = new Mid();
stage.addChild(mid);

そして、update function内のコードもまとめて整理しましょう。

function update(){
  far.tilePosition.x -= 0.128;
  mid.tilePosition.x -= 0.64;

  renderer.render(stage);
  requestAnimationFrame(update);
}

そこのtilePositionをfunction Farの原型のところに追加します。

function Far(){
  // ここ省略します。
}
Far.prototype = Object.create(PIXI.extras.TilingSprite.prototype);
Far.prototype.update = function() {
  this.tilePosition.x -= 0.128;
};

midにも同じ作業書き換えます。

最後の本体のupdate functionはこうなります。

function update() {
  far.update();
  mid.update();

  renderer.render(stage);

  requestAnimFrame(update);
}

f:id:manmanrai:20170429201417p:plain 動作確認してみたら、動き大丈夫そうですね。 チュートリアルのpart2意外に長くなりそうなので、一旦ここで切らせていただきます。
では、また次回にで。